<<nobr>>
<<include "UpdateAll">>
<<set $canShowStatsBtn = false>>
<<set $gameSettings.allowSaves = false>>
<<set _q = $quickScene>>
<<if !_q || $interactionNpc == undefined>>
<<goto "AiNpcChat">>
<<else>>
<<if _q.actClip>><<Video _q.actClip>><</if>>
<<ChatMessage _q.actText>>
/* The NPC's line: the regular sex line, replaced by an AI one if it answers in time. */
<<set _qPose = (_q.act == "oral" ? "Oral" : (_q.act == "anal" ? "Anal" : "Vag"))>>
<<set _qNpcLeads = (_q.playerLeads != true)>>
<<set _qExtra = (_q.lick ? "Lick" : (_q.strapOn ? "Strap-on" : ""))>>
<<set _qLine = getPersonalizedSexDialog($interactionNpc, _qNpcLeads, _qPose, "Like", _qExtra)>>
<div class="ai-sex-line"><<Chat $interactionNpc _qLine>></div>
<<if _q.playerCame>>
<<if _q.finishClip>><<Video _q.finishClip>><</if>>
<<ChatMessage _q.finishText>>
<div class="ai-sex-line" hidden><<Chat $interactionNpc "...">></div>
<<set _aiSexInput = {pose: _qPose, npcLeads: _qNpcLeads, extra: _qExtra, sexType: "quickScene", moment: "playerClimax"}>>
<<else>>
<<set _aiSexInput = {pose: _qPose, npcLeads: _qNpcLeads, feeling: "Like", extra: _qExtra, sexType: "quickScene", moment: "turn", stockLine: _qLine}>>
<</if>>
<<done>><<run typeof aiSexTalk === "function" && aiSexTalk(_aiSexInput)>><</done>>
<div class="padding-top">
<div class="btn"><<button "Back to the chat" "AiNpcChat">><<unset $quickScene>><</button>></div>
</div>
<</if>>
<</nobr>><<nobr>>
<<set $canShowStatsBtn = false>>
<<set $gameSettings.allowSaves = false>>
<div class="ai-chat-shell">
<div id="ai-npc-chat-root" class="ai-chat"><div class="options-warning">The chat could not load. Try reloading the page.</div></div>
</div>
<div class="padding-top">
<div class="btn"><<button "Back" "enhanced_interaction_system">><<run typeof aiStopSpeaking === "function" && aiStopSpeaking()>><</button>></div>
</div>
<<done>><<run typeof mountAiNpcChat === "function" && mountAiNpcChat(document.getElementById("ai-npc-chat-root"))>><</done>>
<</nobr>><<nobr>>
<<set $canShowStatsBtn = false>>
<<set $gameSettings.allowSaves = false>>
<div class="ai-chat-shell">
<div id="ai-chat-root" class="ai-chat"><div class="options-warning">The chat could not load. Try reloading the page.</div></div>
</div>
<div class="padding-top">
<div class="btn"><<button "Back" "QuestCharInteraction">><<run typeof aiStopSpeaking === "function" && aiStopSpeaking()>><</button>></div>
</div>
<<done>><<run typeof mountAiQuestChat === "function" && mountAiQuestChat(document.getElementById("ai-chat-root"))>><</done>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<div class="padding-top"></div>
<<ChanceButton "Casual conversation" "Casual_Conversation_Talk" $player $interactionNpc '{Friend: 50, Love: 0, Fear: 0, Lust: 0, CheckResistance: false}' "Casual Conversation" '<<set $fromPhone = true>>'>>
<div class="padding-top">
<div class="btn"><<button "Where are you?" "WhereAreYou">><</button>></div>
</div>
<div class="padding-top">
<<ChanceButton 'Come to me' 'ComeToMe_Phone' $player $interactionNpc '{Friend: 70, Love: 0, Fear: 0, Lust: 0, CheckResistance: false, CheckSexPref: false}' 'ComeToMe'>>
</div>
<div class="padding-top">
<div class="btn"><<button "Leave" "Phone">><<unset $interactionNpc $indexNPC>> <<set $gameSettings.allowSaves = true>><<set $canShowStatsBtn = true>><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<set _loc = $interactionNpc.info.currentLocation>>
<<switch _loc>>
<<case "CollegeHall">>
<<set _msg = "I'm in the college hall">>
<<case "Auditorium">>
<<set _msg = "I'm in the auditorium">>
<<case "WomensRestroom">>
<<set _msg = "I'm in the college restroom">>
<<case "MensRestroom">>
<<set _msg = "I'm in the college restroom">>
<<case "Campus">>
<<set _msg = "I'm in the campus">>
<<case "Mall">>
<<set _msg = "I'm in the mall">>
<<case "RedLightDistrict">>
<<set _msg = "I'm in the red-light district">>
<<case "GiftShop">>
<<set _msg = "I'm in the gift shop">>
<<case "Pharmacy">>
<<set _msg = "I'm in the pharmacy">>
<<case "Grocery">>
<<set _msg = "I'm in the grocery">>
<<case "FitnessClub">>
<<set _msg = "I'm in the gym">>
<<case "Park">>
<<set _msg = "I'm in the park">>
<<case "ParkRestrooms">>
<<set _msg = "I'm in the park restroom.">>
<<case "ClothingStore">>
<<set _msg = "I'm in the park clothing store">>
<<case "SexShop">>
<<set _msg = "I'm in the park sex shop">>
<<default>>
<<set _msg = "I'm walking around the city.">>
<</switch>>
<<Chat $interactionNpc _msg>>
<div class="padding-top">
<div class="btn"><<button "Back" "CallToCharacter">><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<CheckChance 'ComeToMe_Phone_Success' 'ComeToMe_Phone_Failed' 'ComeToMe_Phone_Failed_Twice' 'CallToCharacter' 'ComeToMe' '{createBackButton: true, createTwiceBackButton: true}'>>
<</nobr>><<nobr>>
<<set _lockRelocate = $player.info.currentLocation>>
<<set _phoneInviteSource = setup.isLocationInPlayerHome && setup.isLocationInPlayerHome(_lockRelocate) ? "phoneInviteHome" : "phoneInviteLocation">>
<<set _journeyResult = setup.requestNpcGuestJourney($interactionNpc, _lockRelocate, 2, _phoneInviteSource)>>
<<if _journeyResult.ok>>
<<set _phrase = [
"Alright, I’ll head over in a bit!",
"Sure thing! I’ll be there soon.",
"Sounds good. I’ll be on my way!",
"Yeah, I can come by. See you soon!",
"Alright, I’m coming! Just give me a few minutes.",
].random()>>
<<else>>
<<set _phrase = _journeyResult.reason>>
<</if>>
<<Chat $interactionNpc _phrase>>
<div class="padding-top">
<div class="btn"><<button "Continue" $player.info.currentLocation>>
<<unset $interactionNpc $indexNPC _journeyResult>>
<<set $gameSettings.allowSaves = true>>
<<set $canShowStatsBtn = true>>
<</button>></div>
</div>
<</nobr>><<nobr>>
<<set _phrase = [
"Sorry, I can’t make it right now.",
"I don’t think I can come by today.",
"Thanks for the invite, but I’m not able to.",
"Nah, I’m just gonna stay in tonight.",
"I’d love to, but I can’t right now.",
].random()>>
<<Chat $interactionNpc _phrase>>
<div class="padding-top">
<div class="btn"><<button "Back" "CallToCharacter">><</button>></div>
</div>
<</nobr>><<nobr>>
<<set _phrase = [
"I already said I’m not coming, so drop it.",
"Seriously, I can’t come over. Stop pushing.",
"Look, I told you no. Let’s leave it there.",
"How many times do I have to say I’m not coming?",
"Enough already. I’m not coming over, end of story.",
].random()>>
<<Chat $interactionNpc _phrase>>
<div class="padding-top">
<div class="btn"><<button "Back" "CallToCharacter">><</button>></div>
</div>
<</nobr>><<nobr>>
/* Compatibility redirect for saves whose current passage was the retired
proposal screen. The live proposal system is part of the main interaction. */
<<goto "enhanced_interaction_system">>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<set _datingAcceptMsg = "You agreed to start dating " + $interactionNpc.info.firstName + ".">>
<<ChatMessage _datingAcceptMsg>>
<<run setup.setPlayerNpcRelationshipStatus($player, $interactionNpc, "dating", {source: "legacy_proposal"})>>
<<unset $pendingDatingRelation>>
<div class="padding-top">
<div class="btn"><<button "Continue" "enhanced_interaction_system">><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<set _datingRejectMsg = "You refused to date " + $interactionNpc.info.firstName + ".">>
<<ChatMessage _datingRejectMsg>>
<<IncreaseLove $player $interactionNpc -5>>
<<unset $pendingDatingRelation>>
<div class="padding-top">
<div class="btn"><<button "Continue" "enhanced_interaction_system">><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _interaction = setup.getInteractionDefinition("insult")>>
<<set $interactionResult = setup.performEnhancedInteraction($player, $interactionNpc, "insult")>>
<<if $interactionResult.blocked>>
<<include "enhanced_interaction_result_display">>
<<else>>
<<SpendTime _interaction.timeCost>>
<<SpendEnergy $player _interaction.energyCost>>
<<run setup.applyInteractionEffects($player, $interactionNpc, "insult", $interactionResult)>>
<<ShowNpcIcon $interactionNpc>>
<<if $interactionResult.criticalSuccess>>
<<Chat $interactionNpc "I... I don't know what to say... That was too cruel... 😢">>
<<ChatMessage "Your insult hit the most painful spot. NPC is devastated.">>
<<elseif $interactionResult.criticalFailure>>
<<Chat $interactionNpc "HA! Was that supposed to hurt me? Pathetic attempt!">>
<<ChatMessage "NPC completely ignored your insult and laughed at you.">>
<<elseif $interactionResult.success>>
<<set _relation = $player.getRelationship($interactionNpc.info.id, false)?.relation ?? "acquaintance">>
<<switch _relation>>
<<case "friend" "bestFriend">>
<<Chat $interactionNpc "How can you say that? I thought we were friends!">>
<<case "dating" "soulmate">>
<<Chat $interactionNpc "What?! After everything we've been through together?!">>
<<case "enemy" "archenemy">>
<<Chat $interactionNpc "You'll pay for that! I won't forget!">>
<<case "rival">>
<<Chat $interactionNpc "Ha! Think that bothers me? Well, almost...">>
<<default>>
<<Chat $interactionNpc "What rudeness?! You'll regret this!">>
<</switch>>
<<ChatMessage "Your insult hit home.">>
<<else>>
<<Chat $interactionNpc "Uh... what? Was that an insult? I didn't get it.">>
<<ChatMessage "The insult missed its mark.">>
<</if>>
<<include "enhanced_interaction_result_display">>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _interaction = setup.getInteractionDefinition("threaten")>>
<<set $interactionResult = setup.performEnhancedInteraction($player, $interactionNpc, "threaten")>>
<<if $interactionResult.blocked>>
<<include "enhanced_interaction_result_display">>
<<else>>
<<SpendTime _interaction.timeCost>>
<<SpendEnergy $player _interaction.energyCost>>
<<run setup.applyInteractionEffects($player, $interactionNpc, "threaten", $interactionResult)>>
<<ShowNpcIcon $interactionNpc>>
<<if $interactionResult.criticalSuccess>>
<<Chat $interactionNpc "O-okay! Okay! I'll do anything you say! Just don't hurt me! 😰">>
<<ChatMessage "NPC is completely intimidated and submissive!">>
<<include "enhanced_interaction_result_display">>
<<elseif $interactionResult.criticalFailure>>
<<Chat $interactionNpc "You're threatening ME?! I'll destroy you!">>
<<ChatMessage "Your threat angered NPC! Be careful!">>
<div class="btn padding-top">
<<button "Prepare to fight">>
<<set _battleSetControls = {attack: true, seduce: false, items: true, actions: true}>>
<<StartFight $player $interactionNpc _battleSetControls undefined undefined>>
<</button>>
</div>
<div class="btn padding-top"><<button "Back off" "enhanced_interaction_system">><</button>></div>
<<elseif $interactionResult.success>>
<<set _relation = $player.getRelationship($interactionNpc.info.id, false)?.relation ?? "acquaintance">>
<<switch _relation>>
<<case "acquaintance" "friend">>
<<Chat $interactionNpc "W-what? Why are you doing this? I'm scared...">>
<<case "enemy" "archenemy">>
<<Chat $interactionNpc "Fine, fine... I get the message. For now.">>
<<default>>
<<Chat $interactionNpc "Alright... I don't want any trouble...">>
<</switch>>
<<ChatMessage "Threat worked. NPC is scared.">>
<<include "enhanced_interaction_result_display">>
<<else>>
<<Chat $interactionNpc "Ha! Was that supposed to scare me? Funny.">>
<<ChatMessage "The threat didn't impress them.">>
<<include "enhanced_interaction_result_display">>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _interaction = setup.getInteractionDefinition("intimidate")>>
<<set $interactionResult = setup.performEnhancedInteraction($player, $interactionNpc, "intimidate")>>
<<if $interactionResult.blocked>>
<<include "enhanced_interaction_result_display">>
<<else>>
<<SpendTime _interaction.timeCost>>
<<SpendEnergy $player _interaction.energyCost>>
<<run setup.applyInteractionEffects($player, $interactionNpc, "intimidate", $interactionResult)>>
<<ShowNpcIcon $interactionNpc>>
<<if $interactionResult.criticalSuccess>>
<<Chat $interactionNpc "P-please! I'll do anything! Just don't hit me! 😱">>
<<ChatMessage "NPC is completely broken! Fear paralyzes them!">>
<<include "enhanced_interaction_result_display">>
<<elseif $interactionResult.criticalFailure>>
<<Chat $interactionNpc "You think you're stronger than me?! Let's find out!">>
<<ChatMessage "NPC wasn't scared and is ready to fight!">>
<div class="btn padding-top">
<<button "Fight!">>
<<set _battleSetControls = {attack: true, seduce: false, items: true, actions: true}>>
<<StartFight $player $interactionNpc _battleSetControls undefined undefined>>
<</button>>
</div>
<div class="btn padding-top"><<button "Run" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
<<elseif $interactionResult.success>>
<<Chat $interactionNpc "A-alright... I understand. No need for violence...">>
<<ChatMessage "Intimidation worked. NPC is impressed by your strength.">>
<<include "enhanced_interaction_result_display">>
<<else>>
<<Chat $interactionNpc "You're not as scary as you think.">>
<<ChatMessage "Intimidation attempt failed.">>
<<include "enhanced_interaction_result_display">>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _interaction = setup.getInteractionDefinition("challenge")>>
<<set $interactionResult = setup.performEnhancedInteraction($player, $interactionNpc, "challenge")>>
<<if $interactionResult.blocked>>
<<include "enhanced_interaction_result_display">>
<<else>>
<<SpendTime _interaction.timeCost>>
<<SpendEnergy $player _interaction.energyCost>>
<<run setup.applyInteractionEffects($player, $interactionNpc, "challenge", $interactionResult)>>
<<ShowNpcIcon $interactionNpc>>
<<if $interactionResult.criticalSuccess>>
<<Chat $interactionNpc "You're challenging me? Interesting! I accept! This will be fun! 😤💪">>
<<ChatMessage "NPC enthusiastically accepted your challenge! This strengthened mutual respect!">>
<<include "enhanced_interaction_result_display">>
<<elseif $interactionResult.criticalFailure>>
<<Chat $interactionNpc "A challenge? From you? Don't make me laugh. You're not worth my time.">>
<<ChatMessage "NPC contemptuously rejected your challenge.">>
<<include "enhanced_interaction_result_display">>
<<elseif $interactionResult.success>>
<<set _relation = $player.getRelationship($interactionNpc.info.id, false)?.relation ?? "acquaintance">>
<<switch _relation>>
<<case "rival">>
<<Chat $interactionNpc "Ha! Finally, a worthy opponent! Let's see what you've got!">>
<<case "enemy" "archenemy">>
<<Chat $interactionNpc "You'll regret this! Challenge accepted!">>
<<case "friend" "bestFriend">>
<<Chat $interactionNpc "Oh, a friendly competition? Why not!">>
<<default>>
<<Chat $interactionNpc "Interesting... alright, I accept.">>
<</switch>>
<<ChatMessage "Challenge accepted!">>
<div class="btn padding-top">
<<button "Fight!">>
<<set _battleSetControls = {attack: true, seduce: false, items: true, actions: true}>>
<<StartFight $player $interactionNpc _battleSetControls undefined undefined undefined true>>
<</button>>
</div>
<div class="btn padding-top"><<button "Changed my mind" "enhanced_interaction_system">><</button>></div>
<<else>>
<<Chat $interactionNpc "Not now. I don't have time for this.">>
<<ChatMessage "NPC declined your challenge.">>
<<include "enhanced_interaction_result_display">>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "enhanced_interaction_busy_check">>
<<set _interaction = setup.getInteractionDefinition("smallTalk")>>
<<if _isBusy>>
<<include "enhanced_interaction_smallTalk_busy">>
<<else>>
<<set $interactionResult = setup.performEnhancedInteraction($player, $interactionNpc, "smallTalk")>>
<<if $interactionResult.blocked>>
<<include "enhanced_interaction_result_display">>
<<else>>
<<SpendTime _interaction.timeCost>>
<<SpendEnergy $player _interaction.energyCost>>
<<set _warmBefore = setup.npcChat.warmBefore($player, $interactionNpc)>>
<<run setup.applyInteractionEffects($player, $interactionNpc, "smallTalk", $interactionResult)>>
/* D-AIC13: light talk is plain talk, it fills the same daily closeness cap as the AI chat. */
<<run setup.npcChat.capMenuTalk($player, $interactionNpc, "smallTalk", $interactionResult, _warmBefore)>>
<<if $interactionResult.criticalSuccess>>
<<include "enhanced_interaction_smallTalk_crit_success">>
<<elseif $interactionResult.criticalFailure>>
<<include "enhanced_interaction_smallTalk_crit_failure">>
<<elseif $interactionResult.success>>
<<include "enhanced_interaction_smallTalk_success">>
<<else>>
<<include "enhanced_interaction_smallTalk_failure">>
<</if>>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<ShowNpcIcon $interactionNpc>>
<<set _relation = $player.getRelationship($interactionNpc.info.id, false)?.relation ?? "acquaintance">>
<<switch _relation>>
<<case "acquaintance">>
<<Chat $interactionNpc "Nice chatting with you. You're quite interesting to talk to.">>
<<case "friend">>
<<Chat $interactionNpc "Always love chatting with you! How have you been?">>
<<case "bestFriend">>
<<Chat $interactionNpc "I love our conversations! Tell me, what's new?">>
<<case "crush">>
<<Chat $interactionNpc "I enjoy talking with you... you're so interesting.">>
<<case "dating">>
<<Chat $interactionNpc "Babe, I love just chatting with you.">>
<<case "soulmate">>
<<Chat $interactionNpc "Every conversation with you is pure happiness, my love.">>
<<case "rival">>
<<Chat $interactionNpc "Hmm, that wasn't so bad. Maybe you're not that terrible.">>
<<case "enemy">>
<<Chat $interactionNpc "Fine... that wasn't as awful as I expected.">>
<<default>>
<<Chat $interactionNpc "Nice chat!">>
<</switch>>
<<include "enhanced_interaction_result_display">>
<</nobr>><<nobr>>
<<ShowNpcIcon $interactionNpc>>
<<Chat $interactionNpc "Uh... what? I didn't quite get that.">>
<<include "enhanced_interaction_result_display">>
<</nobr>><<nobr>>
<<ShowNpcIcon $interactionNpc>>
<<Chat $interactionNpc "Wow! That was an amazing conversation! You're incredible to talk to! 🌟">>
<<ChatMessage "You found common interests and really connected!">>
<<include "enhanced_interaction_result_display">>
<</nobr>><<nobr>>
<<ShowNpcIcon $interactionNpc>>
<<Chat $interactionNpc "What?! That was completely inappropriate! I'm leaving!">>
<<ChatMessage "You accidentally touched a sensitive topic and made a bad impression.">>
<<include "enhanced_interaction_result_display">>
<</nobr>><<nobr>>
<<ShowNpcIcon $interactionNpc>>
<<Chat $interactionNpc "Sorry, I'm too tired for conversation right now. Maybe later?">>
<div class="btn padding-top"><<button "Back" "enhanced_interaction_system">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "enhanced_interaction_busy_check">>
<<set _interaction = setup.getInteractionDefinition("deepConversation")>>
<<if _isBusy>>
<<ShowNpcIcon $interactionNpc>>
<<Chat $interactionNpc "Sorry, I'm not in the right headspace for deep talks right now...">>
<div class="btn padding-top"><<button "Back" "enhanced_interaction_system">><</button>></div>
<<else>>
<<set $interactionResult = setup.performEnhancedInteraction($player, $interactionNpc, "deepConversation")>>
<<if $interactionResult.blocked>>
<<include "enhanced_interaction_result_display">>
<<else>>
<<SpendTime _interaction.timeCost>>
<<SpendEnergy $player _interaction.energyCost>>
<<run setup.applyInteractionEffects($player, $interactionNpc, "deepConversation", $interactionResult)>>
<<ShowNpcIcon $interactionNpc>>
<<if $interactionResult.criticalSuccess>>
<<Chat $interactionNpc "That was... the most honest conversation I've ever had. I feel like we're truly connected. 💫">>
<<ChatMessage "You opened up to each other. This bond will stay with you both.">>
<<elseif $interactionResult.criticalFailure>>
<<Chat $interactionNpc "How can you say that?! That was really hurtful!">>
<<ChatMessage "You accidentally said something offensive.">>
<<elseif $interactionResult.success>>
<<Chat $interactionNpc "Thank you for listening. It really meant a lot to talk about this.">>
<<ChatMessage "You had a meaningful conversation and understand each other better.">>
<<else>>
<<Chat $interactionNpc "I'm not sure I'm ready to discuss such personal things...">>
<<ChatMessage "The conversation didn't go well. Maybe it wasn't the right time.">>
<</if>>
<<include "enhanced_interaction_result_display">>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "enhanced_interaction_busy_check">>
<<set _interaction = setup.getInteractionDefinition("shareSecret")>>
<<if _isBusy>>
<<ShowNpcIcon $interactionNpc>>
<<Chat $interactionNpc "Wait, now's not a good time for secrets...">>
<div class="btn padding-top"><<button "Back" "enhanced_interaction_system">><</button>></div>
<<else>>
<<set $interactionResult = setup.performEnhancedInteraction($player, $interactionNpc, "shareSecret")>>
<<if $interactionResult.blocked>>
<<include "enhanced_interaction_result_display">>
<<else>>
<<SpendTime _interaction.timeCost>>
<<SpendEnergy $player _interaction.energyCost>>
<<run setup.applyInteractionEffects($player, $interactionNpc, "shareSecret", $interactionResult)>>
<<ShowNpcIcon $interactionNpc>>
<<if $interactionResult.criticalSuccess>>
<<Chat $interactionNpc "Wow... I'm touched you trust me with this. I want to share something too... 🤫">>
<<ChatMessage "You exchanged secrets and created a special bond!">>
<<elseif $interactionResult.criticalFailure>>
<<Chat $interactionNpc "What?! I can't believe you told me that... I need to think.">>
<<ChatMessage "The secret was too shocking. This damaged trust.">>
<<elseif $interactionResult.success>>
<<Chat $interactionNpc "Thank you for trusting me. Your secret is safe with me.">>
<<ChatMessage "You strengthened your bond through trust.">>
<<else>>
<<Chat $interactionNpc "Um... not sure I wanted to know that...">>
<<ChatMessage "Sharing the secret didn't work out.">>
<</if>>
<<include "enhanced_interaction_result_display">>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "enhanced_interaction_busy_check">>
<<set _interaction = setup.getInteractionDefinition("askForAdvice")>>
<<if _isBusy>>
<<ShowNpcIcon $interactionNpc>>
<<Chat $interactionNpc "Sorry, my head's too full of my own problems right now...">>
<div class="btn padding-top"><<button "Back" "enhanced_interaction_system">><</button>></div>
<<else>>
<<set $interactionResult = setup.performEnhancedInteraction($player, $interactionNpc, "askForAdvice")>>
<<if $interactionResult.blocked>>
<<include "enhanced_interaction_result_display">>
<<else>>
<<SpendTime _interaction.timeCost>>
<<SpendEnergy $player _interaction.energyCost>>
<<run setup.applyInteractionEffects($player, $interactionNpc, "askForAdvice", $interactionResult)>>
<<ShowNpcIcon $interactionNpc>>
<<if $interactionResult.criticalSuccess>>
<<Chat $interactionNpc "Oh, I have a great idea! Try this... 💡">>
<<ChatMessage "The advice was incredibly helpful! You feel grateful.">>
<<elseif $interactionResult.success>>
<<Chat $interactionNpc "Hmm, I think you should try... Hope it helps!">>
<<ChatMessage "You got some useful advice.">>
<<else>>
<<Chat $interactionNpc "Honestly, I don't know what to tell you...">>
<<ChatMessage "Couldn't get any advice.">>
<</if>>
<<include "enhanced_interaction_result_display">>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _interaction = setup.getInteractionDefinition("giveGift")>>
<<set $interactionResult = setup.performEnhancedInteraction($player, $interactionNpc, "giveGift")>>
<<if $interactionResult.blocked>>
<<include "enhanced_interaction_result_display">>
<<else>>
<<SpendTime _interaction.timeCost>>
<<SpendEnergy $player _interaction.energyCost>>
<<run setup.applyInteractionEffects($player, $interactionNpc, "giveGift", $interactionResult)>>
<<ShowNpcIcon $interactionNpc>>
<<if $interactionResult.criticalSuccess>>
<<Chat $interactionNpc "This is... exactly what I've always wanted! How did you know?! 🎁✨">>
<<ChatMessage "The gift was perfect! NPC is absolutely thrilled!">>
<<elseif $interactionResult.criticalFailure>>
<<Chat $interactionNpc "Uh... thanks, but this really isn't my thing... 😕">>
<<ChatMessage "The gift completely missed the mark.">>
<<elseif $interactionResult.success>>
<<Chat $interactionNpc "Oh, how sweet! Thank you so much, I love it!">>
<<ChatMessage "The gift was well received!">>
<<else>>
<<Chat $interactionNpc "Thanks... but why would I need this?">>
<<ChatMessage "The gift didn't make an impression.">>
<</if>>
/* Grants, status, money and resentment: one source, shared with the AI chat. */
<<set _consequences = setup.applyInteractionConsequences($player, $interactionNpc, "giveGift", $interactionResult)>>
<<include "enhanced_interaction_result_display">>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _interaction = setup.getInteractionDefinition("tellJoke")>>
<<set $interactionResult = setup.performEnhancedInteraction($player, $interactionNpc, "tellJoke")>>
<<if $interactionResult.blocked>>
<<include "enhanced_interaction_result_display">>
<<else>>
<<SpendTime _interaction.timeCost>>
<<SpendEnergy $player _interaction.energyCost>>
<<set _warmBefore = setup.npcChat.warmBefore($player, $interactionNpc)>>
<<run setup.applyInteractionEffects($player, $interactionNpc, "tellJoke", $interactionResult)>>
/* D-AIC13: light talk is plain talk, it fills the same daily closeness cap as the AI chat. */
<<run setup.npcChat.capMenuTalk($player, $interactionNpc, "tellJoke", $interactionResult, _warmBefore)>>
<<ShowNpcIcon $interactionNpc>>
<<if $interactionResult.criticalSuccess>>
<<Chat $interactionNpc "HAHAHA! That's the funniest joke I've ever heard! 🤣🤣">>
<<ChatMessage "NPC is laughing until they cry! You made their day!">>
<<elseif $interactionResult.criticalFailure>>
<<Chat $interactionNpc "...That was offensive. Not funny at all.">>
<<ChatMessage "The joke was inappropriate and hurt their feelings.">>
<<elseif $interactionResult.success>>
<<Chat $interactionNpc "Haha, not bad! You really know how to make me laugh!">>
<<ChatMessage "The joke landed!">>
<<else>>
<<Chat $interactionNpc "Uh... I don't get it.">>
<<ChatMessage "The joke fell flat.">>
<</if>>
<<include "enhanced_interaction_result_display">>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "enhanced_interaction_jealousy_check">>
<<if _jealousIntervene>>
<<include "jealous_partner_intervenes">>
<<elseif _playerPartnerIntervene>>
<<include "player_partner_confrontation">>
<<else>>
<<set _interaction = setup.getInteractionDefinition("kiss")>>
<<set $interactionResult = setup.performEnhancedInteraction($player, $interactionNpc, "kiss")>>
<<if $interactionResult.blocked>>
<<include "enhanced_interaction_result_display">>
<<else>>
<<SpendTime _interaction.timeCost>>
<<SpendEnergy $player _interaction.energyCost>>
<<run setup.applyInteractionEffects($player, $interactionNpc, "kiss", $interactionResult)>>
<<ShowNpcIcon $interactionNpc>>
<<if $interactionResult.criticalSuccess>>
<<Chat $interactionNpc "That was... the most magical kiss... I'm dizzy... 💋✨">>
<<ChatMessage "An incredible kiss! You both feel electricity!">>
<<set $interaction = "Kiss">>
<<Interaction $player $interactionNpc>>
<<elseif $interactionResult.criticalFailure>>
<<Chat $interactionNpc "Ugh! What was that?! Don't do that again!">>
<<ChatMessage "The most awkward kiss in history...">>
<<elseif $interactionResult.success>>
<<set _relation = $player.getRelationship($interactionNpc.info.id, false)?.relation ?? "acquaintance">>
<<switch _relation>>
<<case "crush">>
<<Chat $interactionNpc "Mmm... that was... wow... 😳💕">>
<<case "dating">>
<<Chat $interactionNpc "Your kisses are the best thing in my life. 💋">>
<<case "soulmate">>
<<Chat $interactionNpc "Every kiss with you feels like the first time. 💞">>
<<case "fuckbuddy">>
<<Chat $interactionNpc "Mmm, not bad. I want more. 😏">>
<<case "hatefuck">>
<<Chat $interactionNpc "I hate that I like this...">>
<<default>>
<<Chat $interactionNpc "That was... nice.">>
<</switch>>
<<ChatMessage "Kiss was successful!">>
<<set $interaction = "Kiss">>
<<Interaction $player $interactionNpc>>
<<else>>
<<Chat $interactionNpc "Wait... not now.">>
<<ChatMessage "NPC pulled away from the kiss.">>
<</if>>
<<if $interactionResult.success || $interactionResult.criticalSuccess>>
<<run gainSexExp($player, "sexualKnowledge", 1)>>
<<run gainSexExp($player, "disinhibition", 1)>>
<</if>>
<<include "enhanced_interaction_result_display">>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "enhanced_interaction_jealousy_check">>
<<if _jealousIntervene>>
<<include "jealous_partner_intervenes">>
<<elseif _playerPartnerIntervene>>
<<include "player_partner_confrontation">>
<<else>>
<<set _interaction = setup.getInteractionDefinition("passionateKiss")>>
<<set $interactionResult = setup.performEnhancedInteraction($player, $interactionNpc, "passionateKiss")>>
<<if $interactionResult.blocked>>
<<include "enhanced_interaction_result_display">>
<<else>>
<<SpendTime _interaction.timeCost>>
<<SpendEnergy $player _interaction.energyCost>>
<<run setup.applyInteractionEffects($player, $interactionNpc, "passionateKiss", $interactionResult)>>
<<ShowNpcIcon $interactionNpc>>
<<if $interactionResult.criticalSuccess>>
<<Chat $interactionNpc "Oh god... I can't breathe... Don't stop... 🔥💋💕">>
<<ChatMessage "The passion is overwhelming! NPC is completely caught up in the moment!">>
<<set $interaction = "Kiss">>
<<Interaction $player $interactionNpc>>
<<elseif $interactionResult.criticalFailure>>
<<Chat $interactionNpc "Stop! You're being too aggressive! That's not romantic!">>
<<ChatMessage "The passionate kiss attempt was clumsy.">>
<<elseif $interactionResult.success>>
<<set _relation = $player.getRelationship($interactionNpc.info.id, false)?.relation ?? "acquaintance">>
<<switch _relation>>
<<case "dating" "soulmate">>
<<Chat $interactionNpc "Mmm... I love it when you kiss me like that... 😍🔥">>
<<case "fuckbuddy">>
<<Chat $interactionNpc "Now that's what I'm talking about! Keep going... 😈">>
<<case "hatefuck">>
<<Chat $interactionNpc "I hate you... but keep going...">>
<<default>>
<<Chat $interactionNpc "Wow... that was... intense.">>
<</switch>>
<<ChatMessage "The passionate kiss ignited desire!">>
<<set $interaction = "Kiss">>
<<Interaction $player $interactionNpc>>
<<else>>
<<Chat $interactionNpc "This is... too fast. I need to stop.">>
<<ChatMessage "NPC isn't ready for such passion right now.">>
<</if>>
<<if $interactionResult.success || $interactionResult.criticalSuccess>>
<<run gainSexExp($player, "sexualKnowledge", 2)>>
<<run gainSexExp($player, "disinhibition", 2)>>
<</if>>
<<include "enhanced_interaction_result_display">>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "enhanced_interaction_jealousy_check">>
<<if _jealousIntervene>>
<<include "jealous_partner_intervenes">>
<<elseif _playerPartnerIntervene>>
<<include "player_partner_confrontation">>
<<else>>
<<set _interaction = setup.getInteractionDefinition("sensualTouch")>>
<<set $interactionResult = setup.performEnhancedInteraction($player, $interactionNpc, "sensualTouch")>>
<<if $interactionResult.blocked>>
<<include "enhanced_interaction_result_display">>
<<else>>
<<SpendTime _interaction.timeCost>>
<<SpendEnergy $player _interaction.energyCost>>
<<run setup.applyInteractionEffects($player, $interactionNpc, "sensualTouch", $interactionResult)>>
<<ShowNpcIcon $interactionNpc>>
<<if $interactionResult.criticalSuccess>>
<<Chat $interactionNpc "Ah... Your hands... you know how to turn me on... 🔥😩">>
<<ChatMessage "Your touches are electrifying! NPC is completely under your spell!">>
<<set $interaction = BeachPicnic.getTouchInteractionKey($interactionNpc.gender())>>
<<Interaction $player $interactionNpc>>
<<elseif $interactionResult.criticalFailure>>
<<Chat $interactionNpc "Hey! Don't touch me there! That's not okay!">>
<<ChatMessage "Your touch was too bold and inappropriate.">>
<<elseif $interactionResult.success>>
<<set _relation = $player.getRelationship($interactionNpc.info.id, false)?.relation ?? "acquaintance">>
<<switch _relation>>
<<case "dating" "soulmate">>
<<Chat $interactionNpc "Mmm... don't stop... 😍">>
<<case "fuckbuddy">>
<<Chat $interactionNpc "Oh yes... you know what you're doing... 😏">>
<<case "crush">>
<<Chat $interactionNpc "O-oh... that feels nice... 😳">>
<<default>>
<<Chat $interactionNpc "That's... good...">>
<</switch>>
<<ChatMessage "Your touch aroused interest.">>
<<set $interaction = BeachPicnic.getTouchInteractionKey($interactionNpc.gender())>>
<<Interaction $player $interactionNpc>>
<<else>>
<<Chat $interactionNpc "Wait... I'm not ready for this.">>
<<ChatMessage "NPC gently removed your hand.">>
<</if>>
<<if $interactionResult.success || $interactionResult.criticalSuccess>>
<<run gainSexExp($player, "handSkill", Random(1,2))>>
<<run gainSexExp($player, "disinhibition", Random(1,2))>>
<</if>>
<<include "enhanced_interaction_result_display">>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "enhanced_interaction_busy_check">>
<<if _isBusy>>
<<ShowNpcIcon $interactionNpc>>
<<Chat $interactionNpc "Sounds tempting, but I'm not in the mood right now...">>
<div class="btn padding-top"><<button "Back" "enhanced_interaction_system">><</button>></div>
<<else>>
<<set _interaction = setup.getInteractionDefinition("massage")>>
<<set $interactionResult = setup.performEnhancedInteraction($player, $interactionNpc, "massage")>>
<<if $interactionResult.blocked>>
<<include "enhanced_interaction_result_display">>
<<else>>
<<SpendTime _interaction.timeCost>>
<<SpendEnergy $player _interaction.energyCost>>
<<run setup.applyInteractionEffects($player, $interactionNpc, "massage", $interactionResult)>>
<<ShowNpcIcon $interactionNpc>>
<<if $interactionResult.criticalSuccess>>
<<Chat $interactionNpc "Oh god... You have magic hands... I'm melting... 💆♀️✨">>
<<ChatMessage "Best massage ever! Complete relaxation achieved!">>
<<elseif $interactionResult.criticalFailure>>
<<Chat $interactionNpc "Ouch! That hurts! Are you trying to injure me?!">>
<<ChatMessage "The massage turned into torture. NPC is not happy.">>
<<elseif $interactionResult.success>>
<<set _relation = $player.getRelationship($interactionNpc.info.id, false)?.relation ?? "acquaintance">>
<<switch _relation>>
<<case "dating" "soulmate">>
<<Chat $interactionNpc "Mmm... so good... Thank you, sweetheart... 💕">>
<<case "fuckbuddy">>
<<Chat $interactionNpc "Nice hands... maybe we continue somewhere else? 😏">>
<<case "friend" "bestFriend">>
<<Chat $interactionNpc "Oooh, that's so relaxing! You're talented!">>
<<case "crush">>
<<Chat $interactionNpc "Ah... your hands are so gentle... 😊">>
<<default>>
<<Chat $interactionNpc "Thanks, that was really nice.">>
<</switch>>
<<ChatMessage "Massage was successful! NPC is relaxed and happy.">>
<<else>>
<<Chat $interactionNpc "Hmm, thanks, but massage isn't really my thing...">>
<<ChatMessage "The massage didn't have the desired effect.">>
<</if>>
<<if $interactionResult.success || $interactionResult.criticalSuccess>>
<<run gainSexExp($player, "handSkill", Random(1,2))>>
<<run gainSexExp($player, "sexualKnowledge", 1)>>
<</if>>
<<include "enhanced_interaction_result_display">>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "enhanced_interaction_jealousy_check">>
<<if _jealousIntervene>>
<<include "jealous_partner_intervenes">>
<<elseif _playerPartnerIntervene>>
<<include "player_partner_confrontation">>
<<else>>
<<set _interaction = setup.getInteractionDefinition("askForSex")>>
<<set $interactionResult = setup.performEnhancedInteraction($player, $interactionNpc, "askForSex")>>
<<if $interactionResult.blocked>>
<<include "enhanced_interaction_result_display">>
<<else>>
<<SpendTime _interaction.timeCost>>
<<SpendEnergy $player _interaction.energyCost>>
<<run setup.applyInteractionEffects($player, $interactionNpc, "askForSex", $interactionResult)>>
<<ShowNpcIcon $interactionNpc>>
<<if $interactionResult.criticalSuccess>>
<<Chat $interactionNpc "Yes! Finally! I've been wanting this so bad! Let's go! 🔥😈💕">>
<<ChatMessage "NPC enthusiastically accepted your proposal!">>
<div class="btn padding-top"><<button "Continue" "ChooseSexType">><</button>></div>
<<elseif $interactionResult.criticalFailure>>
<<Chat $interactionNpc "What?! How can you even ask that?! That's disgusting!">>
<<ChatMessage "Your proposal was harshly rejected and left a bad taste.">>
<<include "enhanced_interaction_result_display">>
<<elseif $interactionResult.success>>
<<set _relation = $player.getRelationship($interactionNpc.info.id, false)?.relation ?? "acquaintance">>
<<switch _relation>>
<<case "dating" "soulmate">>
<<Chat $interactionNpc "Of course, honey... I always want you... 💕">>
<<case "fuckbuddy">>
<<Chat $interactionNpc "That's what I'm here for. Let's go. 😏">>
<<case "hatefuck">>
<<Chat $interactionNpc "I hate myself for this, but... fine.">>
<<case "crush">>
<<Chat $interactionNpc "I... I'm ready. With you - yes. 😳💗">>
<<default>>
<<Chat $interactionNpc "Hmm... alright, why not.">>
<</switch>>
<<ChatMessage "NPC agreed!">>
<div class="btn padding-top"><<button "Continue" "ChooseSexType">><</button>></div>
<<else>>
<<Chat $interactionNpc "Sorry, but I'm not in the mood for that right now...">>
<<ChatMessage "NPC declined, but without offense.">>
<<include "enhanced_interaction_result_display">>
<</if>>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "enhanced_interaction_busy_check">>
<<include "enhanced_interaction_jealousy_check">>
<<if _jealousIntervene>>
<<include "jealous_partner_intervenes">>
<<elseif _playerPartnerIntervene>>
<<include "player_partner_confrontation">>
<<else>>
<<SpendTime 5>>
<<SpendEnergy $player 5>>
<<if _isBusy == true>>
<<include "enhanced_interaction_offerRide_tired">>
<<elseif setup.offerRideWilling($player, $interactionNpc)>>
<<include "enhanced_interaction_offerRide_success">>
<<else>>
<<include "enhanced_interaction_offerRide_unsuccessful">>
<</if>>
<</if>>
<<if $player.dailyEvents.isEventRegistered($interactionNpc.info.id, "offerRide") == false>>
<<run $player.dailyEvents.registerEvent($interactionNpc.info.id, "offerRide", 1)>>
<</if>>
<</nobr>><<nobr>>
<<ChatMessage 'Successful'>>
<<if !$playercars || $playercars.length == 0>>
<<ChatMessage "You don't own a car to offer.">>
<<else>>
<<set _ownedRide = setup.getOwnedCarRide($playercars)>>
<<set _carName = _ownedRide.name>>
<<set _friendship = _ownedRide.friendship>>
<<set _msg = `Need a ride? My _carName is right outside.`>>
<<Chat $player _msg>>
<<Chat $interactionNpc "Thanks! I'd appreciate it.">>
<<set _relations = {friendship: _friendship}>>
<<set $interactionNpc.setRelationship($player.info.id, _relations)>>
<<set $player.setRelationship($interactionNpc.info.id, _relations)>>
<<set _msg = `Friendship increased by _friendship`>>
<<ChatMessage _msg>>
<<if $player.genitalia() == "Vagina">>
<<set _oralText = "Eat me out">>
<<else>>
<<set _oralText = "Suck me off">>
<</if>>
<<if setup.canCarBlowjob($player, $interactionNpc)>>
<div class="btn"><<button _oralText "enhanced_interaction_car_blowjob">><</button>></div>
<<else>>
<div class="btn non-interacting" id="carbj-btn"><<button _oralText>><</button>></div>
<<done>>
<<run addHoverTooltip('carbj-btn', 'Required: Love ≥ 30, sex ≥ 45; relationship ≥ Crush or fuckbuddy or hatefuck. Always available if dating, soulmate, fuckbuddy or hatefuck')>>
<</done>>
<</if>>
<</if>>
<div class="btn padding-top"><<button "Back" "enhanced_interaction_system">><</button>></div>
<</nobr>><<nobr>>
<<ChatMessage 'Unsuccessful'>>
<<Chat $player "Need a ride?">>
<<Chat $interactionNpc "No thanks.">>
<div class="btn padding-top"><<button "Back" "enhanced_interaction_system">><</button>></div>
<</nobr>><<nobr>>
<<ChatMessage 'Tired'>>
<<Chat $interactionNpc "I'm too busy for that right now.">>
<div class="btn padding-top"><<button "Back" "enhanced_interaction_system">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "enhanced_interaction_busy_check">>
<<include "enhanced_interaction_jealousy_check">>
<<if _jealousIntervene>>
<<include "jealous_partner_intervenes">>
<<elseif _playerPartnerIntervene>>
<<include "player_partner_confrontation">>
<<else>>
<<if _isBusy == true>>
<<include "enhanced_interaction_car_blowjob_tired">>
<<else>>
<<set $carIntimacyResult = setup.performPlayerNpcCarOral($player, $interactionNpc)>>
<<goto "enhanced_interaction_car_blowjob_result">>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<if $carIntimacyResult>>
<<set _carResultTitle = $carIntimacyResult.ok ? "Head in the parked car" : "Not this time">>
<<ChatMessage _carResultTitle>>
<<Chat $interactionNpc $carIntimacyResult.reason>>
<<if $carIntimacyResult.ok && $carIntimacyResult.mediaPath && CheckContentFilter($interactionNpc)>><<Video $carIntimacyResult.mediaPath>><</if>>
<<else>>
<<ChatMessage "The hookup in the car could not be resolved.">>
<</if>>
<<unset $carIntimacyResult>>
<div class="btn padding-top"><<button "Continue" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
<</nobr>><<nobr>>
<<ChatMessage 'Tired'>>
<<switch $player.getRelationship($interactionNpc.info.id, false)?.relation ?? "acquaintance">>
<<case "acquaintance">><<Chat $interactionNpc 'I\'m way too exhausted for that.'>>
<<case "friend">><<Chat $interactionNpc 'Too tired for that, sorry.'>>
<<case "bestFriend">><<Chat $interactionNpc 'I\'m way too tired for that.'>>
<<case "fuckbuddy">><<Chat $interactionNpc 'I\'m exhausted, rain check?'>>
<<case "rival">><<Chat $interactionNpc 'No, and I\'m tired.'>>
<<case "enemy">><<Chat $interactionNpc 'I\'m way too exhausted.'>>
<<case "archenemy">><<Chat $interactionNpc 'I\'m too worn out.'>>
<<case "hatefuck">><<Chat $interactionNpc 'I\'m too drained.'>>
<<case "crush">><<Chat $interactionNpc 'I\'m too tired for that right now.'>>
<<case "dating">><<Chat $interactionNpc 'Can we make love another time? I\'m exhausted.'>>
<<case "soulmate">><<Chat $interactionNpc 'I\'m too tired, but I love you.'>>
<</switch>>
<div class="btn padding-top"><<button "Back" "enhanced_interaction_system">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<set _currentGender = $interactionNpc.gender()>>
<div class="interaction-result-panel">
<div class="result-banner">
<span class="result-icon">🎭</span>
<span class="result-text">Choose Target Gender</span>
</div>
<div class="result-description">
<<print $interactionNpc.info.firstName>> is currently <<print _currentGender>>. What gender do you want to convince them to become?
</div>
</div>
<div class="btn-container padding-top interaction-choice-buttons">
<<if _currentGender == "Female">>
<div class="btn"><button type="button" disabled>Become Female 👩 - Already Female</button></div>
<<else>>
<div class="btn"><<button "Become Female 👩" "enhanced_interaction_convinceGenderChange_execute">><<set $targetGenderChange = "Female">><</button>></div>
<</if>>
<<if _currentGender == "Male">>
<div class="btn"><button type="button" disabled>Become Male 👨 - Already Male</button></div>
<<else>>
<div class="btn"><<button "Become Male 👨" "enhanced_interaction_convinceGenderChange_execute">><<set $targetGenderChange = "Male">><</button>></div>
<</if>>
<<if _currentGender == "Shemale">>
<div class="btn"><button type="button" disabled>Become Trans 🏳️⚧️ - Already Trans</button></div>
<<else>>
<div class="btn"><<button "Become Trans 🏳️⚧️" "enhanced_interaction_convinceGenderChange_execute">><<set $targetGenderChange = "Trans">><</button>></div>
<</if>>
<div class="btn"><<button "Cancel" "enhanced_interaction_system">><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _interaction = setup.getInteractionDefinition("convinceGenderChange")>>
<<ShowNpcIcon $interactionNpc>>
<<set $interactionResult = setup.performEnhancedInteraction($player, $interactionNpc, "convinceGenderChange")>>
<<if $interactionResult.blocked>>
<<include "enhanced_interaction_result_display">>
<<else>>
<<SpendTime _interaction.timeCost>>
<<SpendEnergy $player _interaction.energyCost>>
<<run setup.applyInteractionEffects($player, $interactionNpc, "convinceGenderChange", $interactionResult)>>
<<ShowNpcIcon $interactionNpc>>
<<set _currentGender = $interactionNpc.gender()>>
<<set _targetGender = $targetGenderChange>>
<<if $interactionResult.criticalSuccess>>
<<if _targetGender == "Female">>
<<Chat $interactionNpc "You know what? You're absolutely right. I've been thinking about this for a while, and... I want to become a woman. I'll start the process right away! 💕">>
<<ChatMessage "They're fully convinced! They'll become female!">>
<<run $interactionNpc.body.vaginaSize.value = 3>>
<<run $interactionNpc.body.penisSize.value = 0>>
<<run $interactionNpc.body.breastSize.increase(3)>>
<<run $interactionNpc.body.face.increase(5)>>
<<run $interactionNpc.body.buttSize.increase(2)>>
<<run $interactionNpc.info.clothesPreference = 'women'>>
<<elseif _targetGender == "Trans">>
<<Chat $interactionNpc "You're right... I've always felt like I was meant to be both. A beautiful woman's body with something extra~ 🏳️⚧️💕">>
<<ChatMessage "They're fully convinced! They'll become a trans woman!">>
<<run $interactionNpc.body.vaginaSize.value = 0>>
<<run $interactionNpc.body.penisSize.value = 3>>
<<run $interactionNpc.body.breastSize.increase(3)>>
<<run $interactionNpc.body.face.increase(5.5)>>
<<run $interactionNpc.body.buttSize.increase(2.5)>>
<<run $interactionNpc.info.clothesPreference = 'women'>>
<<else>>
<<Chat $interactionNpc "You're right! I've always felt more masculine inside. I'm going to transition! 💪">>
<<ChatMessage "They're fully convinced! They'll become male!">>
<<run $interactionNpc.body.vaginaSize.value = 0>>
<<run $interactionNpc.body.penisSize.value = 3>>
<<run $interactionNpc.body.breastSize.decrease(5)>>
<<run $interactionNpc.body.face.decrease(2)>>
<<run $interactionNpc.info.clothesPreference = 'men'>>
<</if>>
<<elseif $interactionResult.criticalFailure>>
<<Chat $interactionNpc "What?! Are you insane?! Why would you even suggest something like that?! I'm perfectly happy with who I am!">>
<<ChatMessage "They're deeply offended by your suggestion!">>
<<elseif $interactionResult.success>>
<<if _targetGender == "Female">>
<<Chat $interactionNpc "I... I've actually thought about becoming a woman before. Maybe you're right... I'll consider it seriously.">>
<<ChatMessage "They're open to feminization. Their body will gradually change.">>
<<run $interactionNpc.saveData.set("consideringGenderChange", "Female")>>
<<run $interactionNpc.body.breastSize.increase(1)>>
<<run $interactionNpc.body.face.increase(1.5)>>
<<run $interactionNpc.body.buttSize.increase(0.5)>>
<<elseif _targetGender == "Trans">>
<<Chat $interactionNpc "Hmm... having the best of both worlds? That's... actually kind of appealing. I'll think about it seriously.">>
<<ChatMessage "They're open to becoming trans. Their body will gradually feminize while keeping their genitals.">>
<<run $interactionNpc.saveData.set("consideringGenderChange", "Trans")>>
<<run $interactionNpc.body.breastSize.increase(1)>>
<<run $interactionNpc.body.face.increase(2)>>
<<run $interactionNpc.body.buttSize.increase(1)>>
<<else>>
<<Chat $interactionNpc "You know... maybe you have a point about being more masculine. I'll think about it.">>
<<ChatMessage "They're open to masculinization. Their body will gradually change.">>
<<run $interactionNpc.saveData.set("consideringGenderChange", "Male")>>
<<run $interactionNpc.body.face.decrease(0.3)>>
<<run $interactionNpc.body.breastSize.decrease(0.5)>>
<</if>>
<<else>>
<<Chat $interactionNpc "I... no, I don't think that's for me. I'm comfortable the way I am.">>
<<ChatMessage "They politely declined. Maybe try again later with a better relationship.">>
<</if>>
<<unset $targetGenderChange>>
<<include "enhanced_interaction_result_display">>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _interaction = setup.getInteractionDefinition("convinceHRT")>>
<<set $interactionResult = setup.performEnhancedInteraction($player, $interactionNpc, "convinceHRT")>>
<<if $interactionResult.blocked>>
<<include "enhanced_interaction_result_display">>
<<else>>
<<SpendTime _interaction.timeCost>>
<<SpendEnergy $player _interaction.energyCost>>
<<run setup.applyInteractionEffects($player, $interactionNpc, "convinceHRT", $interactionResult)>>
<<ShowNpcIcon $interactionNpc>>
<<set _npcGender = $interactionNpc.gender()>>
<<if _npcGender != "Male">>
<<Chat $interactionNpc "Um... I'm already not exactly masculine, you know?">>
<<ChatMessage "This suggestion doesn't quite fit for them.">>
<<elseif $interactionResult.criticalSuccess>>
<<Chat $interactionNpc "You're right! I've been feeling like I should embrace my feminine side more. I'll start hormone therapy right away! This is going to be amazing! 💕">>
<<ChatMessage "They enthusiastically agree! They'll start feminizing each day - faster than usual!">>
<<run $interactionNpc.saveData.set("onHRT", true)>>
<<run $interactionNpc.saveData.set("hrtStartDay", State.variables.day)>>
<<run $interactionNpc.saveData.set("hrtBoost", true)>>
/* Critical success gives a small head start and faster daily feminization */
<<run $interactionNpc.body.face.increase(0.2)>>
<<elseif $interactionResult.criticalFailure>>
<<Chat $interactionNpc "What the hell?! Are you trying to turn me into a woman?! That's messed up! I'm a man and I'm staying that way!">>
<<ChatMessage "They're furious at your suggestion!">>
<<elseif $interactionResult.success>>
<<Chat $interactionNpc "You know... I've actually been curious about what it would be like. You promise to be there for me through the changes?">>
<<ChatMessage "They agree to start hormone therapy! Their body will gradually feminize each day.">>
<<run $interactionNpc.saveData.set("onHRT", true)>>
<<run $interactionNpc.saveData.set("hrtStartDay", State.variables.day)>>
<<else>>
<<Chat $interactionNpc "I... no, that's not for me. I like being a man. Thanks, but no thanks.">>
<<ChatMessage "They declined. Their masculine identity is important to them.">>
<</if>>
<<include "enhanced_interaction_result_display">>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<set _currentPref = $interactionNpc.info.sexualPreference>>
<div class="interaction-result-panel">
<div class="result-banner">
<span class="result-icon">💕</span>
<span class="result-text">Choose Target Orientation</span>
</div>
<div class="result-description">
<<print $interactionNpc.info.firstName>> is currently attracted to: <strong><<print _currentPref>></strong><br>
What orientation do you want to convince them to adopt?
</div>
</div>
<div class="btn-container padding-top interaction-choice-buttons">
<<if _currentPref == "Manly">>
<div class="btn"><button type="button" disabled>Attracted to Men (Manly) 👨 - Already attracted to Men</button></div>
<<else>>
<div class="btn"><<button "Attracted to Men (Manly) 👨" "enhanced_interaction_convinceOrientation_execute">><<set $targetOrientation = "Manly">><</button>></div>
<</if>>
<<if _currentPref == "Feminine">>
<div class="btn"><button type="button" disabled>Attracted to Women (Feminine) 👩 - Already attracted to Women</button></div>
<<else>>
<div class="btn"><<button "Attracted to Women (Feminine) 👩" "enhanced_interaction_convinceOrientation_execute">><<set $targetOrientation = "Feminine">><</button>></div>
<</if>>
<<if _currentPref == "Bi">>
<div class="btn"><button type="button" disabled>Attracted to Both (Bi) 💜 - Already Bisexual</button></div>
<<else>>
<div class="btn"><<button "Attracted to Both (Bi) 💜" "enhanced_interaction_convinceOrientation_execute">><<set $targetOrientation = "Bi">><</button>></div>
<</if>>
<div class="btn"><<button "Cancel" "enhanced_interaction_system">><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _interaction = setup.getInteractionDefinition("convinceOrientationChange")>>
<<set $interactionResult = setup.performEnhancedInteraction($player, $interactionNpc, "convinceOrientationChange")>>
<<if $interactionResult.blocked>>
<<include "enhanced_interaction_result_display">>
<<else>>
<<SpendTime _interaction.timeCost>>
<<SpendEnergy $player _interaction.energyCost>>
<<run setup.applyInteractionEffects($player, $interactionNpc, "convinceOrientationChange", $interactionResult)>>
<<ShowNpcIcon $interactionNpc>>
<<set _currentPref = $interactionNpc.info.sexualPreference>>
<<set _targetPref = $targetOrientation>>
<<if _currentPref == _targetPref>>
<<set _alreadyPrefMsg = "I already prefer " + _targetPref + " people! Did you not know that?">>
<<Chat $interactionNpc _alreadyPrefMsg>>
<<ChatMessage "They already have this orientation!">>
<<elseif $interactionResult.criticalSuccess>>
<<switch _targetPref>>
<<case "Manly">>
<<Chat $interactionNpc "You know what? You're absolutely right. I've been in denial about my attraction to men. I feel so free now! 💕">>
<<ChatMessage "They're now attracted to men!">>
<<case "Feminine">>
<<Chat $interactionNpc "You've opened my eyes! Women are so beautiful... I don't know why I didn't see it before! 💖">>
<<ChatMessage "They're now attracted to women!">>
<<case "Bi">>
<<Chat $interactionNpc "Why limit myself, right? You're so right! Everyone is attractive in their own way! 💜">>
<<ChatMessage "They're now bisexual!">>
<</switch>>
<<run $interactionNpc.info.sexualPreference = _targetPref>>
<<elseif $interactionResult.criticalFailure>>
<<Chat $interactionNpc "Are you trying to change who I am?! That's really manipulative and I don't appreciate it!">>
<<ChatMessage "They're deeply offended!">>
<<elseif $interactionResult.success>>
<<switch _targetPref>>
<<case "Manly">>
<<Chat $interactionNpc "Hmm... I guess men can be attractive. Maybe I should be more open-minded...">>
<<if _currentPref == "Feminine">>
<<run $interactionNpc.info.sexualPreference = "Bi">>
<<ChatMessage "They've become bisexual, now open to men too!">>
<<else>>
<<run $interactionNpc.info.sexualPreference = "Manly">>
<<ChatMessage "They're now attracted to men!">>
<</if>>
<<case "Feminine">>
<<Chat $interactionNpc "Women are pretty amazing, aren't they? Maybe I should explore that side of myself...">>
<<if _currentPref == "Manly">>
<<run $interactionNpc.info.sexualPreference = "Bi">>
<<ChatMessage "They've become bisexual, now open to women too!">>
<<else>>
<<run $interactionNpc.info.sexualPreference = "Feminine">>
<<ChatMessage "They're now attracted to women!">>
<</if>>
<<case "Bi">>
<<Chat $interactionNpc "You make a good point... why should I limit myself? Everyone has something attractive about them.">>
<<run $interactionNpc.info.sexualPreference = "Bi">>
<<ChatMessage "They've become bisexual!">>
<</switch>>
<<else>>
<<Chat $interactionNpc "I know what I like, and I'm comfortable with it. Sorry, that's just not going to happen.">>
<<ChatMessage "They're firm in their current orientation.">>
<</if>>
<<unset $targetOrientation>>
<<include "enhanced_interaction_result_display">>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _interaction = setup.getInteractionDefinition("discussFeminization")>>
<<set $interactionResult = setup.performEnhancedInteraction($player, $interactionNpc, "discussFeminization")>>
<<if $interactionResult.blocked>>
<<include "enhanced_interaction_result_display">>
<<else>>
<<SpendTime _interaction.timeCost>>
<<SpendEnergy $player _interaction.energyCost>>
<<run setup.applyInteractionEffects($player, $interactionNpc, "discussFeminization", $interactionResult)>>
<<ShowNpcIcon $interactionNpc>>
/* Calculate feminization stage based on actual physical changes */
<<set _faceValue = $interactionNpc.body.face.value>>
<<set _breastValue = $interactionNpc.body.breastSize.value>>
<<set _buttValue = $interactionNpc.body.buttSize.value>>
/* Determine stage based on physical feminization (face is main indicator) */
/* Stage 0: Just started (face < 2) */
/* Stage 1: Early changes (face 2-3.5) */
/* Stage 2: Noticeable changes (face 3.5-5) */
/* Stage 3: Significant feminization (face 5-6.5) */
/* Stage 4: Nearly complete (face 6.5-8) */
/* Stage 5: Complete feminization (face >= 8) */
<<if _faceValue < 2>>
<<set _feminizationStage = 0>>
<<elseif _faceValue < 3.5>>
<<set _feminizationStage = 1>>
<<elseif _faceValue < 5>>
<<set _feminizationStage = 2>>
<<elseif _faceValue < 6.5>>
<<set _feminizationStage = 3>>
<<elseif _faceValue < 8>>
<<set _feminizationStage = 4>>
<<else>>
<<set _feminizationStage = 5>>
<</if>>
/* Also save the stage for reference */
<<run $interactionNpc.saveData.set("feminizationStage", _feminizationStage)>>
<<if $interactionResult.criticalSuccess>>
<<switch _feminizationStage>>
<<case 0>>
<<Chat $interactionNpc "I just started, but I'm so excited! I can already feel the hormones working... my skin feels different somehow. This is the beginning of something amazing! 💕">>
<<ChatMessage "They just started HRT - the journey begins!">>
<<case 1>>
<<Chat $interactionNpc "It's been a little while now, and I'm noticing small changes! My skin is softer, and I'm more emotional... in a good way! Thank you for supporting me! 💕">>
<<ChatMessage "Early hormone changes are starting!">>
<<case 2>>
<<Chat $interactionNpc "Look at this! *gestures to chest* It's actually happening! I can feel buds forming! And my face... it's getting softer! I love it! 💖">>
<<ChatMessage "They're thrilled with their developing body!">>
<<case 3>>
<<Chat $interactionNpc "People are starting to notice my changes! My breasts are really growing now, and my face looks so different! Someone called me 'she' today! Thank you for encouraging me! 💕">>
<<ChatMessage "They're ecstatic about their visible transformation!">>
<<case 4>>
<<Chat $interactionNpc "I barely recognize myself in the mirror anymore, and I love it! My curves are so feminine now... I feel like I'm finally becoming who I was meant to be! 🌸">>
<<ChatMessage "They're deeply grateful - nearly a complete woman!">>
<<default>>
<<Chat $interactionNpc "I'm a woman now, thanks to you! Look at me! *twirls* My face, my body... I never thought I could be this beautiful. You changed my life! 💖💖💖">>
<<ChatMessage "Their feminization is complete - they're overjoyed!">>
<</switch>>
<<elseif $interactionResult.criticalFailure>>
<<switch _feminizationStage>>
<<case 0 1>>
<<Chat $interactionNpc "I... I'm having second thoughts. Is this really the right choice? I've barely started...">>
<<ChatMessage "They're doubting their decision early on...">>
<<default>>
<<Chat $interactionNpc "Sometimes I look in the mirror and I don't know who I am anymore... Was this the right choice?">>
<<ChatMessage "They're experiencing doubts about their transition...">>
<</switch>>
<<elseif $interactionResult.success>>
<<switch _feminizationStage>>
<<case 0>>
<<Chat $interactionNpc "I just started taking the hormones. I don't see any changes yet, but I'm a little nervous... and excited. Will you check on me again soon?">>
<<ChatMessage "They've just begun - no visible changes yet.">>
<<case 1>>
<<Chat $interactionNpc "It's strange... I feel different. More sensitive, I think? My nipples are a bit sore, and my skin seems softer. Is this really happening?">>
<<ChatMessage "Early hormone effects - subtle changes beginning.">>
<<case 2>>
<<Chat $interactionNpc "Okay, so... *blushes* ...I'm definitely growing breasts. They're small, but they're there! And my face... do I look different to you?">>
<<ChatMessage "Breast buds forming, face softening!">>
<<case 3>>
<<Chat $interactionNpc "My body is really changing now. Look at my chest! *cups breasts* They're actually breasts now! And my hips are wider, my skin is so soft... I need new clothes. 😊">>
<<ChatMessage "Significant feminization - clearly changing!">>
<<case 4>>
<<Chat $interactionNpc "I got called 'miss' at the store today without even trying! *happy smile* My face is so different now, and my body... I really look like a woman, don't I?">>
<<ChatMessage "Passing as female - almost complete!">>
<<default>>
<<Chat $interactionNpc "Look at me... *shows off body* ...I'm a woman now. I can't believe how much I've changed. My face, my curves... this is who I was meant to be. Thank you for helping me see that.">>
<<ChatMessage "Feminization complete - full transformation!">>
<</switch>>
<<else>>
<<switch _feminizationStage>>
<<case 0 1>>
<<Chat $interactionNpc "I don't really want to talk about it... it's too early to say if anything is happening.">>
<<default>>
<<Chat $interactionNpc "Can we... not talk about this right now? I'm still processing all these changes.">>
<</switch>>
<<ChatMessage "They seem reluctant to discuss their changes.">>
<</if>>
<<include "enhanced_interaction_result_display">>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _interaction = setup.getInteractionDefinition("compliment")>>
<<set $interactionResult = setup.performEnhancedInteraction($player, $interactionNpc, "compliment")>>
<<if $interactionResult.blocked>>
<<include "enhanced_interaction_result_display">>
<<else>>
<<SpendTime _interaction.timeCost>>
<<SpendEnergy $player _interaction.energyCost>>
<<run setup.applyInteractionEffects($player, $interactionNpc, "compliment", $interactionResult)>>
<<ShowNpcIcon $interactionNpc>>
<<if $interactionResult.criticalSuccess>>
<<Chat $interactionNpc "Oh my... that's the most beautiful compliment I've ever received! I'm blushing! 😳💕">>
<<ChatMessage "Your compliment went straight to their heart!">>
<<elseif $interactionResult.criticalFailure>>
<<Chat $interactionNpc "Was that... supposed to be a compliment? Sounds more like an insult.">>
<<ChatMessage "The compliment came out awkward and was taken negatively.">>
<<elseif $interactionResult.success>>
<<set _relation = $player.getRelationship($interactionNpc.info.id, false)?.relation ?? "acquaintance">>
<<switch _relation>>
<<case "crush">>
<<Chat $interactionNpc "T-thank you... you're pretty... nice too... 😊">>
<<case "dating" "soulmate">>
<<Chat $interactionNpc "You're so sweet! I love it when you talk like that!">>
<<case "friend" "bestFriend">>
<<Chat $interactionNpc "Aww, thanks! You're not so bad yourself! 😄">>
<<case "fuckbuddy">>
<<Chat $interactionNpc "Heh, thanks. You're not bad either 😏">>
<<default>>
<<Chat $interactionNpc "Oh, thank you! That's really sweet of you.">>
<</switch>>
<<ChatMessage "The compliment was appreciated!">>
<<else>>
<<Chat $interactionNpc "Uh... thanks, I guess?">>
<<ChatMessage "The compliment didn't land.">>
<</if>>
<<include "enhanced_interaction_result_display">>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "enhanced_interaction_jealousy_check">>
<<if _jealousIntervene>>
<<include "jealous_partner_intervenes">>
<<elseif _playerPartnerIntervene>>
<<include "player_partner_confrontation">>
<<else>>
<<set _interaction = setup.getInteractionDefinition("flirt")>>
<<set $interactionResult = setup.performEnhancedInteraction($player, $interactionNpc, "flirt")>>
<<if $interactionResult.blocked>>
<<include "enhanced_interaction_result_display">>
<<else>>
<<SpendTime _interaction.timeCost>>
<<SpendEnergy $player _interaction.energyCost>>
<<run setup.applyInteractionEffects($player, $interactionNpc, "flirt", $interactionResult)>>
<<ShowNpcIcon $interactionNpc>>
<<if $interactionResult.criticalSuccess>>
<<Chat $interactionNpc "Oh my... you know how to charm with words... I'm getting hot! 🔥">>
<<ChatMessage "Your flirting was irresistible! NPC is clearly interested!">>
<<elseif $interactionResult.criticalFailure>>
<<Chat $interactionNpc "That was... really weird and inappropriate. Please don't.">>
<<ChatMessage "Your flirt attempt was extremely awkward.">>
<<elseif $interactionResult.success>>
<<set _relation = $player.getRelationship($interactionNpc.info.id, false)?.relation ?? "acquaintance">>
<<switch _relation>>
<<case "crush">>
<<Chat $interactionNpc "Are you flirting with me? I like it... 💗">>
<<case "dating" "soulmate">>
<<Chat $interactionNpc "Mmm, keep going like that, honey... 😘">>
<<case "fuckbuddy">>
<<Chat $interactionNpc "Oh, someone's in the mood today? I like it.">>
<<case "friend">>
<<Chat $interactionNpc "Haha, you're so playful today!">>
<<default>>
<<Chat $interactionNpc "Ooh, someone's bold! I like it.">>
<</switch>>
<<ChatMessage "Flirting was successful!">>
<<else>>
<<Chat $interactionNpc "Let's just... pretend that didn't happen.">>
<<ChatMessage "Flirting failed.">>
<</if>>
<<include "enhanced_interaction_result_display">>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "enhanced_interaction_jealousy_check">>
<<if _jealousIntervene>>
<<include "jealous_partner_intervenes">>
<<elseif _playerPartnerIntervene>>
<<include "player_partner_confrontation">>
<<else>>
<<set _interaction = setup.getInteractionDefinition("holdHands")>>
<<set $interactionResult = setup.performEnhancedInteraction($player, $interactionNpc, "holdHands")>>
<<if $interactionResult.blocked>>
<<include "enhanced_interaction_result_display">>
<<else>>
<<SpendTime _interaction.timeCost>>
<<SpendEnergy $player _interaction.energyCost>>
<<run setup.applyInteractionEffects($player, $interactionNpc, "holdHands", $interactionResult)>>
<<ShowNpcIcon $interactionNpc>>
<<if $interactionResult.criticalSuccess>>
<<Chat $interactionNpc "Your hand is so warm... I don't want to let go... 🥰">>
<<ChatMessage "This moment was special. You feel close!">>
<<elseif $interactionResult.criticalFailure>>
<<Chat $interactionNpc "What are you doing?! Let go of my hand!">>
<<ChatMessage "NPC pulled their hand away sharply!">>
<<elseif $interactionResult.success>>
<<set _relation = $player.getRelationship($interactionNpc.info.id, false)?.relation ?? "acquaintance">>
<<switch _relation>>
<<case "crush">>
<<Chat $interactionNpc "Oh... okay... I like this... 😳">>
<<case "dating" "soulmate">>
<<Chat $interactionNpc "I love holding hands with you. 💑">>
<<default>>
<<Chat $interactionNpc "This is... nice.">>
<</switch>>
<<ChatMessage "You're holding hands.">>
<<else>>
<<Chat $interactionNpc "Sorry... I'm not ready for that...">>
<<ChatMessage "NPC gently pulled their hand away.">>
<</if>>
<<include "enhanced_interaction_result_display">>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "enhanced_interaction_jealousy_check">>
<<if _jealousIntervene>>
<<include "jealous_partner_intervenes">>
<<elseif _playerPartnerIntervene>>
<<include "player_partner_confrontation">>
<<else>>
<<set _interaction = setup.getInteractionDefinition("hug")>>
<<set $interactionResult = setup.performEnhancedInteraction($player, $interactionNpc, "hug")>>
<<if $interactionResult.blocked>>
<<include "enhanced_interaction_result_display">>
<<else>>
<<SpendTime _interaction.timeCost>>
<<SpendEnergy $player _interaction.energyCost>>
<<run setup.applyInteractionEffects($player, $interactionNpc, "hug", $interactionResult)>>
<<ShowNpcIcon $interactionNpc>>
<<if $interactionResult.criticalSuccess>>
<<Chat $interactionNpc "I feel so good in your arms... Don't let go... 🤗💕">>
<<ChatMessage "The warmest hug ever! NPC feels safe!">>
<<elseif $interactionResult.criticalFailure>>
<<Chat $interactionNpc "Hey! What are you doing?! Back off!">>
<<ChatMessage "NPC pushed you away!">>
<<elseif $interactionResult.success>>
<<set _relation = $player.getRelationship($interactionNpc.info.id, false)?.relation ?? "acquaintance">>
<<switch _relation>>
<<case "bestFriend">>
<<Chat $interactionNpc "Love your hugs! Gimme more!">>
<<case "crush">>
<<Chat $interactionNpc "Oh... this feels so nice... 😊">>
<<case "dating" "soulmate">>
<<Chat $interactionNpc "I could hug you forever... 💏">>
<<case "friend">>
<<Chat $interactionNpc "Warm hugs! Thanks!">>
<<default>>
<<Chat $interactionNpc "That was... nice.">>
<</switch>>
<<ChatMessage "You hugged.">>
<<else>>
<<Chat $interactionNpc "Sorry, I'm not in the mood for hugs right now...">>
<<ChatMessage "NPC avoided the hug.">>
<</if>>
<<include "enhanced_interaction_result_display">>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "enhanced_interaction_jealousy_check">>
<<if _jealousIntervene>>
<<include "jealous_partner_intervenes">>
<<elseif _playerPartnerIntervene>>
<<include "player_partner_confrontation">>
<<else>>
<<set _interaction = setup.getInteractionDefinition("confessLove")>>
<<set $interactionResult = setup.performEnhancedInteraction($player, $interactionNpc, "confessLove")>>
<<if $interactionResult.blocked>>
<<include "enhanced_interaction_result_display">>
<<else>>
<<SpendTime _interaction.timeCost>>
<<SpendEnergy $player _interaction.energyCost>>
<<run setup.applyInteractionEffects($player, $interactionNpc, "confessLove", $interactionResult)>>
<<ShowNpcIcon $interactionNpc>>
<<if $interactionResult.criticalSuccess>>
<<Chat $interactionNpc "I... I love you too! I've been waiting so long to hear that! 💖😭">>
<<ChatMessage "MUTUAL FEELINGS! Your hearts beat as one!">>
<<elseif $interactionResult.criticalFailure>>
<<Chat $interactionNpc "I... I'm really sorry, but I don't feel the same. And the way you said it was... awkward.">>
<<ChatMessage "Your confession was harshly rejected. It hurts.">>
<<elseif $interactionResult.success>>
<<set _relation = $player.getRelationship($interactionNpc.info.id, false)?.relation ?? "acquaintance">>
<<switch _relation>>
<<case "crush">>
<<Chat $interactionNpc "Really? I... I feel something for you too... 💗">>
<<case "friend" "bestFriend">>
<<Chat $interactionNpc "Wow... I wasn't expecting that. I need to think, but... I'm flattered.">>
<<case "dating">>
<<Chat $interactionNpc "I know, honey. I love you too! 💕">>
<<case "soulmate">>
<<Chat $interactionNpc "My love for you knows no bounds. You're my everything. 💞">>
<<default>>
<<Chat $interactionNpc "That's... unexpected. But I'm glad to hear it...">>
<</switch>>
<<ChatMessage "Your confession was accepted!">>
<<else>>
<<Chat $interactionNpc "Sorry... but I don't think I feel the same way.">>
<<ChatMessage "Your confession was gently declined.">>
<</if>>
/* Grants, status, money and resentment: one source, shared with the AI chat. */
<<set _consequences = setup.applyInteractionConsequences($player, $interactionNpc, "confessLove", $interactionResult)>>
<<include "enhanced_interaction_result_display">>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "enhanced_interaction_jealousy_check">>
<<if _jealousIntervene>>
<<include "jealous_partner_intervenes">>
<<elseif _playerPartnerIntervene>>
<<include "player_partner_confrontation">>
<<else>>
<<set _interaction = setup.getInteractionDefinition("proposeDate")>>
<<set $interactionResult = setup.performEnhancedInteraction($player, $interactionNpc, "proposeDate")>>
<<if $interactionResult.blocked>>
<<include "enhanced_interaction_result_display">>
<<else>>
<<SpendTime _interaction.timeCost>>
<<SpendEnergy $player _interaction.energyCost>>
<<run setup.applyInteractionEffects($player, $interactionNpc, "proposeDate", $interactionResult)>>
<<ShowNpcIcon $interactionNpc>>
<<if $interactionResult.criticalSuccess>>
<<Chat $interactionNpc "YES! I've been waiting for you to ask! It's going to be the best date ever! 💐🎉">>
<<ChatMessage "NPC is absolutely thrilled by your invitation!">>
<<elseif $interactionResult.criticalFailure>>
<<Chat $interactionNpc "A date? With you? No thanks. Please don't ask again.">>
<<ChatMessage "Your invitation was harshly rejected.">>
<<elseif $interactionResult.success>>
<<set _relation = $player.getRelationship($interactionNpc.info.id, false)?.relation ?? "acquaintance">>
<<switch _relation>>
<<case "crush">>
<<Chat $interactionNpc "A d-date? With you? Yes! Of course yes! 😍">>
<<case "friend" "bestFriend">>
<<Chat $interactionNpc "Like a date-date? Hmm... why not! Let's try it!">>
<<case "dating" "soulmate">>
<<Chat $interactionNpc "Of course, honey! I always love spending time with you! 💑">>
<<default>>
<<Chat $interactionNpc "A date? Hmm... alright, let's try it!">>
<</switch>>
<<ChatMessage "Date invitation accepted!">>
<<else>>
<<Chat $interactionNpc "Sorry, but I don't think that's a good idea...">>
<<ChatMessage "Invitation was declined.">>
<</if>>
<<include "enhanced_interaction_result_display">>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _interaction = setup.getInteractionDefinition("playfulTease")>>
<<set $interactionResult = setup.performEnhancedInteraction($player, $interactionNpc, "playfulTease")>>
<<if $interactionResult.blocked>>
<<include "enhanced_interaction_result_display">>
<<else>>
<<SpendTime _interaction.timeCost>>
<<SpendEnergy $player _interaction.energyCost>>
<<run setup.applyInteractionEffects($player, $interactionNpc, "playfulTease", $interactionResult)>>
<<ShowNpcIcon $interactionNpc>>
<<if $interactionResult.criticalSuccess>>
<<Chat $interactionNpc "Haha! You're so playful! I love it! 😏💕">>
<<ChatMessage "Your teasing was incredibly charming!">>
<<elseif $interactionResult.criticalFailure>>
<<Chat $interactionNpc "That was hurtful! You crossed the line!">>
<<ChatMessage "The joke went too far and upset NPC.">>
<<elseif $interactionResult.success>>
<<Chat $interactionNpc "Hey! Haha, is that so? Just you wait, I'll get you back! 😄">>
<<ChatMessage "Playful teasing was successful!">>
<<else>>
<<Chat $interactionNpc "That's not funny...">>
<<ChatMessage "The teasing wasn't appreciated.">>
<</if>>
<<include "enhanced_interaction_result_display">>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _interaction = setup.getInteractionDefinition("playGame")>>
<<set $interactionResult = setup.performEnhancedInteraction($player, $interactionNpc, "playGame")>>
<<if $interactionResult.blocked>>
<<include "enhanced_interaction_result_display">>
<<else>>
<<SpendTime _interaction.timeCost>>
<<SpendEnergy $player _interaction.energyCost>>
<<run setup.applyInteractionEffects($player, $interactionNpc, "playGame", $interactionResult)>>
<<ShowNpcIcon $interactionNpc>>
<<if $interactionResult.criticalSuccess>>
<<Chat $interactionNpc "That was INCREDIBLE! Let's play more! I haven't had this much fun in ages! 🎮🎉">>
<<ChatMessage "You had an amazing time together!">>
<<elseif $interactionResult.criticalFailure>>
<<Chat $interactionNpc "You're cheating! I'm not playing with you anymore!">>
<<ChatMessage "The game ended in an argument.">>
<<elseif $interactionResult.success>>
<<Chat $interactionNpc "Good game! That was fun!">>
<<ChatMessage "You had a great time playing together.">>
<<else>>
<<Chat $interactionNpc "Hmm, not really into this game...">>
<<ChatMessage "The game didn't interest them.">>
<</if>>
<<include "enhanced_interaction_result_display">>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "enhanced_interaction_busy_check">>
<<set _interaction = setup.getInteractionDefinition("comfort")>>
<<if _isBusy>>
<<ShowNpcIcon $interactionNpc>>
<<Chat $interactionNpc "Thanks for caring, but I need some time alone...">>
<div class="btn padding-top"><<button "Back" "enhanced_interaction_system">><</button>></div>
<<else>>
<<set $interactionResult = setup.performEnhancedInteraction($player, $interactionNpc, "comfort")>>
<<if $interactionResult.blocked>>
<<include "enhanced_interaction_result_display">>
<<else>>
<<SpendTime _interaction.timeCost>>
<<SpendEnergy $player _interaction.energyCost>>
<<run setup.applyInteractionEffects($player, $interactionNpc, "comfort", $interactionResult)>>
<<ShowNpcIcon $interactionNpc>>
<<if $interactionResult.criticalSuccess>>
<<Chat $interactionNpc "I... I don't know what to say. No one has ever cared for me like this... 😢💕">>
<<ChatMessage "Your words touched their heart. NPC feels truly supported.">>
<<elseif $interactionResult.criticalFailure>>
<<Chat $interactionNpc "Please don't... you're only making it worse!">>
<<ChatMessage "Your attempt to comfort had the opposite effect.">>
<<elseif $interactionResult.success>>
<<set _relation = $player.getRelationship($interactionNpc.info.id, false)?.relation ?? "acquaintance">>
<<switch _relation>>
<<case "friend" "bestFriend">>
<<Chat $interactionNpc "Thanks for being here. It really helps...">>
<<case "dating" "soulmate">>
<<Chat $interactionNpc "Thank you, sweetheart. I always feel better with you...">>
<<case "crush">>
<<Chat $interactionNpc "You're so kind... Thank you.">>
<<default>>
<<Chat $interactionNpc "Thanks for the support. It means a lot.">>
<</switch>>
<<ChatMessage "You successfully comforted them.">>
<<else>>
<<Chat $interactionNpc "Thanks, but it's not helping...">>
<<ChatMessage "The comfort didn't reach them.">>
<</if>>
<<include "enhanced_interaction_result_display">>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _interaction = setup.getInteractionDefinition("encourage")>>
<<set $interactionResult = setup.performEnhancedInteraction($player, $interactionNpc, "encourage")>>
<<if $interactionResult.blocked>>
<<include "enhanced_interaction_result_display">>
<<else>>
<<SpendTime _interaction.timeCost>>
<<SpendEnergy $player _interaction.energyCost>>
<<run setup.applyInteractionEffects($player, $interactionNpc, "encourage", $interactionResult)>>
<<ShowNpcIcon $interactionNpc>>
<<if $interactionResult.criticalSuccess>>
<<Chat $interactionNpc "You're right! I can do this! Thanks for believing in me! 💪✨">>
<<ChatMessage "Your words inspired greatness! NPC is full of enthusiasm!">>
<<elseif $interactionResult.criticalFailure>>
<<Chat $interactionNpc "Easy for you to say... you don't understand.">>
<<ChatMessage "Your encouragement seemed insincere.">>
<<elseif $interactionResult.success>>
<<Chat $interactionNpc "Thanks! Your words give me strength.">>
<<ChatMessage "You successfully encouraged them!">>
<<else>>
<<Chat $interactionNpc "Yeah, I guess... thanks.">>
<<ChatMessage "The encouragement didn't have much effect.">>
<</if>>
<<include "enhanced_interaction_result_display">>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _interaction = setup.getInteractionDefinition("offerHelp")>>
<<set $interactionResult = setup.performEnhancedInteraction($player, $interactionNpc, "offerHelp")>>
<<if $interactionResult.blocked>>
<<include "enhanced_interaction_result_display">>
<<else>>
<<SpendTime _interaction.timeCost>>
<<SpendEnergy $player _interaction.energyCost>>
<<run setup.applyInteractionEffects($player, $interactionNpc, "offerHelp", $interactionResult)>>
<<ShowNpcIcon $interactionNpc>>
<<if $interactionResult.criticalSuccess>>
<<Chat $interactionNpc "You really want to help? That's... incredibly kind of you! 🙏">>
<<ChatMessage "Your offer deeply touched NPC!">>
<<elseif $interactionResult.criticalFailure>>
<<Chat $interactionNpc "No thanks, I can manage myself. I don't need help!">>
<<ChatMessage "NPC proudly refused. Seems like it hurt their pride.">>
<<elseif $interactionResult.success>>
<<Chat $interactionNpc "Really? That would be great! Thanks!">>
<<ChatMessage "NPC gratefully accepted your help.">>
<<else>>
<<Chat $interactionNpc "Thanks for offering, but I'll manage on my own.">>
<<ChatMessage "Help wasn't needed.">>
<</if>>
<<include "enhanced_interaction_result_display">>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _interaction = setup.getInteractionDefinition("apologize")>>
<<set $interactionResult = setup.performEnhancedInteraction($player, $interactionNpc, "apologize")>>
<<if $interactionResult.blocked>>
<<include "enhanced_interaction_result_display">>
<<else>>
<<SpendTime _interaction.timeCost>>
<<SpendEnergy $player _interaction.energyCost>>
<<run setup.applyInteractionEffects($player, $interactionNpc, "apologize", $interactionResult)>>
<<ShowNpcIcon $interactionNpc>>
<<if $interactionResult.criticalSuccess>>
<<Chat $interactionNpc "I can see you're truly sorry. I forgive you... let's start fresh. 🕊️">>
<<ChatMessage "Your apology was fully accepted! All grudges forgotten.">>
<<elseif $interactionResult.criticalFailure>>
<<Chat $interactionNpc "Apologize?! After everything you did?! Don't even try!">>
<<ChatMessage "Your apology was rejected with outrage!">>
<<elseif $interactionResult.success>>
<<set _relation = $player.getRelationship($interactionNpc.info.id, false)?.relation ?? "acquaintance">>
<<switch _relation>>
<<case "friend" "bestFriend">>
<<Chat $interactionNpc "Alright, everyone makes mistakes. I forgive you.">>
<<case "dating" "soulmate">>
<<Chat $interactionNpc "Okay... I love you, no matter what.">>
<<case "enemy" "archenemy">>
<<Chat $interactionNpc "Hmm... we'll see how sincere you are.">>
<<case "rival">>
<<Chat $interactionNpc "Unexpected. Fine, apology accepted.">>
<<default>>
<<Chat $interactionNpc "Thanks for apologizing. I appreciate it.">>
<</switch>>
<<ChatMessage "Apology accepted.">>
<<else>>
<<Chat $interactionNpc "Words are just words. I'm not sure I can forgive.">>
<<ChatMessage "Apology was not accepted. Things got a bit worse.">>
<</if>>
/* Resentment changes: setup.applyInteractionConsequences (one source, shared with the AI chat). */
<<set _consequences = setup.applyInteractionConsequences($player, $interactionNpc, "apologize", $interactionResult)>>
<<include "enhanced_interaction_result_display">>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
/* Check if NPC has a family */
<<set _familyInfo = setup.getNpcFamilyInfo($interactionNpc.info.id)>>
<<if _familyInfo == null>>
<<include "enhanced_interaction_askAboutFamily_no_family">>
<<else>>
<<include "enhanced_interaction_busy_check">>
<<set _interaction = setup.getInteractionDefinition("askAboutFamily")>>
<<if _isBusy>>
<<ShowNpcIcon $interactionNpc>>
<<Chat $interactionNpc "Sorry, I don't have time to chat about that right now...">>
<div class="btn padding-top"><<button "Back" "enhanced_interaction_system">><</button>></div>
<<else>>
<<set $interactionResult = setup.performEnhancedInteraction($player, $interactionNpc, "askAboutFamily")>>
<<if $interactionResult.blocked>>
<<include "enhanced_interaction_result_display">>
<<else>>
<<SpendTime _interaction.timeCost>>
<<SpendEnergy $player _interaction.energyCost>>
<<run setup.applyInteractionEffects($player, $interactionNpc, "askAboutFamily", $interactionResult)>>
<<if $interactionResult.criticalSuccess>>
<<include "enhanced_interaction_askAboutFamily_crit_success">>
<<elseif $interactionResult.criticalFailure>>
<<include "enhanced_interaction_askAboutFamily_crit_failure">>
<<elseif $interactionResult.success>>
<<include "enhanced_interaction_askAboutFamily_success">>
<<else>>
<<include "enhanced_interaction_askAboutFamily_failure">>
<</if>>
<</if>>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<ShowNpcIcon $interactionNpc>>
<<set _roll = random(1, 3)>>
<<switch _roll>>
<<case 1>>
<<Chat $interactionNpc "I'd rather not talk about that... I don't really have a family.">>
<<case 2>>
<<Chat $interactionNpc "Family? That's... a complicated topic for me. I'm on my own.">>
<<case 3>>
<<Chat $interactionNpc "I don't have anyone I'd call family. Can we talk about something else?">>
<</switch>>
<div class="btn padding-top"><<button "Back" "enhanced_interaction_system">><</button>></div>
<</nobr>><<nobr>>
<<ShowNpcIcon $interactionNpc>>
<<set _familyInfo = setup.getNpcFamilyInfo($interactionNpc.info.id)>>
<<if _familyInfo.isParent>>
<<if _familyInfo.childrenCount > 0>>
<<set _childList = _familyInfo.childrenNames.join(", ")>>
<<set _childWord = _familyInfo.childrenCount == 1 ? "child" : "children">>
<<set _msg = "I live with my partner " + _familyInfo.parent1Name + " - well, actually we're the " + _familyInfo.surname + " family. We have " + _familyInfo.childrenCount + " " + _childWord + ": " + _childList + ". They keep us busy!">>
<<Chat $interactionNpc _msg>>
<<else>>
<<set _msg = "It's just me and my partner in the " + _familyInfo.surname + " household. We like our quiet life.">>
<<Chat $interactionNpc _msg>>
<</if>>
<<else>>
<<set _msg = "I'm part of the " + _familyInfo.surname + " family. My parents are " + _familyInfo.parent1Name + " and " + _familyInfo.parent2Name + ".">>
<<Chat $interactionNpc _msg>>
<<if _familyInfo.siblingCount > 0>>
<<set _sibList = _familyInfo.siblingNames.join(", ")>>
<<set _sibWord = _familyInfo.siblingCount == 1 ? "sibling" : "siblings">>
<<set _msg = "I also have " + _familyInfo.siblingCount + " " + _sibWord + ": " + _sibList + ".">>
<<Chat $interactionNpc _msg>>
<<else>>
<<Chat $interactionNpc "I'm an only child, so it was always just the three of us.">>
<</if>>
<</if>>
<<run $player.characterEvents.registerEvent($interactionNpc.info.id, "discovered_family", 1)>>
<<include "enhanced_interaction_result_display">>
<</nobr>><<nobr>>
<<ShowNpcIcon $interactionNpc>>
<<set _roll = random(1, 3)>>
<<switch _roll>>
<<case 1>>
<<Chat $interactionNpc "I don't really feel like talking about my family right now...">>
<<case 2>>
<<Chat $interactionNpc "That's kind of personal. Maybe ask me another time?">>
<<case 3>>
<<Chat $interactionNpc "Hmm... I'd rather not get into that. It's complicated.">>
<</switch>>
<<include "enhanced_interaction_result_display">>
<</nobr>><<nobr>>
<<ShowNpcIcon $interactionNpc>>
<<set _familyInfo = setup.getNpcFamilyInfo($interactionNpc.info.id)>>
<<if _familyInfo.isParent>>
<<if _familyInfo.childrenCount > 0>>
<<set _childList = _familyInfo.childrenNames.join(", ")>>
<<set _kidPart = _familyInfo.childrenCount == 1 ? "kid " + _childList + " is" : "kids - " + _childList + " - are">>
<<set _msg = "You know, I'm so glad you asked! The " + _familyInfo.surname + " family is my whole world. My " + _kidPart + " everything to me. I feel like I can really open up to you about this.">>
<<Chat $interactionNpc _msg>>
<<else>>
<<set _msg = "Thank you for asking! My partner and I - the " + _familyInfo.surname + "s - we have such a special bond. It means a lot that you care enough to ask.">>
<<Chat $interactionNpc _msg>>
<</if>>
<<else>>
<<set _sibList = _familyInfo.siblingNames.join(", ")>>
<<set _msg = "Wow, no one usually asks about my family! I'm a " + _familyInfo.surname + ". My parents are " + _familyInfo.parent1Name + " and " + _familyInfo.parent2Name + " - they're amazing.">>
<<Chat $interactionNpc _msg>>
<<if _familyInfo.siblingCount > 0>>
<<set _sibPart = _familyInfo.siblingCount == 1 ? "sibling " + _sibList : "siblings - " + _sibList>>
<<set _msg = "And my " + _sibPart + "? We're super close. I feel like I can tell you anything!">>
<<Chat $interactionNpc _msg>>
<<else>>
<<Chat $interactionNpc "Being an only child has its perks, but sometimes I wish I had siblings. Thanks for listening - it really means a lot!">>
<</if>>
<</if>>
<<ChatMessage "You showed genuine interest in their family and they really opened up to you!">>
<<run $player.characterEvents.registerEvent($interactionNpc.info.id, "discovered_family", 1)>>
<<include "enhanced_interaction_result_display">>
<</nobr>><<nobr>>
<<ShowNpcIcon $interactionNpc>>
<<set _roll = random(1, 2)>>
<<switch _roll>>
<<case 1>>
<<Chat $interactionNpc "Why do you want to know about my family?! That's none of your business!">>
<<ChatMessage "Your question came across as nosy and intrusive.">>
<<case 2>>
<<Chat $interactionNpc "You're asking about my family? After the way you've been acting? No way.">>
<<ChatMessage "The timing of your question was terrible and they took it the wrong way.">>
<</switch>>
<<include "enhanced_interaction_result_display">>
<</nobr>><<nobr>>
<<include "UpdateAll">>
/* Check if NPC has a family */
<<set _familyInfo = setup.getNpcFamilyInfo($interactionNpc.info.id)>>
<<if _familyInfo == null>>
<<include "enhanced_interaction_talkAboutParents_no_family">>
<<else>>
<<include "enhanced_interaction_busy_check">>
<<set _interaction = setup.getInteractionDefinition("talkAboutParents")>>
<<if _isBusy>>
<<ShowNpcIcon $interactionNpc>>
<<Chat $interactionNpc "I'm not in the mood for a heart-to-heart right now...">>
<div class="btn padding-top"><<button "Back" "enhanced_interaction_system">><</button>></div>
<<else>>
<<set $interactionResult = setup.performEnhancedInteraction($player, $interactionNpc, "talkAboutParents")>>
<<if $interactionResult.blocked>>
<<include "enhanced_interaction_result_display">>
<<else>>
<<SpendTime _interaction.timeCost>>
<<SpendEnergy $player _interaction.energyCost>>
<<run setup.applyInteractionEffects($player, $interactionNpc, "talkAboutParents", $interactionResult)>>
<<if $interactionResult.criticalSuccess>>
<<include "enhanced_interaction_talkAboutParents_crit_success">>
<<elseif $interactionResult.criticalFailure>>
<<include "enhanced_interaction_talkAboutParents_crit_failure">>
<<elseif $interactionResult.success>>
<<include "enhanced_interaction_talkAboutParents_success">>
<<else>>
<<include "enhanced_interaction_talkAboutParents_failure">>
<</if>>
<</if>>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<ShowNpcIcon $interactionNpc>>
<<set _roll = random(1, 3)>>
<<switch _roll>>
<<case 1>>
<<Chat $interactionNpc "Parents? I... I never really had that. Let's change the subject.">>
<<case 2>>
<<Chat $interactionNpc "I don't want to talk about parents. That's a sore spot for me.">>
<<case 3>>
<<Chat $interactionNpc "I grew up without parents, so... yeah. Not much to say there.">>
<</switch>>
<div class="btn padding-top"><<button "Back" "enhanced_interaction_system">><</button>></div>
<</nobr>><<nobr>>
<<ShowNpcIcon $interactionNpc>>
<<set _familyInfo = setup.getNpcFamilyInfo($interactionNpc.info.id)>>
<<if _familyInfo.isParent>>
/* This NPC IS a parent - talk about being one */
<<set _roll = random(1, 3)>>
<<switch _roll>>
<<case 1>>
<<set _msg = "Being a parent is hard work, but I wouldn't trade it for anything. The " + _familyInfo.surname + " household is always full of life.">>
<<Chat $interactionNpc _msg>>
<<case 2>>
<<Chat $interactionNpc "My partner and I try our best. Raising a family in this town isn't easy, but we manage.">>
<<case 3>>
<<Chat $interactionNpc "Parenthood changed everything for me. I see the world differently now - it's all about providing for the family.">>
<</switch>>
<<else>>
/* This NPC is a child - talk about their parents */
<<set _roll = random(1, 3)>>
<<switch _roll>>
<<case 1>>
<<set _msg = _familyInfo.parent1Name + " and " + _familyInfo.parent2Name + " are great parents. They've always been there for me.">>
<<Chat $interactionNpc _msg>>
<<case 2>>
<<set _msg = "My parents - " + _familyInfo.parent1Name + " and " + _familyInfo.parent2Name + " - they work hard to keep us together as a family.">>
<<Chat $interactionNpc _msg>>
<<case 3>>
<<set _msg = "I get along well with my parents. " + _familyInfo.parent1Name + " is strict but fair, and " + _familyInfo.parent2Name + " always knows how to cheer me up.">>
<<Chat $interactionNpc _msg>>
<</switch>>
<</if>>
<<run $player.characterEvents.registerEvent($interactionNpc.info.id, "discovered_family", 1)>>
<<include "enhanced_interaction_result_display">>
<</nobr>><<nobr>>
<<ShowNpcIcon $interactionNpc>>
<<set _roll = random(1, 3)>>
<<switch _roll>>
<<case 1>>
<<Chat $interactionNpc "I'm not comfortable talking about my parents with you. Not yet.">>
<<case 2>>
<<Chat $interactionNpc "That's... a pretty deep topic. I don't think we're there yet.">>
<<case 3>>
<<Chat $interactionNpc "My parents are a sensitive subject. Let's talk about something else.">>
<</switch>>
<<include "enhanced_interaction_result_display">>
<</nobr>><<nobr>>
<<ShowNpcIcon $interactionNpc>>
<<set _familyInfo = setup.getNpcFamilyInfo($interactionNpc.info.id)>>
<<if _familyInfo.isParent>>
<<set _kidsPart = _familyInfo.childrenCount > 0 ? _familyInfo.childrenNames.join(" and ") : "my family">>
<<set _msg = "You know... being a parent to " + _kidsPart + " has taught me so much about myself. I've never told anyone this, but sometimes I worry I'm not good enough for them.">>
<<Chat $interactionNpc _msg>>
<<ChatMessage "They shared a deeply personal moment about parenthood with you. Your bond grew significantly.">>
<<else>>
<<set _msg = "I'll tell you something I don't share with many people. " + _familyInfo.parent1Name + " and " + _familyInfo.parent2Name + " aren't perfect, but they sacrificed so much for me. I owe them everything.">>
<<Chat $interactionNpc _msg>>
<<ChatMessage "They opened up about their deepest feelings for their parents. You feel closer than ever.">>
<</if>>
<<run $player.characterEvents.registerEvent($interactionNpc.info.id, "discovered_family", 1)>>
<<include "enhanced_interaction_result_display">>
<</nobr>><<nobr>>
<<ShowNpcIcon $interactionNpc>>
<<set _roll = random(1, 2)>>
<<switch _roll>>
<<case 1>>
<<Chat $interactionNpc "Don't you DARE talk about my parents like that! You have no idea what they mean to me!">>
<<ChatMessage "You accidentally said something insensitive about their parents.">>
<<case 2>>
<<Chat $interactionNpc "You're crossing a line! My family is none of your concern!">>
<<ChatMessage "Your prying questions struck a nerve.">>
<</switch>>
<<include "enhanced_interaction_result_display">>
<</nobr>><<nobr>>
<<include "UpdateAll">>
/* Check if NPC has a family */
<<set _familyInfo = setup.getNpcFamilyInfo($interactionNpc.info.id)>>
<<if _familyInfo == null>>
<<include "enhanced_interaction_talkAboutSiblings_no_family">>
<<else>>
<<include "enhanced_interaction_busy_check">>
<<set _interaction = setup.getInteractionDefinition("talkAboutSiblings")>>
<<if _isBusy>>
<<ShowNpcIcon $interactionNpc>>
<<Chat $interactionNpc "Maybe some other time, I'm a bit busy...">>
<div class="btn padding-top"><<button "Back" "enhanced_interaction_system">><</button>></div>
<<else>>
<<set $interactionResult = setup.performEnhancedInteraction($player, $interactionNpc, "talkAboutSiblings")>>
<<if $interactionResult.blocked>>
<<include "enhanced_interaction_result_display">>
<<else>>
<<SpendTime _interaction.timeCost>>
<<SpendEnergy $player _interaction.energyCost>>
<<run setup.applyInteractionEffects($player, $interactionNpc, "talkAboutSiblings", $interactionResult)>>
<<if $interactionResult.criticalSuccess>>
<<include "enhanced_interaction_talkAboutSiblings_crit_success">>
<<elseif $interactionResult.criticalFailure>>
<<include "enhanced_interaction_talkAboutSiblings_crit_failure">>
<<elseif $interactionResult.success>>
<<include "enhanced_interaction_talkAboutSiblings_success">>
<<else>>
<<include "enhanced_interaction_talkAboutSiblings_failure">>
<</if>>
<</if>>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<ShowNpcIcon $interactionNpc>>
<<set _roll = random(1, 3)>>
<<switch _roll>>
<<case 1>>
<<Chat $interactionNpc "Siblings? I don't have any. Never had that kind of bond.">>
<<case 2>>
<<Chat $interactionNpc "I grew up alone. No brothers, no sisters. Just me.">>
<<case 3>>
<<Chat $interactionNpc "I wish I had siblings to talk about, but I don't. Maybe that's why I value my friends so much.">>
<</switch>>
<div class="btn padding-top"><<button "Back" "enhanced_interaction_system">><</button>></div>
<</nobr>><<nobr>>
<<ShowNpcIcon $interactionNpc>>
<<set _familyInfo = setup.getNpcFamilyInfo($interactionNpc.info.id)>>
<<if _familyInfo.isParent>>
/* NPC is a parent - talk about their children's relationships */
<<if _familyInfo.childrenCount > 1>>
<<set _childList = _familyInfo.childrenNames.join(" and ")>>
<<set _msg = "My kids - " + _childList + " - they have their sibling squabbles, but deep down they look out for each other. It's sweet to watch.">>
<<Chat $interactionNpc _msg>>
<<elseif _familyInfo.childrenCount == 1>>
<<set _msg = _familyInfo.childrenNames[0] + " is our only child. Sometimes I think they could use a sibling, but they seem happy.">>
<<Chat $interactionNpc _msg>>
<<else>>
<<Chat $interactionNpc "We don't have kids, so no sibling stories from me! But I hear plenty of them from the neighbors.">>
<</if>>
<<else>>
/* NPC is a child - talk about their actual siblings */
<<if _familyInfo.siblingCount > 0>>
<<set _sibList = _familyInfo.siblingNames.join(" and ")>>
<<set _roll = random(1, 3)>>
<<switch _roll>>
<<case 1>>
<<set _sibWord = _familyInfo.siblingCount == 1 ? "sibling" : "siblings">>
<<set _themWord = _familyInfo.siblingCount == 1 ? "them" : "any of them">>
<<set _msg = "My " + _sibWord + "? " + _sibList + "! We fight sometimes, but I couldn't imagine life without " + _themWord + ".">>
<<Chat $interactionNpc _msg>>
<<case 2>>
<<set _msg = _sibList + " and I grew up together in the " + _familyInfo.surname + " house. We have so many memories together.">>
<<Chat $interactionNpc _msg>>
<<case 3>>
<<set _theyWord = _familyInfo.siblingCount == 1 ? "They're" : "They're all">>
<<set _msg = "Growing up with " + _sibList + " was an adventure. " + _theyWord + " really important to me.">>
<<Chat $interactionNpc _msg>>
<</switch>>
<<else>>
<<Chat $interactionNpc "I'm an only child, actually. No siblings. It gets lonely sometimes, but I learned to be independent.">>
<</if>>
<</if>>
<<run $player.characterEvents.registerEvent($interactionNpc.info.id, "discovered_family", 1)>>
<<include "enhanced_interaction_result_display">>
<</nobr>><<nobr>>
<<ShowNpcIcon $interactionNpc>>
<<set _roll = random(1, 3)>>
<<switch _roll>>
<<case 1>>
<<Chat $interactionNpc "I don't really want to get into the sibling stuff right now.">>
<<case 2>>
<<Chat $interactionNpc "We have our issues... I'd rather not talk about it.">>
<<case 3>>
<<Chat $interactionNpc "Siblings can be complicated. Let's just leave it at that.">>
<</switch>>
<<include "enhanced_interaction_result_display">>
<</nobr>><<nobr>>
<<ShowNpcIcon $interactionNpc>>
<<set _familyInfo = setup.getNpcFamilyInfo($interactionNpc.info.id)>>
<<if _familyInfo.isParent>>
<<if _familyInfo.childrenCount > 1>>
<<set _childList = _familyInfo.childrenNames.join(" and ")>>
<<set _msg = "You know what makes me happiest? Watching " + _childList + " grow up together. They drive each other crazy sometimes, but the love between them is real. I'm so proud of our little " + _familyInfo.surname + " family.">>
<<Chat $interactionNpc _msg>>
<<else>>
<<Chat $interactionNpc "I wish we had more kids sometimes. But our family is perfect as it is. Thanks for caring enough to ask!">>
<</if>>
<<ChatMessage "They shared heartfelt parental pride with you. Your bond deepened significantly.">>
<<else>>
<<if _familyInfo.siblingCount > 0>>
<<set _sibList = _familyInfo.siblingNames.join(" and ")>>
<<set _msg = "I'll be honest... " + _sibList + " and I have been through a lot together. There were hard times, but we always had each other's backs. The " + _familyInfo.surname + " siblings stick together no matter what.">>
<<Chat $interactionNpc _msg>>
<<ChatMessage "They revealed deep emotional bonds with their siblings. You feel truly trusted!">>
<<else>>
<<set _msg = "Being an only child... sometimes I used to cry about it when I was little. But " + _familyInfo.parent1Name + " and " + _familyInfo.parent2Name + " always made me feel loved enough for a whole house full of kids. I've never told anyone that before.">>
<<Chat $interactionNpc _msg>>
<<ChatMessage "They shared a deeply personal childhood memory with you.">>
<</if>>
<</if>>
<<run $player.characterEvents.registerEvent($interactionNpc.info.id, "discovered_family", 1)>>
<<include "enhanced_interaction_result_display">>
<</nobr>><<nobr>>
<<ShowNpcIcon $interactionNpc>>
<<set _roll = random(1, 2)>>
<<switch _roll>>
<<case 1>>
<<Chat $interactionNpc "Why are you so interested in my siblings?! That's creepy!">>
<<ChatMessage "Your questioning came across as obsessive and made them uncomfortable.">>
<<case 2>>
<<Chat $interactionNpc "Stop prying into my family life! You don't get to know everything about me!">>
<<ChatMessage "They felt you were overstepping serious boundaries.">>
<</switch>>
<<include "enhanced_interaction_result_display">>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "enhanced_interaction_busy_check">>
<<set _interaction = setup.getInteractionDefinition("askOrientation")>>
<<if _isBusy>>
<<ShowNpcIcon $interactionNpc>>
<<Chat $interactionNpc "I'm not in the mood to talk about personal stuff right now...">>
<div class="btn padding-top"><<button "Back" "enhanced_interaction_system">><</button>></div>
<<else>>
<<set $interactionResult = setup.performEnhancedInteraction($player, $interactionNpc, "askOrientation")>>
<<if $interactionResult.blocked>>
<<include "enhanced_interaction_result_display">>
<<else>>
<<SpendTime _interaction.timeCost>>
<<SpendEnergy $player _interaction.energyCost>>
<<run setup.applyInteractionEffects($player, $interactionNpc, "askOrientation", $interactionResult)>>
<<if $interactionResult.criticalSuccess>>
<<include "enhanced_interaction_askOrientation_crit_success">>
<<elseif $interactionResult.criticalFailure>>
<<include "enhanced_interaction_askOrientation_crit_failure">>
<<elseif $interactionResult.success>>
<<include "enhanced_interaction_askOrientation_success">>
<<else>>
<<include "enhanced_interaction_askOrientation_failure">>
<</if>>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<ShowNpcIcon $interactionNpc>>
<<set _pref = $interactionNpc.info.sexualPreference>>
<<switch _pref>>
<<case "Manly">>
<<Chat $interactionNpc "If you really want to know... I prefer manly partners. There's just something about masculine energy that attracts me.">>
<<case "Feminine">>
<<Chat $interactionNpc "Well, since you asked... I'm drawn to feminine partners. That's just what I find attractive.">>
<<case "Bi">>
<<Chat $interactionNpc "Honestly? I don't really have a strong preference when it comes to gender. I'm attracted to the person, not the label.">>
<</switch>>
<<run $player.characterEvents.registerEvent($interactionNpc.info.id, "discovered_prefGender", 1)>>
<<include "enhanced_interaction_result_display">>
<</nobr>><<nobr>>
<<ShowNpcIcon $interactionNpc>>
<<set _roll = random(1, 3)>>
<<switch _roll>>
<<case 1>>
<<Chat $interactionNpc "That's a pretty personal question... I'd rather not say.">>
<<case 2>>
<<Chat $interactionNpc "Why do you want to know that? I'm not comfortable sharing that right now.">>
<<case 3>>
<<Chat $interactionNpc "Hmm, I don't think we're close enough for me to answer that. Maybe another time.">>
<</switch>>
<<include "enhanced_interaction_result_display">>
<</nobr>><<nobr>>
<<ShowNpcIcon $interactionNpc>>
<<set _pref = $interactionNpc.info.sexualPreference>>
<<switch _pref>>
<<case "Manly">>
<<Chat $interactionNpc "You know, I'm really glad you asked! I've always been attracted to manly partners. There's no shame in knowing what you want, right? I feel like I can be completely honest with you about this.">>
<<case "Feminine">>
<<Chat $interactionNpc "I appreciate you asking openly! I'm definitely into feminine partners. It's nice to talk about this with someone who doesn't judge. I feel really comfortable around you.">>
<<case "Bi">>
<<Chat $interactionNpc "That's such a great question! Honestly, gender doesn't really matter to me. I fall for people, not labels. Not everyone gets that, but I feel like you do.">>
<</switch>>
<<ChatMessage "They opened up about their orientation with complete trust!">>
<<run $player.characterEvents.registerEvent($interactionNpc.info.id, "discovered_prefGender", 1)>>
<<include "enhanced_interaction_result_display">>
<</nobr>><<nobr>>
<<ShowNpcIcon $interactionNpc>>
<<set _roll = random(1, 2)>>
<<switch _roll>>
<<case 1>>
<<Chat $interactionNpc "Excuse me?! That's incredibly personal and none of your business!">>
<<ChatMessage "Your question came across as invasive and inappropriate.">>
<<case 2>>
<<Chat $interactionNpc "What kind of question is that?! I don't owe you an explanation about my preferences!">>
<<ChatMessage "They were deeply offended by your prying.">>
<</switch>>
<<include "enhanced_interaction_result_display">>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "enhanced_interaction_busy_check">>
<<set _interaction = setup.getInteractionDefinition("askSexRole")>>
<<if _isBusy>>
<<ShowNpcIcon $interactionNpc>>
<<Chat $interactionNpc "Not now... that's a bit too personal for the moment.">>
<div class="btn padding-top"><<button "Back" "enhanced_interaction_system">><</button>></div>
<<else>>
<<set $interactionResult = setup.performEnhancedInteraction($player, $interactionNpc, "askSexRole")>>
<<if $interactionResult.blocked>>
<<include "enhanced_interaction_result_display">>
<<else>>
<<SpendTime _interaction.timeCost>>
<<SpendEnergy $player _interaction.energyCost>>
<<run setup.applyInteractionEffects($player, $interactionNpc, "askSexRole", $interactionResult)>>
<<if $interactionResult.criticalSuccess>>
<<include "enhanced_interaction_askSexRole_crit_success">>
<<elseif $interactionResult.criticalFailure>>
<<include "enhanced_interaction_askSexRole_crit_failure">>
<<elseif $interactionResult.success>>
<<include "enhanced_interaction_askSexRole_success">>
<<else>>
<<include "enhanced_interaction_askSexRole_failure">>
<</if>>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<ShowNpcIcon $interactionNpc>>
<<set _role = $interactionNpc.info.SexRole>>
<<switch _role>>
<<case "Active">>
<<Chat $interactionNpc "Well... I prefer to take the lead, if you know what I mean. I like being the active one.">>
<<case "Passive">>
<<Chat $interactionNpc "I'll be honest with you... I prefer to be on the receiving end. I like being passive.">>
<<case "Versatile">>
<<Chat $interactionNpc "I'm pretty flexible about that, actually. I don't have a strong preference either way - versatile, I guess you'd say.">>
<</switch>>
<<run $player.characterEvents.registerEvent($interactionNpc.info.id, "discovered_sexRole", 1)>>
<<include "enhanced_interaction_result_display">>
<</nobr>><<nobr>>
<<ShowNpcIcon $interactionNpc>>
<<set _roll = random(1, 3)>>
<<switch _roll>>
<<case 1>>
<<Chat $interactionNpc "Whoa, that's getting a bit intimate for a casual conversation, don't you think?">>
<<case 2>>
<<Chat $interactionNpc "I'm not ready to talk about that kind of stuff with you yet.">>
<<case 3>>
<<Chat $interactionNpc "That's... really personal. Maybe when we know each other better.">>
<</switch>>
<<include "enhanced_interaction_result_display">>
<</nobr>><<nobr>>
<<ShowNpcIcon $interactionNpc>>
<<set _role = $interactionNpc.info.SexRole>>
<<switch _role>>
<<case "Active">>
<<Chat $interactionNpc "Since you asked so nicely... I've always been the dominant type in bed. I like taking charge and being active. It's just who I am, and I'm not ashamed of it!">>
<<case "Passive">>
<<Chat $interactionNpc "You're someone I can trust with this... I really enjoy being passive. There's something freeing about letting someone else take control. I've never told anyone that so directly!">>
<<case "Versatile">>
<<Chat $interactionNpc "I love that you're so open about asking! Truth is, I enjoy both sides. Being versatile keeps things exciting - sometimes I lead, sometimes I follow. Variety is the spice of life, right?">>
<</switch>>
<<ChatMessage "They shared intimate details about their preferences with complete trust!">>
<<run $player.characterEvents.registerEvent($interactionNpc.info.id, "discovered_sexRole", 1)>>
<<include "enhanced_interaction_result_display">>
<</nobr>><<nobr>>
<<ShowNpcIcon $interactionNpc>>
<<set _roll = random(1, 2)>>
<<switch _roll>>
<<case 1>>
<<Chat $interactionNpc "Are you seriously asking me about my bedroom preferences?! That's so inappropriate!">>
<<ChatMessage "Your blunt question about their sex life was way too forward.">>
<<case 2>>
<<Chat $interactionNpc "What the hell?! I barely know you and you're asking THAT? Back off!">>
<<ChatMessage "They were shocked and angered by your inappropriate question.">>
<</switch>>
<<include "enhanced_interaction_result_display">>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "enhanced_interaction_busy_check">>
<<set _interaction = setup.getInteractionDefinition("askClothingPref")>>
<<if _isBusy>>
<<ShowNpcIcon $interactionNpc>>
<<Chat $interactionNpc "Can we talk about fashion another time? I'm busy.">>
<div class="btn padding-top"><<button "Back" "enhanced_interaction_system">><</button>></div>
<<else>>
<<set $interactionResult = setup.performEnhancedInteraction($player, $interactionNpc, "askClothingPref")>>
<<if $interactionResult.blocked>>
<<include "enhanced_interaction_result_display">>
<<else>>
<<SpendTime _interaction.timeCost>>
<<SpendEnergy $player _interaction.energyCost>>
<<run setup.applyInteractionEffects($player, $interactionNpc, "askClothingPref", $interactionResult)>>
<<if $interactionResult.criticalSuccess>>
<<include "enhanced_interaction_askClothingPref_crit_success">>
<<elseif $interactionResult.criticalFailure>>
<<include "enhanced_interaction_askClothingPref_crit_failure">>
<<elseif $interactionResult.success>>
<<include "enhanced_interaction_askClothingPref_success">>
<<else>>
<<include "enhanced_interaction_askClothingPref_failure">>
<</if>>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<ShowNpcIcon $interactionNpc>>
<<set _pref = $interactionNpc.info.clothesPreference>>
<<if _pref == "men">>
<<Chat $interactionNpc "I tend to go for men's clothing. It's more my style - practical and comfortable.">>
<<else>>
<<Chat $interactionNpc "I prefer women's clothing, honestly. It suits me better and I feel more like myself in it.">>
<</if>>
<<run $player.characterEvents.registerEvent($interactionNpc.info.id, "discovered_clothesPref", 1)>>
<<include "enhanced_interaction_result_display">>
<</nobr>><<nobr>>
<<ShowNpcIcon $interactionNpc>>
<<set _roll = random(1, 3)>>
<<switch _roll>>
<<case 1>>
<<Chat $interactionNpc "Why do you care about what I wear? That's a weird question.">>
<<case 2>>
<<Chat $interactionNpc "I don't really feel like discussing my wardrobe choices right now.">>
<<case 3>>
<<Chat $interactionNpc "My fashion sense is my own business, thanks.">>
<</switch>>
<<include "enhanced_interaction_result_display">>
<</nobr>><<nobr>>
<<ShowNpcIcon $interactionNpc>>
<<set _pref = $interactionNpc.info.clothesPreference>>
<<if _pref == "men">>
<<Chat $interactionNpc "Oh, you noticed! Yeah, I've always gravitated toward men's fashion. There's something about a clean-cut masculine look that just feels right for me. I love that you pay attention to these things!">>
<<else>>
<<Chat $interactionNpc "I'm so glad you asked! I absolutely love women's fashion - the variety, the textures, the way it makes me feel. It's a big part of who I am, and it means a lot that you're interested!">>
<</if>>
<<ChatMessage "They enthusiastically shared their fashion preferences with you!">>
<<run $player.characterEvents.registerEvent($interactionNpc.info.id, "discovered_clothesPref", 1)>>
<<include "enhanced_interaction_result_display">>
<</nobr>><<nobr>>
<<ShowNpcIcon $interactionNpc>>
<<set _roll = random(1, 2)>>
<<switch _roll>>
<<case 1>>
<<Chat $interactionNpc "Are you judging my clothes?! What's wrong with how I dress?!">>
<<ChatMessage "Your question came across as critical of their appearance.">>
<<case 2>>
<<Chat $interactionNpc "What's that supposed to mean? You don't like how I look?!">>
<<ChatMessage "They took your question as an insult to their style.">>
<</switch>>
<<include "enhanced_interaction_result_display">>
<</nobr>><<widget "InitEnhancedInteractionSystem">>
<<nobr>>
/* Initialize enhanced interaction system */
<<run SetEnhancedInteractionMethods()>>
<<set $enhancedInteractionSystemLoaded = true>>
<</nobr>>
<</widget>><<nobr>>
<<include "UpdateAll">>
<<set $relationshipDateReturnPassage = "enhanced_interaction_system">>
<<run $player.getRelationship($interactionNpc.info.id)>>
<<run $interactionNpc.getRelationship($player.info.id)>>
/* Random NPC-initiated event (~6% chance) */
<<include "NPC_Interact_Event">>
<<include "enhanced_interaction_btn_text">>
/* Check for NPC relationship proposal */
<<set _npcProposal = setup.checkNPCRelationshipProposal($player, $interactionNpc)>>
<<if _npcProposal && _npcProposal.type>>
<<set $pendingNpcProposal = _npcProposal>>
<<set $pendingNpcProposal.npcId = $interactionNpc.info.id>>
<<goto "enhanced_npc_relationship_proposal">>
<</if>>
<<set _npcMetrics = $player.getRelationship($interactionNpc.info.id, false)?.metrics>>
<<set _npcRelation = $player.getRelationship($interactionNpc.info.id, false)?.relation ?? "acquaintance">>
<<set _npcEnergy = $interactionNpc.status.energy.value>>
<<set _npcHealth = $interactionNpc.status.health.value>>
<<set _npcMood = $interactionNpc.attributes.happiness ? $interactionNpc.attributes.happiness.value : 50>>
<<ResolveMadDogDebtTaskName>>
<<set _isMadDogDebtor = ($interactionNpc.saveData instanceof Map) ? $interactionNpc.saveData.get("madDogDebtor") === true : false>>
<<set _madDogTaskMatchesNpc = _madDogDebtTaskName == ("Get the debt from " + $interactionNpc.info.firstName + " " + $interactionNpc.info.secondName + ".")>>
<<set _showMadDogDebtorButton = getQuestState("mad_dog_quest1") == "active" && _madDogDebtTaskState != "completed" && ($debtorID == $interactionNpc.info.id || _isMadDogDebtor || _madDogTaskMatchesNpc)>>
<div class="enhanced-interaction-panel main-interaction-panel">
<!-- ═════ NPC INFO HEADER ═════ -->
<div class="npc-info-header">
<div class="npc-photo-container">
<<set _characterIcon = $interactionNpc.getPhotoImage()>>
<img class="npc-portrait" @src="_characterIcon" alt="NPC Portrait">
<<set _npcGender = $interactionNpc.gender()>>
<<if _npcGender === "Male">>
<div class="npc-gender-badge male">♂️</div>
<<elseif _npcGender === "Shemale">>
<div class="npc-gender-badge trans">⚧️</div>
<<else>>
<div class="npc-gender-badge female">♀️</div>
<</if>>
</div>
<div class="npc-stats-container">
<div class="npc-name-section">
<div class="npc-name"><<print $interactionNpc.info.firstName>> <<print $interactionNpc.info.secondName>></div>
<div class="npc-relation-badge"><<print Relations[_npcRelation]?.label ?? _npcRelation>></div>
<<set _npcJob = $interactionNpc.info.characterWork>>
<<set _invalidJobs = ["None", "none", "NONE", "", "null", "undefined", "N/A"]>>
<<if _npcJob && !_invalidJobs.includes(_npcJob)>>
<div class="npc-job-badge"><<print _npcJob>></div>
<<else>>
<div class="npc-job-badge">Citizen</div>
<</if>>
<div class="npc-age-badge">Age: <<print $interactionNpc.info.age.value>></div>
<div class="npc-rename-btn"><<button "Rename">>
<<run Dialog.create("Rename NPC")>>
<<run Dialog.wiki('<<include "enhanced_interaction_rename_dialog">>')>>
<<run Dialog.open()>>
<</button>></div>
</div>
<<set _friendshipClamped = Math.max(-100, Math.min(100, _npcMetrics.friendship))>>
<<if _friendshipClamped >= 0>>
<<set _negFillWidth = "width: 0%">>
<<set _posFillWidth = "width: " + Math.abs(_friendshipClamped) + "%">>
<<else>>
<<set _negFillWidth = "width: " + Math.abs(_friendshipClamped) + "%">>
<<set _posFillWidth = "width: 0%">>
<</if>>
<<set _loveWidth = "width: " + Math.min(100, _npcMetrics.love) + "%">>
<<set _lustWidth = "width: " + Math.min(100, _npcMetrics.sex) + "%">>
<<set _fearWidth = "width: " + Math.min(100, _npcMetrics.fear) + "%">>
<<set _angerWidth = "width: " + Math.min(100, _npcMetrics.anger) + "%">>
<<set _energyWidth = "width: " + _npcEnergy + "%">>
<div class="npc-stats-grid">
<div class="stat-item friendship">
<span class="stat-icon">❤️</span>
<span class="stat-label">Friendship</span>
<div class="stat-bar friendship-bar"><div class="friendship-half neg-half"><div class="friendship-fill neg-fill" @style="_negFillWidth"></div></div><div class="friendship-half pos-half"><div class="friendship-fill pos-fill" @style="_posFillWidth"></div></div></div>
<span class="stat-value"><<print Math.floor(_npcMetrics.friendship)>></span>
</div>
<div class="stat-item love">
<span class="stat-icon">💕</span>
<span class="stat-label">Love</span>
<div class="stat-bar"><div class="stat-fill" @style="_loveWidth"></div></div>
<span class="stat-value"><<print Math.floor(_npcMetrics.love)>></span>
</div>
<div class="stat-item lust">
<span class="stat-icon">🔥</span>
<span class="stat-label">Sex</span>
<div class="stat-bar"><div class="stat-fill" @style="_lustWidth"></div></div>
<span class="stat-value"><<print Math.floor(_npcMetrics.sex)>></span>
</div>
<div class="stat-item fear">
<span class="stat-icon">😨</span>
<span class="stat-label">Fear</span>
<div class="stat-bar"><div class="stat-fill" @style="_fearWidth"></div></div>
<span class="stat-value"><<print Math.floor(_npcMetrics.fear)>></span>
</div>
<div class="stat-item anger">
<span class="stat-icon">😠</span>
<span class="stat-label">Anger</span>
<div class="stat-bar"><div class="stat-fill" @style="_angerWidth"></div></div>
<span class="stat-value"><<print Math.floor(_npcMetrics.anger)>></span>
</div>
<div class="stat-item energy">
<span class="stat-icon">⚡</span>
<span class="stat-label">Energy</span>
<div class="stat-bar"><div class="stat-fill" @style="_energyWidth"></div></div>
<span class="stat-value"><<print Math.floor(_npcEnergy)>></span>
</div>
</div>
</div>
</div>
<<NpcMemoryAside $interactionNpc>>
/* Meetings (playerNpcMeetings.ts): an apology they owe you, and a meeting
that is on. Talking to someone you met makes even a short meeting count. */
<<run setup.playerNpcMeetings.noteTalk($interactionNpc)>>
<<set _meetApology = setup.playerNpcMeetings.takeApology($interactionNpc)>>
<<if _meetApology>><<Chat $interactionNpc _meetApology>><</if>>
<<set _meetNow = setup.playerNpcMeetings.forNpc($interactionNpc)>>
<<if _meetNow>>
<div class="meet-note">📅 <<= _meetNow.statusLabel>>: <<= _meetNow.placeAt>>, <<= _meetNow.when>></div>
<</if>>
<<run setup.observePlayerPartnerNight($interactionNpc)>>
<<set _coupleView = setup.getPlayerNpcRelationshipView($interactionNpc)>>
<<if setup.getPlayerNpcAfterBreakupView($interactionNpc)>>
<div class="btn padding-top"><<button "After our breakup" "enhanced_relationship_after_breakup">><<unset $afterBreakupResult>><</button>></div>
<</if>>
<<if _coupleView.history.milestones.length || _coupleView.history.dateSummaries.length>>
<div class="btn padding-top"><<button "Our history" "enhanced_relationship_history">>
<<unset $relationshipHistoryResult>>
<</button>></div>
<</if>>
<<if _coupleView.active>>
<<set _partnerRumor = GetPlayerPartnerRumorConcern($interactionNpc)>>
<<if _partnerRumor>>
<<Chat $interactionNpc _partnerRumor.line>>
<div class="btn"><<button "Talk about what you heard" "DiscussPartnerRumor">><<unset $partnerRumorResult>><</button>></div>
<</if>>
<div class="btn padding-top"><<button "Our occasions" "enhanced_relationship_occasions">><<unset $relationshipOccasionResult>><</button>></div>
<div class="interaction-result-panel relationship-partner-panel">
<div class="result-banner success">
<span class="result-icon">💕</span>
<span class="result-text"><<print _coupleView.partnerLabel>> · <<print _coupleView.daysTogether>> days together</span>
</div>
<div class="result-description">
<<print _coupleView.needLine>> · <<print _coupleView.boundaryLabel>>
</div>
<div class="result-description">
Attention <<print Math.round(_coupleView.satisfaction.attention)>> ·
Affection <<print Math.round(_coupleView.satisfaction.affection)>> ·
Intimacy <<print Math.round(_coupleView.satisfaction.intimacy)>> ·
Trust <<print Math.round(_coupleView.satisfaction.trust)>>
</div>
<div class="result-description">🏠 <<print _coupleView.cohabitationLabel>><<if _coupleView.homeLabel>> · <<print _coupleView.homeLabel>><</if>></div>
<<if _coupleView.householdHint>><div class="result-description">🌆 <<print _coupleView.householdHint>></div><</if>>
<<set _nightStatus = setup.getPlayerNpcNightStatus($interactionNpc)>>
<<set _lateNotice = setup.consumePlayerPartnerLateNotification($interactionNpc)>>
<<if _lateNotice>><div class="result-description">⚠ <<print _lateNotice>></div><</if>>
<<if _nightStatus>>
<div class="result-description">🌙 Tonight: <<print (_nightStatus.declaredActivity ?? _nightStatus.actualActivity).replaceAll("_", " ")>><<if _nightStatus.outcome>> · <<print _nightStatus.outcome.replaceAll("_", " ")>><</if>></div>
<</if>>
<<set _nightConcern = setup.getPlayerPartnerNightConcern($interactionNpc)>>
<<if _nightConcern>>
<div class="result-description">⚠ <<print _nightConcern.knowledge == "known" ? "You know their account of a recent night was incomplete." : "You have doubts about a recent absence, but no proof yet.">><<if _nightConcern.targetName>> They met <<print _nightConcern.targetName>>.<</if>></div>
<<if ["forgiven", "agreement_changed", "affair_ended", "separated", "relationship_ended"].includes(_nightConcern.discussionOutcome)>>
<div class="result-description">You already had it out over this.</div>
<<elseif !_nightConcern.discussed or _nightConcern.knowledge == "known">>
<div class="btn padding-top"><<button "Discuss the recent absence" "enhanced_relationship_night_concern">><</button>></div>
<</if>>
<</if>>
<<if _coupleView.cohabitation.separationMinute != undefined>>
<div class="btn padding-top"><<button "Discuss reconciliation" "enhanced_relationship_reconcile">><</button>></div>
<<elseif _coupleView.cohabitation.status == "separate" or _coupleView.cohabitation.status == "sleepovers" or _coupleView.cohabitation.status == "former_cohabitant">>
<<if !_coupleView.cohabitation.accessGranted and setup.ownsPlayerResidence("residential_apartment")>>
<div class="btn padding-top"><<button "Give apartment key" "enhanced_relationship_key">><</button>></div>
<</if>>
<<set _moveAvailability = setup.canNpcMoveInWithPlayer($player, $interactionNpc, "residential_apartment")>>
<<if _moveAvailability.ok>>
<div class="btn padding-top"><<button "Ask to live together" "enhanced_relationship_move_in">><</button>></div>
<<elseif setup.ownsPlayerResidence("residential_apartment")>>
<div class="result-description">Move-in: <<print _moveAvailability.reason>></div>
<</if>>
<<elseif _coupleView.cohabitation.status == "cohabiting">>
<div class="btn padding-top"><<button "Discuss your household" "enhanced_relationship_household">><</button>></div>
<</if>>
<<if _coupleView.pendingInitiative>>
<div class="result-description">💬 <<print _coupleView.pendingInitiative.line>></div>
<<if _coupleView.pendingInitiative.kind == "date">>
<div class="btn padding-top"><<button "Answer the date request" "enhanced_relationship_date_planner">><</button>></div>
<<else>>
<div class="btn padding-top"><<button "Respond to your partner" "enhanced_relationship_initiative">><</button>></div>
<</if>>
<</if>>
<<if _coupleView.legacyExclusiveConflict>>
<div class="result-description">⚠ Your old save left you with more than one official partner. You can't ask anyone new until you sort that out.</div>
<</if>>
<<if _coupleView.plannedMeeting && (_coupleView.plannedMeeting.status == "planned" || _coupleView.plannedMeeting.status == "traveling")>>
<div class="result-description">📍 Planned date: <<print _coupleView.plannedMeeting.venueLabel>>.
<<if _coupleView.plannedMeeting.calendarScheduled>>
Meet on <<print setup.playerNpcDateTimeLabel(_coupleView.plannedMeeting.scheduledMinute)>>.
<<if _coupleView.plannedMeeting.departedMinute>>Your partner has set off.<<else>>Your partner will leave when it is time to travel.<</if>>
<<else>><<print $interactionNpc.info.firstName>> is following the route there.<</if>>
</div>
<div class="btn padding-top"><<button "Cancel this outing" "enhanced_relationship_date_cancellation">><</button>></div>
<<if $player.info.currentLocation == _coupleView.plannedMeeting.venue && $interactionNpc.info.currentLocation == _coupleView.plannedMeeting.venue && setup.canStartPlayerNpcCalendarDate(_coupleView.plannedMeeting)>>
<div class="btn padding-top"><<button "Spend the date" "enhanced_relationship_date_resolve">><</button>></div>
<</if>>
<<elseif _coupleView.plannedMeeting && _coupleView.plannedMeeting.status == "active">>
<div class="btn padding-top"><<button "Continue your date" "enhanced_relationship_date_session">><</button>></div>
<<else>>
<div class="btn padding-top"><<button "Plan a date" "enhanced_relationship_date_time">><<set $relationshipDateFormat = "standard">><</button>></div>
<div class="btn padding-top"><<button "Arrange a 20-minute catch-up" "enhanced_relationship_date_time">><<set $relationshipDateFormat = "brief">><</button>></div>
<</if>>
<<if setup.getPlayerNpcDateCancellation($interactionNpc)>>
<div class="btn padding-top"><<button "Discuss the cancelled outing" "enhanced_relationship_date_cancellation">><</button>></div>
<</if>>
<div class="btn padding-top"><<button "Talk about what's allowed" "enhanced_relationship_boundaries">><</button>></div>
</div>
<</if>>
<<set _homeVisit = setup.getPlayerNpcVisit($interactionNpc)>>
<<if _homeVisit && !["completed", "cancelled"].includes(_homeVisit.stage)>>
<div class="btn padding-top"><<button "Continue your home visit" "enhanced_relationship_home_visit">><</button>></div>
<<elseif _npcMetrics.friendship >= 20 && $player.info.currentLocation == $interactionNpc.info.currentLocation>>
<div class="btn padding-top"><<button "Invite home for a visit" "enhanced_relationship_home_visit">>
<<set $homeVisitActionResult = setup.requestPlayerNpcHomeVisit($interactionNpc)>>
<<if $homeVisitActionResult.minutes > 0>><<SpendTime $homeVisitActionResult.minutes>><</if>>
<</button>></div>
<</if>>
<<set _postFemInvite = setup.getPlayerPostFeminizationInvitation($interactionNpc)>>
<<if _postFemInvite and (not _coupleView.active or _postFemInvite.phase == "travelling")>>
<div class="interaction-result-panel relationship-partner-panel">
<div class="result-banner success">
<span class="result-icon">💭</span>
<span class="result-text">Private post-feminization plan</span>
</div>
<div class="result-description"><<print _postFemInvite.line>></div>
<<if _postFemInvite.phase == "travelling">>
<<if _postFemInvite.guestName and _postFemInvite.playerRole == "partner">>
<div class="result-description">Selected guest: <<print _postFemInvite.guestName>>.</div>
<</if>>
<div class="result-description">📍 Meeting place: <<print _postFemInvite.plannedLocationLabel>>. The NPC participants are following their routes there.</div>
<<if _postFemInvite.readyToResolve>>
<div class="btn padding-top"><<button "Begin the arranged meeting" "enhanced_post_feminization_meeting">><</button>></div>
<</if>>
<<else>>
<div class="btn padding-top"><<button "Answer the invitation" "enhanced_post_feminization_invitation">><</button>></div>
<</if>>
</div>
<</if>>
<div class="interaction-menu-toolbar" role="search" aria-label="Find an interaction">
<label class="interaction-search-label">Search actions
<input type="search" data-menu-search placeholder="Search by action or category" autocomplete="off" aria-controls="interaction-menu-grid">
</label>
<label>Category
<select data-menu-category aria-controls="interaction-menu-grid"><option value="">All categories</option></select>
</label>
<label class="interaction-available-label"><input type="checkbox" data-menu-available aria-controls="interaction-menu-grid"> Available only</label>
<button type="button" data-menu-reset>Reset filters</button>
<div class="interaction-quick-leave"><<button "Leave" "NudeCheck">><<set $canShowStatsBtn = true>><<set $gameSettings.allowSaves = true>><</button>></div>
<p class="interaction-menu-status" data-menu-status role="status" aria-live="polite" aria-atomic="true"></p>
<p class="interaction-menu-hint">Percentages show success chances. Hover over or focus a button to see costs, advice and requirements.</p>
</div>
<div class="interaction-menu-empty" data-menu-empty hidden>No matching actions. Try another search or reset the filters.</div>
<div class="interaction-menu-grid" id="interaction-menu-grid">
<!-- ═════ ROW 1: FRIENDLY, AGGRESSIVE, SUPPORT ═════ -->
<div class="categories-row">
<!-- FRIENDLY -->
<div class="interaction-category">
<div class="category-header">
<span class="category-icon">💬</span>
<span class="category-title">Friendly</span>
</div>
<div class="category-buttons">
<<if setup.canEnhancedInteract($player, $interactionNpc, "smallTalk")>>
<div class="interaction-btn has-tips" data-category="friendly" data-interaction="smallTalk">
<<button _smallTalkBtnText "enhanced_interaction_smallTalk">><</button>>
</div>
<<else>>
<div class="interaction-btn disabled" data-interaction="smallTalk"><<button "Small Talk">><</button>></div>
<</if>>
<<if setup.canEnhancedInteract($player, $interactionNpc, "deepConversation")>>
<div class="interaction-btn has-tips" data-category="friendly" data-interaction="deepConversation">
<<button _deepConversationBtnText "enhanced_interaction_deepConversation">><</button>>
</div>
<<else>>
<div class="interaction-btn disabled" data-interaction="deepConversation"><<button "Deep Talk">><</button>></div>
<</if>>
<<if setup.canEnhancedInteract($player, $interactionNpc, "shareSecret")>>
<div class="interaction-btn has-tips" data-category="friendly" data-interaction="shareSecret">
<<button _shareSecretBtnText "enhanced_interaction_shareSecret">><</button>>
</div>
<<else>>
<div class="interaction-btn disabled" data-interaction="shareSecret"><<button "Share Secret">><</button>></div>
<</if>>
<<if setup.canEnhancedInteract($player, $interactionNpc, "giveGift")>>
<<if $player.money >= 50>>
<div class="interaction-btn has-tips" data-category="friendly" data-interaction="giveGift">
<<button _giveGiftBtnText "enhanced_interaction_giveGift">><</button>>
</div>
<<else>>
<div class="interaction-btn disabled" title="Not enough money ($50)"><<button "Give Gift $50">><</button>></div>
<</if>>
<<else>>
<div class="interaction-btn disabled" data-interaction="giveGift"><<button "Give Gift $50">><</button>></div>
<</if>>
<<if setup.canEnhancedInteract($player, $interactionNpc, "inviteToBar")>>
<<if $player.money >= 150>>
<div class="interaction-btn has-tips" data-category="friendly" data-interaction="inviteToBar">
<<button _inviteToBarBtnText "enhanced_interaction_inviteToBar">><</button>>
</div>
<<else>>
<div class="interaction-btn disabled" title="Not enough money ($150)"><<button "Bar $150">><</button>></div>
<</if>>
<<else>>
<div class="interaction-btn disabled" data-interaction="inviteToBar"><<button "Bar $150">><</button>></div>
<</if>>
</div>
</div>
<!-- AGGRESSIVE -->
<div class="interaction-category">
<div class="category-header">
<span class="category-icon">⚔️</span>
<span class="category-title">Aggressive</span>
</div>
<div class="category-buttons">
<<if setup.canEnhancedInteract($player, $interactionNpc, "insult")>>
<div class="interaction-btn aggressive has-tips" data-category="aggressive" data-interaction="insult">
<<button _insultBtnText "enhanced_interaction_insult">><</button>>
</div>
<<else>>
<div class="interaction-btn disabled" data-interaction="insult"><<button "Insult">><</button>></div>
<</if>>
<<if setup.canEnhancedInteract($player, $interactionNpc, "threaten")>>
<div class="interaction-btn aggressive has-tips" data-category="aggressive" data-interaction="threaten">
<<button _threatenBtnText "enhanced_interaction_threaten">><</button>>
</div>
<<else>>
<div class="interaction-btn disabled" data-interaction="threaten"><<button "Threaten">><</button>></div>
<</if>>
<<if setup.canEnhancedInteract($player, $interactionNpc, "intimidate")>>
<div class="interaction-btn aggressive has-tips" data-category="aggressive" data-interaction="intimidate">
<<button _intimidateBtnText "enhanced_interaction_intimidate">><</button>>
</div>
<<else>>
<div class="interaction-btn disabled" data-interaction="intimidate"><<button "Intimidate">><</button>></div>
<</if>>
<<if setup.canEnhancedInteract($player, $interactionNpc, "challenge")>>
<div class="interaction-btn aggressive has-tips" data-category="aggressive" data-interaction="challenge">
<<button _challengeBtnText "enhanced_interaction_challenge">><</button>>
</div>
<<else>>
<div class="interaction-btn disabled" data-interaction="challenge"><<button "Challenge">><</button>></div>
<</if>>
<<if _showMadDogDebtorButton>>
<div class="interaction-btn aggressive" data-category="aggressive">
<<button "Deal with the debtor" "NPC_DebtorDeal">><</button>>
</div>
<</if>>
/* Fight - always available */
<div class="interaction-btn aggressive" data-category="aggressive">
<<button "⚔️ Fight" "enhanced_interaction_fight">><</button>>
</div>
</div>
</div>
<!-- SUPPORT -->
<div class="interaction-category">
<div class="category-header">
<span class="category-icon">🤝</span>
<span class="category-title">Support</span>
</div>
<div class="category-buttons">
<<if setup.canEnhancedInteract($player, $interactionNpc, "comfort")>>
<div class="interaction-btn has-tips" data-category="supportive" data-interaction="comfort">
<<button _comfortBtnText "enhanced_interaction_comfort">><</button>>
</div>
<<else>>
<div class="interaction-btn disabled" data-interaction="comfort"><<button "Comfort">><</button>></div>
<</if>>
<<if setup.canEnhancedInteract($player, $interactionNpc, "encourage")>>
<div class="interaction-btn has-tips" data-category="supportive" data-interaction="encourage">
<<button _encourageBtnText "enhanced_interaction_encourage">><</button>>
</div>
<<else>>
<div class="interaction-btn disabled" data-interaction="encourage"><<button "Encourage">><</button>></div>
<</if>>
<<if setup.canEnhancedInteract($player, $interactionNpc, "offerHelp")>>
<div class="interaction-btn has-tips" data-category="supportive" data-interaction="offerHelp">
<<button _offerHelpBtnText "enhanced_interaction_offerHelp">><</button>>
</div>
<<else>>
<div class="interaction-btn disabled" data-interaction="offerHelp"><<button "Offer Help">><</button>></div>
<</if>>
<<set _apologizeBlockReason = setup.getInteractionBlockReason($player, $interactionNpc, "apologize")>>
<<set _hasApologyGrievance = !_apologizeBlockReason.includes("Nothing to apologise")>>
<<if _hasApologyGrievance>>
<<if setup.canEnhancedInteract($player, $interactionNpc, "apologize")>>
<div class="interaction-btn has-tips" data-category="supportive" data-interaction="apologize">
<<button _apologizeBtnText "enhanced_interaction_apologize">><</button>>
</div>
<<else>>
<div class="interaction-btn disabled" @title="_apologizeBlockReason"><<button "Apologize">><</button>></div>
<</if>>
<</if>>
<<if setup.canEnhancedInteract($player, $interactionNpc, "askForAdvice")>>
<div class="interaction-btn has-tips" data-category="supportive" data-interaction="askForAdvice">
<<button _askForAdviceBtnText "enhanced_interaction_askForAdvice">><</button>>
</div>
<<else>>
<div class="interaction-btn disabled" data-interaction="askForAdvice"><<button "Ask Advice">><</button>></div>
<</if>>
</div>
</div>
</div>
<!-- ═════ ROW 2: PLAYFUL, FAMILY, ROMANCE ═════ -->
<div class="categories-row">
<!-- PLAYFUL -->
<div class="interaction-category">
<div class="category-header">
<span class="category-icon">🎮</span>
<span class="category-title">Playful</span>
</div>
<div class="category-buttons">
<<if setup.canEnhancedInteract($player, $interactionNpc, "tellJoke")>>
<div class="interaction-btn has-tips" data-category="playful" data-interaction="tellJoke">
<<button _tellJokeBtnText "enhanced_interaction_tellJoke">><</button>>
</div>
<<else>>
<div class="interaction-btn disabled" data-interaction="tellJoke"><<button "Tell Joke">><</button>></div>
<</if>>
<<if setup.canEnhancedInteract($player, $interactionNpc, "playfulTease")>>
<div class="interaction-btn has-tips" data-category="playful" data-interaction="playfulTease">
<<button _playfulTeaseBtnText "enhanced_interaction_playfulTease">><</button>>
</div>
<<else>>
<div class="interaction-btn disabled" data-interaction="playfulTease"><<button "Tease">><</button>></div>
<</if>>
<<if setup.canEnhancedInteract($player, $interactionNpc, "playGame")>>
<div class="interaction-btn has-tips" data-category="playful" data-interaction="playGame">
<<button _playGameBtnText "enhanced_interaction_playGame">><</button>>
</div>
<<else>>
<div class="interaction-btn disabled" data-interaction="playGame"><<button "Play Game">><</button>></div>
<</if>>
</div>
</div>
<!-- PERSONAL -->
<div class="interaction-category">
<div class="category-header">
<span class="category-icon">🔍</span>
<span class="category-title">Personal</span>
</div>
<div class="category-buttons">
<<set _knowBetterKinkState = window.getKnowNpcBetterState($player, $interactionNpc)>>
<<if _knowBetterKinkState.canAttempt>>
<<set _knowBetterKinkLabel = "Get to know better (" + _knowBetterKinkState.chance + "%)">>
<div class="interaction-btn has-tips" data-category="friendly" data-interaction="getToKnowBetter" title="Learn one still-unknown preference">
<<button _knowBetterKinkLabel "AskNpcKinkPreference">><</button>>
</div>
<<elseif _knowBetterKinkState.code === "all-known">>
<div class="interaction-btn disabled" data-interaction="getToKnowBetter" title="Bring up a specific topic to hear how they feel now"><<button "Try a specific topic instead">><</button>></div>
<<else>>
<div class="interaction-btn disabled" data-interaction="getToKnowBetter" @title="_knowBetterKinkState.reason"><<button "Get to know better (not now)">><</button>></div>
<</if>>
<<if setup.getNpcPreferenceConversationTopics($player, $interactionNpc).length > 0>>
<div class="interaction-btn has-tips" data-category="friendly" data-interaction="discussPreferences" title="Ask about a specific interest, including topics you have not discussed before">
<<button "Talk about interests and boundaries" "NpcPreferenceConversation">><</button>>
</div>
<</if>>
<<set _knownKinkDiscussionOptions = window.getNpcKinkDiscussionOptions($player, $interactionNpc)>>
<<if _knownKinkDiscussionOptions.length > 0>>
<div class="interaction-btn has-tips" data-category="friendly" data-interaction="discussKnownKinks" title="Use preferences and boundaries you have already learned">
<<button "Discuss known preferences" "DiscussNpcKinks">><</button>>
</div>
<</if>>
<div class="interaction-btn has-tips" data-category="friendly" data-interaction="askDestination" title="Ask where they are ultimately headed">
<<button "Where are you going?" "AskNpcTravelDestination">><</button>>
</div>
<div class="interaction-btn has-tips" data-category="friendly" data-interaction="askCurrentDesire" title="Ask about their immediate plans without revealing hidden simulation values">
<<button "What do you want right now?" "AskNpcCurrentDesire">><</button>>
</div>
<div class="interaction-btn has-tips" data-category="friendly" data-interaction="askPersonalLife" title="They may choose to reveal a personal ambition">
<<button "Ask about their personal life" "AskNpcPersonalLife">><</button>>
</div>
<<if typeof window.CanAskNpcPartnerFeminization === "function" && window.CanAskNpcPartnerFeminization($player, $interactionNpc)>>
<div class="interaction-btn has-tips" data-category="friendly" data-interaction="askPartnerChanges" title="Ask about subtle changes around their relationship">
<<button "Ask about recent changes" "AskNpcPartnerChanges">><</button>>
</div>
<</if>>
<div class="interaction-btn has-tips" data-category="friendly" data-interaction="askKnownRumor" title="Ask for a rumor they know. Valuable secrets require more trust.">
<<button "Have you heard any rumors?" "AskNpcKnownRumor">><</button>>
</div>
<<if GetPlayerRumorDiscussionOptions($interactionNpc).length>>
<div class="interaction-btn" data-category="friendly" data-interaction="discussKnownRumor">
<<button "Discuss a story I heard" "DiscussKnownRumor">><<unset $rumorDiscussionResult>><</button>>
</div>
<</if>>
<div class="interaction-btn has-tips" data-category="friendly" data-interaction="privacyConversation" title="Discuss personal matters and who may hear them">
<<button "Talk about a confidence" "NpcConfidenceConversation">><</button>>
</div>
<<set _witnessGossip = (typeof window.getWitnessesAboutNpc === "function") ? window.getWitnessesAboutNpc($interactionNpc.info.id, $interactionNpc.info.id) : []>>
<<if _witnessGossip && _witnessGossip.length > 0>>
<div class="interaction-btn has-tips" data-category="friendly" data-interaction="gossipAboutPair" title="Bring up a recent interaction you personally witnessed">
<<button "Bring up something I saw" "GossipAboutPair">><</button>>
</div>
<</if>>
<<if setup.canEnhancedInteract($player, $interactionNpc, "askAboutFamily")>>
<div class="interaction-btn has-tips" data-category="friendly" data-interaction="askAboutFamily">
<<button _askAboutFamilyBtnText "enhanced_interaction_askAboutFamily">><</button>>
</div>
<<else>>
<div class="interaction-btn disabled" data-interaction="askAboutFamily"><<button "Ask About Family">><</button>></div>
<</if>>
<<if setup.canEnhancedInteract($player, $interactionNpc, "talkAboutParents")>>
<div class="interaction-btn has-tips" data-category="friendly" data-interaction="talkAboutParents">
<<button _talkAboutParentsBtnText "enhanced_interaction_talkAboutParents">><</button>>
</div>
<<else>>
<div class="interaction-btn disabled" data-interaction="talkAboutParents"><<button "About Parents">><</button>></div>
<</if>>
<<if setup.canEnhancedInteract($player, $interactionNpc, "talkAboutSiblings")>>
<div class="interaction-btn has-tips" data-category="friendly" data-interaction="talkAboutSiblings">
<<button _talkAboutSiblingsBtnText "enhanced_interaction_talkAboutSiblings">><</button>>
</div>
<<else>>
<div class="interaction-btn disabled" data-interaction="talkAboutSiblings"><<button "About Siblings">><</button>></div>
<</if>>
<<if setup.canEnhancedInteract($player, $interactionNpc, "askOrientation")>>
<div class="interaction-btn has-tips" data-category="friendly" data-interaction="askOrientation">
<<button _askOrientationBtnText "enhanced_interaction_askOrientation">><</button>>
</div>
<<else>>
<div class="interaction-btn disabled" data-interaction="askOrientation"><<button "Ask Orientation">><</button>></div>
<</if>>
<<if setup.canEnhancedInteract($player, $interactionNpc, "askSexRole")>>
<div class="interaction-btn has-tips" data-category="friendly" data-interaction="askSexRole">
<<button _askSexRoleBtnText "enhanced_interaction_askSexRole">><</button>>
</div>
<<else>>
<div class="interaction-btn disabled" data-interaction="askSexRole"><<button "Ask Sex Role">><</button>></div>
<</if>>
<<if setup.canEnhancedInteract($player, $interactionNpc, "askClothingPref")>>
<div class="interaction-btn has-tips" data-category="friendly" data-interaction="askClothingPref">
<<button _askClothingPrefBtnText "enhanced_interaction_askClothingPref">><</button>>
</div>
<<else>>
<div class="interaction-btn disabled" data-interaction="askClothingPref"><<button "Ask Clothing Pref">><</button>></div>
<</if>>
</div>
</div>
<!-- ROMANCE -->
<div class="interaction-category">
<div class="category-header">
<span class="category-icon">💕</span>
<span class="category-title">Romance</span>
</div>
<div class="category-buttons">
<<if setup.canEnhancedInteract($player, $interactionNpc, "compliment")>>
<div class="interaction-btn has-tips" data-category="romantic" data-interaction="compliment">
<<button _complimentBtnText "enhanced_interaction_compliment">><</button>>
</div>
<<else>>
<div class="interaction-btn disabled" data-interaction="compliment"><<button "Compliment">><</button>></div>
<</if>>
<<if setup.canEnhancedInteract($player, $interactionNpc, "flirt")>>
<div class="interaction-btn has-tips" data-category="romantic" data-interaction="flirt">
<<button _flirtBtnText "enhanced_interaction_flirt">><</button>>
</div>
<<else>>
<div class="interaction-btn disabled" data-interaction="flirt"><<button "Flirt">><</button>></div>
<</if>>
<<if setup.canEnhancedInteract($player, $interactionNpc, "holdHands")>>
<div class="interaction-btn has-tips" data-category="romantic" data-interaction="holdHands">
<<button _holdHandsBtnText "enhanced_interaction_holdHands">><</button>>
</div>
<<else>>
<div class="interaction-btn disabled" data-interaction="holdHands"><<button "Hold Hands">><</button>></div>
<</if>>
<<if setup.canEnhancedInteract($player, $interactionNpc, "hug")>>
<div class="interaction-btn has-tips" data-category="romantic" data-interaction="hug">
<<button _hugBtnText "enhanced_interaction_hug">><</button>>
</div>
<<else>>
<div class="interaction-btn disabled" data-interaction="hug"><<button "Hug">><</button>></div>
<</if>>
<<if setup.canEnhancedInteract($player, $interactionNpc, "confessLove")>>
<div class="interaction-btn has-tips" data-category="romantic" data-interaction="confessLove">
<<button _confessLoveBtnText "enhanced_interaction_confessLove">><</button>>
</div>
<<else>>
<div class="interaction-btn disabled" data-interaction="confessLove"><<button "Confess Love">><</button>></div>
<</if>>
<<if setup.canEnhancedInteract($player, $interactionNpc, "proposeDate")>>
<div class="interaction-btn has-tips" data-category="romantic" data-interaction="proposeDate">
<<button _proposeDateBtnText "enhanced_interaction_proposeDate">><</button>>
</div>
<<else>>
<div class="interaction-btn disabled" data-interaction="proposeDate"><<button "Ask Date">><</button>></div>
<</if>>
/* Asking to go steady only makes sense while you are not already a couple. */
<<if !_coupleView || !_coupleView.active>>
<<if setup.canEnhancedInteract($player, $interactionNpc, "askToDate")>>
<div class="interaction-btn has-tips" data-category="romantic" data-interaction="askToDate">
<<button _askToDateBtnText "enhanced_interaction_askToDate">><</button>>
</div>
<<else>>
<div class="interaction-btn disabled" data-interaction="askToDate"><<button "Ask to Date">><</button>></div>
<</if>>
<</if>>
</div>
</div>
</div>
<!-- ═════ ROW 3: INTIMATE, ACTIONS, PERSUASION ═════ -->
<div class="categories-row special-row">
<!-- INTIMATE -->
<div class="interaction-category">
<div class="category-header">
<span class="category-icon">🔥</span>
<span class="category-title">Intimate</span>
</div>
<div class="category-buttons">
<<if setup.canEnhancedInteract($player, $interactionNpc, "kiss")>>
<div class="interaction-btn has-tips" data-category="intimate" data-interaction="kiss">
<<button _kissBtnText "enhanced_interaction_kiss">><</button>>
</div>
<<else>>
<div class="interaction-btn disabled" data-interaction="kiss"><<button "Kiss">><</button>></div>
<</if>>
<<if setup.canEnhancedInteract($player, $interactionNpc, "passionateKiss")>>
<div class="interaction-btn has-tips" data-category="intimate" data-interaction="passionateKiss">
<<button _passionateKissBtnText "enhanced_interaction_passionateKiss">><</button>>
</div>
<<else>>
<div class="interaction-btn disabled" data-interaction="passionateKiss"><<button "Deep Kiss">><</button>></div>
<</if>>
<<if setup.canEnhancedInteract($player, $interactionNpc, "sensualTouch")>>
<div class="interaction-btn has-tips" data-category="intimate" data-interaction="sensualTouch">
<<button _sensualTouchBtnText "enhanced_interaction_sensualTouch">><</button>>
</div>
<<else>>
<div class="interaction-btn disabled" data-interaction="sensualTouch"><<button "Touch">><</button>></div>
<</if>>
<<if setup.canEnhancedInteract($player, $interactionNpc, "massage")>>
<div class="interaction-btn has-tips" data-category="intimate" data-interaction="massage">
<<button _massageBtnText "enhanced_interaction_massage">><</button>>
</div>
<<else>>
<div class="interaction-btn disabled" data-interaction="massage"><<button "Massage">><</button>></div>
<</if>>
<<if setup.canEnhancedInteract($player, $interactionNpc, "askForSex")>>
<div class="interaction-btn has-tips" data-category="intimate" data-interaction="askForSex">
<<button _askForSexBtnText "enhanced_interaction_askForSex">><</button>>
</div>
<<else>>
<div class="interaction-btn disabled" data-interaction="askForSex"><<button "Ask Sex">><</button>></div>
<</if>>
</div>
</div>
<!-- FOLLOW/INVITE -->
<div class="interaction-category">
<div class="category-header">
<span class="category-icon">🚶</span>
<span class="category-title">Actions</span>
</div>
<div class="category-buttons">
/* Sarah Quest 2 - Ask a female NPC to help */
<<if $interactionNpc.gender() == "Female" && getTaskState("sarah_quest_2", "Find a girl who's willing to help") == 'incomplete'>>
<<if setup.canEnhancedInteract($player, $interactionNpc, "askSarahQuestHelp")>>
<div class="interaction-btn has-tips" data-category="supportive" data-interaction="askSarahQuestHelp">
<<button _askSarahQuestHelpBtnText "SarahQuest2_Male_AskForHelp_Chance">><</button>>
</div>
<<else>>
<div class="interaction-btn disabled" data-interaction="askSarahQuestHelp"><<button _askSarahQuestHelpBtnText>><</button>></div>
<</if>>
<</if>>
<<if setup.playerFollowerHas ? setup.playerFollowerHas($interactionNpc.info.id) : $playerFollowers.includes($interactionNpc.info.id)>>
<!-- NPC is already following - show Stop Following button -->
<div class="interaction-btn" data-category="friendly">
<<button "Stop Following" "enhanced_interaction_stopFollowing">><</button>>
</div>
<<elseif setup.canEnhancedInteract($player, $interactionNpc, "followMe")>>
<div class="interaction-btn has-tips" data-category="friendly" data-interaction="followMe">
<<button _followMeBtnText "enhanced_interaction_followMe">><</button>>
</div>
<<else>>
<div class="interaction-btn disabled" data-interaction="followMe"><<button "Follow Me">><</button>></div>
<</if>>
/* Check if NPC is already at player's home */
<<set _isNpcAtPlayerHome = setup.isNpcAtPlayerHome ? setup.isNpcAtPlayerHome($interactionNpc) : false>>
<<if _isNpcAtPlayerHome>>
<div class="interaction-btn disabled" title="Already at your home"><<button "🏠 Already Home">><</button>></div>
<<elseif setup.canEnhancedInteract($player, $interactionNpc, "inviteHome")>>
<div class="interaction-btn has-tips" data-category="romantic" data-interaction="inviteHome">
<<button _inviteHomeBtnText "enhanced_interaction_inviteHome">><</button>>
</div>
<<else>>
<div class="interaction-btn disabled" data-interaction="inviteHome"><<button "Invite Home">><</button>></div>
<</if>>
/* Ask Phone Number - only show if player doesn't have their number yet */
<<if $player.characterEvents.isEventRegistered($interactionNpc.info.id, "Have a phone number") != true>>
<<if setup.canEnhancedInteract($player, $interactionNpc, "askPhoneNumber")>>
<div class="interaction-btn has-tips" data-category="friendly" data-interaction="askPhoneNumber">
<<button _askPhoneNumberBtnText "enhanced_interaction_askPhoneNumber">><</button>>
</div>
<<else>>
<div class="interaction-btn disabled" data-interaction="askPhoneNumber"><<button "📱 Ask Number">><</button>></div>
<</if>>
<<else>>
<div class="interaction-btn" data-category="friendly">
<div class="relation-status-btn" title="You already have their phone number">📱 Has Number</div>
</div>
<</if>>
/* Ask for House Keys - only show if NPC has a home and player doesn't have keys yet */
<<if npcHasHome($interactionNpc.info.id)>>
<<if $player.characterEvents.isEventRegistered($interactionNpc.info.id, "Have house keys") != true>>
<<if setup.canEnhancedInteract($player, $interactionNpc, "askForHouseKeys")>>
<div class="interaction-btn has-tips" data-category="friendly" data-interaction="askForHouseKeys">
<<button _askKeysBtnText "enhanced_interaction_askForHouseKeys">><</button>>
</div>
<<else>>
<div class="interaction-btn disabled" data-interaction="askForHouseKeys"><<button "🔑 Ask Keys">><</button>></div>
<</if>>
<<else>>
<div class="interaction-btn" data-category="friendly">
<div class="relation-status-btn" title="You have the keys to their home">🔑 Has Keys</div>
</div>
<</if>>
<</if>>
/* Give Item - available for most NPCs */
<<set _tempCharWork = $interactionNpc.info.characterWork>>
<<if _tempCharWork != "Pimp" && _tempCharWork != "Photographer" && _tempCharWork != "Porn director">>
<div class="interaction-btn" data-category="friendly">
<<button "Give Item" "GiveItems">><<set $filterType = "All">><<unset $source>><</button>>
</div>
/* Money: give, borrow, lend, pay back (npcMoneyLedger.ts). */
<div class="interaction-btn" data-category="friendly">
<<button "💵 Money" "enhanced_interaction_money">><<unset $moneyResult>><</button>>
</div>
<</if>>
/* Meet up: agree on a time and place; they really come (playerNpcMeetings.ts). */
<<if setup.playerNpcMeetings.canOffer($interactionNpc)>>
<div class="interaction-btn" data-category="friendly">
<<button "📅 Meet up" "enhanced_interaction_meet">><<unset $meetResult>><</button>>
</div>
<</if>>
/* Break Up - the player-initiated exit from a romance. Without it the
only way out of a healthy relationship was to make the NPC leave. */
<<set _mainRelation = $player.getRelationship($interactionNpc.info.id, false)?.relation ?? "acquaintance">>
<<if _mainRelation == "dating" || _mainRelation == "soulmate">>
<div class="interaction-btn" data-category="romantic">
<<button "💔 Break Up" "enhanced_interaction_breakUp">><</button>>
</div>
<</if>>
/* Recruit into whoring - the payoff for the pimp's recruiting perk
("bring girls to me, I'll pay for each one"), which previously had
no consumer anywhere in the game. */
<<if $interactionNpc.gender() != "Male" && (IsStudent($interactionNpc) || IsOrdinaryCitizen($interactionNpc)) && ($player.characterEvents.isEventRegistered($player.info.id, "CanRecruit Hookers") || $player.characterEvents.isEventRegistered($player.info.id, "Became A Pimp"))>>
<div class="interaction-btn" data-category="persuasion">
<<button "Recruit into whoring" "PersuadeToBecomeWhore">><<set $persuadeType = "Persuade">><</button>>
</div>
<</if>>
/* Sarah Quest 2 - legacy button block kept disabled */
<<if false>>
<div class="interaction-btn" data-category="friendly">
<<button "🔍 Ask for help" "SarahQuest2_Male_AskForHelp">><</button>>
</div>
<</if>>
/* Offer Ride - requires car */
<<if $playercars && $playercars.length > 0>>
<<if setup.canOfferRide && setup.canOfferRide($player, $interactionNpc)>>
<<set _offerRideChance = setup.offerRideChance ? setup.offerRideChance($player, $interactionNpc) : 50>>
<<set _offerRideBtnText = "🚗 Offer Ride (" + _offerRideChance + "%)">>
<div class="interaction-btn" data-category="friendly">
<<button _offerRideBtnText "enhanced_interaction_offerRide">><</button>>
</div>
<<else>>
<div class="interaction-btn disabled" title="Already offered a ride today"><<button "🚗 Offer Ride">><</button>></div>
<</if>>
<</if>>
/* Invite to Beach - requires AmandaPicnicQuestCompleted and car */
<<set _questInfo = $interactionNpc.info.questInfo>>
<<set _isRestrictedQuestChar = _questInfo && _questInfo.isQuestCharacter == true>>
<<set _canInviteToBeach = !_questInfo || !_isRestrictedQuestChar>>
<<if _canInviteToBeach && $playercars && $playercars.length > 0 && $player.characterEvents.isEventRegistered($player.info.id, 'AmandaPicnicQuestCompleted') == true>>
<<if $player.dailyEvents.isEventRegistered($player.info.id, "BeachInvite") == false>>
<<if setup.canInviteToBeachPicnic && setup.canInviteToBeachPicnic($player, $interactionNpc)>>
<<set _invitePicnicChance = setup.inviteToBeachPicnicChance ? setup.inviteToBeachPicnicChance($player, $interactionNpc) : 50>>
<<set _inviteBeachBtnText = "🏖️ Invite to Beach (" + _invitePicnicChance + "%)">>
<<capture _invitePicnicChance>>
<div class="interaction-btn" data-category="friendly">
<<button _inviteBeachBtnText "InviteToPicnic">><<set $chance = _invitePicnicChance>><</button>>
</div>
<</capture>>
<<else>>
<div class="interaction-btn disabled" title="Requires: Friendship ≥ 40, Love ≥ 35"><<button "🏖️ Invite to Beach">><</button>></div>
<</if>>
<<else>>
<div class="interaction-btn disabled" title="Already invited someone today"><<button "🏖️ Invite to Beach">><</button>></div>
<</if>>
<</if>>
/* BDSM Session - requires Alice quest completion */
<<set _canTrainNpc = $player.characterEvents.isEventRegistered($player.info.id, "CanTrainNPC")>>
<<if _canTrainNpc == true>>
<<set _bdsmRelData = $player.getRelationship($interactionNpc.info.id, false)>>
<<set _bdsmMetrics = _bdsmRelData.metrics>>
<<set _bdsmRelation = _bdsmRelData.relation ?? "acquaintance">>
/* Access metrics directly like other code does */
<<set _bdsmLove = Math.floor(_bdsmMetrics.love) || 0>>
<<set _bdsmSex = Math.floor(_bdsmMetrics.sex) || 0>>
<<set _isRomantic = _bdsmRelation == "dating" || _bdsmRelation == "fuckbuddy" || _bdsmRelation == "soulmate">>
<<set _hasEnoughRelation = _bdsmLove >= 30 || _bdsmSex >= 40 || _isRomantic>>
<<set _hasEnoughMoney = $player.money >= 200>>
<<set _isBdsmQuestNpc = $interactionNpc.info.questInfo && $interactionNpc.info.questInfo.isQuestCharacter == true>>
<<set _bdsmChance = Math.min(95, Math.floor(30 + _bdsmLove * 0.5 + _bdsmSex * 0.8))>>
/* Pre-calculate tooltip text */
<<set _playerMoney = $player.money || 0>>
<<set _bdsmMoneyTooltip = "Requires: $200 (You: $" + _playerMoney + ")">>
<<set _bdsmRelTooltip = "Requires: Love ≥ 30 (" + _bdsmLove + "), Sex ≥ 40 (" + _bdsmSex + "), or romance">>
<<set _bdsmBtnText = "⛓️ BDSM (" + _bdsmChance + "%, $200)">>
<<if _isBdsmQuestNpc>>
<div class="interaction-btn disabled" title="Cannot train quest characters"><<button "⛓️ BDSM">><</button>></div>
<<elseif !_hasEnoughMoney>>
<div class="interaction-btn disabled" @title="_bdsmMoneyTooltip"><<button "⛓️ BDSM ($200)">><</button>></div>
<<elseif !_hasEnoughRelation>>
<div class="interaction-btn disabled" @title="_bdsmRelTooltip"><<button "⛓️ BDSM ($200)">><</button>></div>
<<else>>
<div class="interaction-btn bdsm-btn" data-category="intimate">
<<button _bdsmBtnText "enhanced_interaction_inviteBDSM">><</button>>
</div>
<</if>>
<</if>>
</div>
</div>
<!-- JOB INTERACTIONS - Show only for specific NPCs based on their job -->
<<set _npcJob = $interactionNpc.info.characterWork>>
<<set _hasJobInteractions = _npcJob == "Photographer" || _npcJob == "Porn director" || _npcJob == "Plastic Surgeon" || _npcJob == "Hooker" || _npcJob == "Pimp">>
<<if _hasJobInteractions>>
<div class="interaction-category">
<div class="category-header">
<span class="category-icon">💼</span>
<span class="category-title">Job Services</span>
</div>
<div class="category-buttons">
/* Check work hours for sellers (8:00 - 20:00) */
<<set _workHour = ($dateTime.hours >= 8 && $dateTime.hours <= 20)>>
/* Check content filter for sexual interactions */
<<run _contentAllow = CheckContentFilter($interactionNpc)>>
/* PHOTOGRAPHER */
<<if _npcJob == "Photographer">>
<<if $player.characterEvents.isEventRegistered($player.info.id, "Buy a photo studio") == false>>
<<if _workHour>>
<div class="interaction-btn" data-category="job">
<<button "📸 Photo Shoot" "Photographer">><</button>>
</div>
<<else>>
<div class="interaction-btn disabled" title="Not during work hours"><<button "📸 Photo Shoot">><</button>></div>
<</if>>
<<else>>
<div class="interaction-btn disabled" title="You own a photo studio"><<button "📸 Photo Shoot">><</button>></div>
<</if>>
<</if>>
/* PORN DIRECTOR */
<<if _npcJob == "Porn director">>
<div class="interaction-btn" data-category="job">
<<button "🎬 Porn Shoot" "PornShooting">><</button>>
</div>
<</if>>
/* PLASTIC SURGEON */
<<if _npcJob == "Plastic Surgeon">>
<<if _workHour>>
<div class="interaction-btn" data-category="job">
<<button "💉 Plastic Surgery">><<ShowSurgery $player>><</button>>
</div>
<div class="interaction-btn" data-category="job">
<<button "🧪 Drug Testing" "DrugTesting">><<set $isPlayer = true>><</button>>
</div>
<<else>>
<div class="interaction-btn disabled" title="Not during work hours"><<button "💉 Plastic Surgery">><</button>></div>
<div class="interaction-btn disabled" title="Not during work hours"><<button "🧪 Drug Testing">><</button>></div>
<</if>>
<</if>>
/* HOOKER */
<<if _npcJob == "Hooker">>
<<run _contentAllow = CheckContentFilter($interactionNpc)>>
<<if $player.characterEvents.isEventRegistered($player.info.id, "Became A Pimp") == true>>
<div class="interaction-btn" data-category="job">
<<button "👠 Hooker Management" "HookerTalk">><</button>>
</div>
<<else>>
<<if _contentAllow != false>>
<div class="interaction-btn" data-category="job">
<<button "💋 Sexual Services ($500)" "AskSexServices">><</button>>
</div>
<<else>>
<div class="interaction-btn disabled" title="Disabled by content filter"><<button "💋 Sexual Services ($500)">><</button>></div>
<</if>>
<</if>>
<</if>>
/* PIMP */
<<if _npcJob == "Pimp">>
<<if $player.characterEvents.isEventRegistered($player.info.id, "Became A Pimp") == false>>
<div class="interaction-btn" data-category="job">
<<button "❓ Ask Questions" "AskQuestions_Pimp">><</button>>
</div>
<</if>>
<</if>>
</div>
</div>
<</if>>
<!-- PERSUASION -->
<div class="interaction-category">
<div class="category-header">
<span class="category-icon">🎭</span>
<span class="category-title">Persuasion</span>
</div>
<div class="category-buttons">
/* Check if NPC is on HRT and show discuss feminization button */
<<set _isOnHRT = $interactionNpc.saveData && $interactionNpc.saveData.get && $interactionNpc.saveData.get("onHRT") == true>>
<<set _npcGender = $interactionNpc.gender()>>
<<if _isOnHRT>>
/* NPC is on HRT - show discuss feminization instead of convince HRT */
<<if setup.canEnhancedInteract($player, $interactionNpc, "discussFeminization")>>
<div class="interaction-btn has-tips" data-category="persuasion" data-interaction="discussFeminization">
<<button _discussFeminizationBtnText "enhanced_interaction_discussFeminization">><</button>>
</div>
<<else>>
<div class="interaction-btn disabled" data-interaction="discussFeminization"><<button "Discuss Changes">><</button>></div>
<</if>>
<<elseif _npcGender == "Male">>
/* Male NPC - can convince to start HRT */
<<if setup.canEnhancedInteract($player, $interactionNpc, "convinceHRT")>>
<div class="interaction-btn has-tips" data-category="persuasion" data-interaction="convinceHRT">
<<button _convinceHRTBtnText "enhanced_interaction_convinceHRT">><</button>>
</div>
<<else>>
<div class="interaction-btn disabled" data-interaction="convinceHRT"><<button "Suggest HRT">><</button>></div>
<</if>>
<</if>>
/* Gender change - available for all */
<<if setup.canEnhancedInteract($player, $interactionNpc, "convinceGenderChange")>>
<div class="interaction-btn has-tips" data-category="persuasion" data-interaction="convinceGenderChange">
<<button _convinceGenderChangeBtnText "enhanced_interaction_convinceGenderChange">><</button>>
</div>
<<else>>
<div class="interaction-btn disabled" data-interaction="convinceGenderChange"><<button "Change Gender">><</button>></div>
<</if>>
/* Sexual orientation change */
<<if setup.canEnhancedInteract($player, $interactionNpc, "convinceOrientationChange")>>
<div class="interaction-btn has-tips" data-category="persuasion" data-interaction="convinceOrientationChange">
<<button _convinceOrientationBtnText "enhanced_interaction_convinceOrientation">><</button>>
</div>
<<else>>
<div class="interaction-btn disabled" data-interaction="convinceOrientationChange"><<button "Change Orientation">><</button>></div>
<</if>>
</div>
</div>
</div>
</div>
<!-- FOOTER: STATS, CHEATS, LEAVE -->
<div class="interaction-footer">
<div class="footer-buttons">
<div class="btn"><<button "Stats">>
<<run Dialog.create("Info")>>
<<run Dialog.wiki('<<CharacterStatsView $interactionNpc true>>')>>
<<run Dialog.open();>>
<</button>></div>
/* Quest characters keep their scripted outfits - stripping a
uniform mid-quest breaks appearance checks and prose (same
exclusion the fight-victory stripping already applies). */
<<if !$interactionNpc.info.questInfo || $interactionNpc.info.questInfo.isQuestCharacter != true>>
<<set _npcOutfitChance = getNpcClothingAcceptanceChance($player, $interactionNpc)>>
<<set _npcOutfitButton = "Change outfit (" + _npcOutfitChance + "%)">>
<div class="btn"><<button _npcOutfitButton>><<OpenNpcClothingManager "interaction">><</button>></div>
<</if>>
<<if $interactionNpc.info.characterWork != "Pimp" && $interactionNpc.info.characterWork != "Photographer" && $interactionNpc.info.characterWork != "Porn director" && (!$interactionNpc.info.questInfo || $interactionNpc.info.questInfo.isQuestCharacter != true)>>
<div class="btn"><<button "Cheats">><<ShowCheats $interactionNpc>><</button>></div>
<</if>>
<div class="btn"><<button "Leave" "NudeCheck">><<set $canShowStatsBtn = true>><<set $gameSettings.allowSaves = true>><</button>></div>
</div>
</div>
/* AI chat: its own row under Stats, Cheats and Leave. Always shown for ordinary NPCs;
grey with the reason on hover when it cannot open (npcChatLive.ts aiNpcChatButton). */
<<if typeof aiNpcChatButton === "function">>
<<set _aiChatButton = aiNpcChatButton($interactionNpc)>>
<<else>>
<<set _aiChatButton = {show: true, ok: false, reason: "AI features are not available in this version of the game."}>>
<</if>>
<<if _aiChatButton.show>>
<<set _aiChatLabel = "💬 Chat with " + $interactionNpc.info.firstName>>
<div class="interaction-ai-chat-row">
<<if _aiChatButton.ok>>
<div class="ai-chat-entry"><<button _aiChatLabel "AiNpcChat">><</button>></div>
<<else>>
<div class="ai-chat-entry is-off" tabindex="0" role="note" @data-tip="_aiChatButton.reason" @aria-label="_aiChatLabel + '. ' + _aiChatButton.reason"><button type="button" aria-disabled="true" tabindex="-1"><<print _aiChatLabel>></button></div>
<</if>>
</div>
<</if>>
</div>
<<InitInteractionTips>>
<</nobr>><<nobr>>
/* Friendly */
<<set _smallTalkBtnText = "Small Talk (" + setup.enhancedSuccessChance($player, $interactionNpc, "smallTalk") + "%)">>
<<set _smallTalkTips = setup.getImprovementTips($player, $interactionNpc, "smallTalk")>>
<<set _deepConversationBtnText = "Deep Talk (" + setup.enhancedSuccessChance($player, $interactionNpc, "deepConversation") + "%)">>
<<set _deepConversationTips = setup.getImprovementTips($player, $interactionNpc, "deepConversation")>>
<<set _shareSecretBtnText = "Share Secret (" + setup.enhancedSuccessChance($player, $interactionNpc, "shareSecret") + "%)">>
<<set _shareSecretTips = setup.getImprovementTips($player, $interactionNpc, "shareSecret")>>
<<set _askForAdviceBtnText = "Ask Advice (" + setup.enhancedSuccessChance($player, $interactionNpc, "askForAdvice") + "%)">>
<<set _askForAdviceTips = setup.getImprovementTips($player, $interactionNpc, "askForAdvice")>>
<<set _giveGiftBtnText = "Give Gift $50 (" + setup.enhancedSuccessChance($player, $interactionNpc, "giveGift") + "%)">>
<<set _giveGiftTips = setup.getImprovementTips($player, $interactionNpc, "giveGift")>>
<<set _inviteToBarBtnText = "Bar $150 (" + setup.enhancedSuccessChance($player, $interactionNpc, "inviteToBar") + "%)">>
<<set _inviteToBarTips = setup.getImprovementTips($player, $interactionNpc, "inviteToBar")>>
/* Family */
<<set _askAboutFamilyBtnText = "Ask About Family (" + setup.enhancedSuccessChance($player, $interactionNpc, "askAboutFamily") + "%)">>
<<set _askAboutFamilyTips = setup.getImprovementTips($player, $interactionNpc, "askAboutFamily")>>
<<set _talkAboutParentsBtnText = "About Parents (" + setup.enhancedSuccessChance($player, $interactionNpc, "talkAboutParents") + "%)">>
<<set _talkAboutParentsTips = setup.getImprovementTips($player, $interactionNpc, "talkAboutParents")>>
<<set _talkAboutSiblingsBtnText = "About Siblings (" + setup.enhancedSuccessChance($player, $interactionNpc, "talkAboutSiblings") + "%)">>
<<set _talkAboutSiblingsTips = setup.getImprovementTips($player, $interactionNpc, "talkAboutSiblings")>>
/* Personal */
<<set _askOrientationBtnText = "Ask Orientation (" + setup.enhancedSuccessChance($player, $interactionNpc, "askOrientation") + "%)">>
<<set _askOrientationTips = setup.getImprovementTips($player, $interactionNpc, "askOrientation")>>
<<set _askSexRoleBtnText = "Ask Sex Role (" + setup.enhancedSuccessChance($player, $interactionNpc, "askSexRole") + "%)">>
<<set _askSexRoleTips = setup.getImprovementTips($player, $interactionNpc, "askSexRole")>>
<<set _askClothingPrefBtnText = "Ask Clothing Pref (" + setup.enhancedSuccessChance($player, $interactionNpc, "askClothingPref") + "%)">>
<<set _askClothingPrefTips = setup.getImprovementTips($player, $interactionNpc, "askClothingPref")>>
/* Supportive */
<<set _comfortBtnText = "Comfort (" + setup.enhancedSuccessChance($player, $interactionNpc, "comfort") + "%)">>
<<set _comfortTips = setup.getImprovementTips($player, $interactionNpc, "comfort")>>
<<set _encourageBtnText = "Encourage (" + setup.enhancedSuccessChance($player, $interactionNpc, "encourage") + "%)">>
<<set _encourageTips = setup.getImprovementTips($player, $interactionNpc, "encourage")>>
<<set _offerHelpBtnText = "Offer Help (" + setup.enhancedSuccessChance($player, $interactionNpc, "offerHelp") + "%)">>
<<set _offerHelpTips = setup.getImprovementTips($player, $interactionNpc, "offerHelp")>>
<<set _apologizeBtnText = "Apologize (" + setup.enhancedSuccessChance($player, $interactionNpc, "apologize") + "%)">>
<<set _apologizeTips = setup.getImprovementTips($player, $interactionNpc, "apologize")>>
/* Playful */
<<set _tellJokeBtnText = "Tell Joke (" + setup.enhancedSuccessChance($player, $interactionNpc, "tellJoke") + "%)">>
<<set _tellJokeTips = setup.getImprovementTips($player, $interactionNpc, "tellJoke")>>
<<set _playfulTeaseBtnText = "Tease (" + setup.enhancedSuccessChance($player, $interactionNpc, "playfulTease") + "%)">>
<<set _playfulTeaseTips = setup.getImprovementTips($player, $interactionNpc, "playfulTease")>>
<<set _playGameBtnText = "Play Game (" + setup.enhancedSuccessChance($player, $interactionNpc, "playGame") + "%)">>
<<set _playGameTips = setup.getImprovementTips($player, $interactionNpc, "playGame")>>
/* Romantic */
<<set _complimentBtnText = "Compliment (" + setup.enhancedSuccessChance($player, $interactionNpc, "compliment") + "%)">>
<<set _complimentTips = setup.getImprovementTips($player, $interactionNpc, "compliment")>>
<<set _flirtBtnText = "Flirt (" + setup.enhancedSuccessChance($player, $interactionNpc, "flirt") + "%)">>
<<set _flirtTips = setup.getImprovementTips($player, $interactionNpc, "flirt")>>
<<set _holdHandsBtnText = "Hold Hands (" + setup.enhancedSuccessChance($player, $interactionNpc, "holdHands") + "%)">>
<<set _holdHandsTips = setup.getImprovementTips($player, $interactionNpc, "holdHands")>>
<<set _hugBtnText = "Hug (" + setup.enhancedSuccessChance($player, $interactionNpc, "hug") + "%)">>
<<set _hugTips = setup.getImprovementTips($player, $interactionNpc, "hug")>>
<<set _confessLoveBtnText = "Confess (" + setup.enhancedSuccessChance($player, $interactionNpc, "confessLove") + "%)">>
<<set _confessLoveTips = setup.getImprovementTips($player, $interactionNpc, "confessLove")>>
<<set _proposeDateBtnText = "Ask Date (" + setup.enhancedSuccessChance($player, $interactionNpc, "proposeDate") + "%)">>
<<set _proposeDateTips = setup.getImprovementTips($player, $interactionNpc, "proposeDate")>>
/* Intimate */
<<set _kissBtnText = "Kiss (" + setup.enhancedSuccessChance($player, $interactionNpc, "kiss") + "%)">>
<<set _kissTips = setup.getImprovementTips($player, $interactionNpc, "kiss")>>
<<set _passionateKissBtnText = "Deep Kiss (" + setup.enhancedSuccessChance($player, $interactionNpc, "passionateKiss") + "%)">>
<<set _passionateKissTips = setup.getImprovementTips($player, $interactionNpc, "passionateKiss")>>
<<set _sensualTouchBtnText = "Touch (" + setup.enhancedSuccessChance($player, $interactionNpc, "sensualTouch") + "%)">>
<<set _sensualTouchTips = setup.getImprovementTips($player, $interactionNpc, "sensualTouch")>>
<<set _massageBtnText = "Massage (" + setup.enhancedSuccessChance($player, $interactionNpc, "massage") + "%)">>
<<set _massageTips = setup.getImprovementTips($player, $interactionNpc, "massage")>>
<<set _askForSexBtnText = "Ask Sex (" + setup.enhancedSuccessChance($player, $interactionNpc, "askForSex") + "%)">>
<<set _askForSexTips = setup.getImprovementTips($player, $interactionNpc, "askForSex")>>
/* Aggressive */
<<set _insultBtnText = "Insult (" + setup.enhancedSuccessChance($player, $interactionNpc, "insult") + "%)">>
<<set _insultTips = setup.getImprovementTips($player, $interactionNpc, "insult")>>
<<set _threatenBtnText = "Threaten (" + setup.enhancedSuccessChance($player, $interactionNpc, "threaten") + "%)">>
<<set _threatenTips = setup.getImprovementTips($player, $interactionNpc, "threaten")>>
<<set _intimidateBtnText = "Intimidate (" + setup.enhancedSuccessChance($player, $interactionNpc, "intimidate") + "%)">>
<<set _intimidateTips = setup.getImprovementTips($player, $interactionNpc, "intimidate")>>
<<set _challengeBtnText = "Challenge (" + setup.enhancedSuccessChance($player, $interactionNpc, "challenge") + "%)">>
<<set _challengeTips = setup.getImprovementTips($player, $interactionNpc, "challenge")>>
/* Persuasion */
<<set _convinceGenderChangeBtnText = "Gender (" + setup.enhancedSuccessChance($player, $interactionNpc, "convinceGenderChange") + "%)">>
<<set _convinceHRTBtnText = "HRT (" + setup.enhancedSuccessChance($player, $interactionNpc, "convinceHRT") + "%)">>
<<set _convinceOrientationBtnText = "Orient. (" + setup.enhancedSuccessChance($player, $interactionNpc, "convinceOrientationChange") + "%)">>
<<set _discussFeminizationBtnText = "Changes (" + setup.enhancedSuccessChance($player, $interactionNpc, "discussFeminization") + "%)">>
/* Special Actions */
<<set _followMeBtnText = "Follow Me (" + setup.enhancedSuccessChance($player, $interactionNpc, "followMe") + "%)">>
<<set _followMeTips = setup.getImprovementTips($player, $interactionNpc, "followMe")>>
<<set _inviteHomeBtnText = "Invite Home (" + setup.enhancedSuccessChance($player, $interactionNpc, "inviteHome") + "%)">>
<<set _inviteHomeTips = setup.getImprovementTips($player, $interactionNpc, "inviteHome")>>
<<set _askToDateBtnText = "Ask to Date (" + setup.enhancedSuccessChance($player, $interactionNpc, "askToDate") + "%)">>
<<set _askToDateTips = setup.getImprovementTips($player, $interactionNpc, "askToDate")>>
<<set _askPhoneNumberBtnText = "📱 Number (" + setup.enhancedSuccessChance($player, $interactionNpc, "askPhoneNumber") + "%)">>
<<set _askPhoneNumberTips = setup.getImprovementTips($player, $interactionNpc, "askPhoneNumber")>>
<<set _askKeysBtnText = "🔑 Ask Keys (" + setup.enhancedSuccessChance($player, $interactionNpc, "askForHouseKeys") + "%)">>
<<set _askKeysTips = setup.getImprovementTips($player, $interactionNpc, "askForHouseKeys")>>
<<set _askSarahQuestHelpBtnText = "Ask for help (" + setup.enhancedSuccessChance($player, $interactionNpc, "askSarahQuestHelp") + "%)">>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set $interactionResult = setup.performEnhancedInteraction($player, $interactionNpc, "inviteToBar")>>
<<if $interactionResult.blocked>>
<<include "enhanced_interaction_result_display">>
<<else>>
<<SpendTime 120>>
<<SpendEnergy $player 15>>
<<run setup.applyInteractionEffects($player, $interactionNpc, "inviteToBar", $interactionResult)>>
<<ShowNpcIcon $interactionNpc>>
<<if $interactionResult.criticalSuccess>>
<<Chat $interactionNpc "This was the BEST evening ever! I had so much fun with you! Let's do it again soon! 🍻✨">>
<<ChatMessage "You had an amazing time together at the bar! Your bond has strengthened significantly!">>
<<elseif $interactionResult.criticalFailure>>
<<Chat $interactionNpc "This was... awkward. I think I'll head home early.">>
<<ChatMessage "The evening at the bar didn't go well. It was uncomfortable for both of you.">>
<<elseif $interactionResult.success>>
<<set _relation = $player.getRelationship($interactionNpc.info.id, false)?.relation ?? "acquaintance">>
<<switch _relation>>
<<case "friend" "bestFriend">>
<<Chat $interactionNpc "That was so fun! I love hanging out with you at the bar!">>
<<case "crush">>
<<Chat $interactionNpc "I really enjoyed spending time with you... 😊">>
<<case "dating" "soulmate">>
<<Chat $interactionNpc "Such a romantic evening! You're the best, honey! 💕">>
<<default>>
<<Chat $interactionNpc "Thanks for the drinks! That was nice.">>
<</switch>>
<<ChatMessage "You had a great time at the bar together!">>
<<else>>
<<Chat $interactionNpc "It was okay, I guess. The drinks were nice at least.">>
<<ChatMessage "The evening was average. Nothing special happened.">>
<</if>>
/* Grants, status, money and resentment: one source, shared with the AI chat. */
<<set _consequences = setup.applyInteractionConsequences($player, $interactionNpc, "inviteToBar", $interactionResult)>>
<<include "enhanced_interaction_result_display">>
<</if>>
<</nobr>><<nobr>>
/* Rule lives in setup.checkNpcBusy (interactionOutcomes.ts), shared with the AI chat. */
<<set _isBusy = setup.checkNpcBusy($interactionNpc, $player)>>
<</nobr>><<nobr>>
/* Rule lives in setup.checkInteractionJealousy (interactionOutcomes.ts), shared with the AI chat.
It also sets $romanticPartnerObject, $playerPartner(Index) and the confrontation variables. */
<<set _jealousyCheck = setup.checkInteractionJealousy($player, $interactionNpc)>>
<<set _jealousIntervene = _jealousyCheck.npcPartnerPresent>>
<<set _playerPartnerIntervene = _jealousyCheck.playerPartnerPresent>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<div class="interaction-result-panel">
<<if $interactionResult.blocked>>
<div class="result-banner blocked">
<span class="result-text">Action unavailable</span>
</div>
<div class="result-description"><<print $interactionResult.message>></div>
<<elseif $interactionResult.criticalSuccess>>
<div class="result-banner critical-success">
<span class="result-icon">🌟</span>
<span class="result-text">CRITICAL SUCCESS!</span>
</div>
<div class="result-description">Your action made an incredible impression!</div>
<<elseif $interactionResult.criticalFailure>>
<div class="result-banner critical-failure">
<span class="result-icon">💔</span>
<span class="result-text">CRITICAL FAILURE!</span>
</div>
<div class="result-description">Things went terribly wrong...</div>
<<elseif $interactionResult.success>>
<div class="result-banner success">
<span class="result-icon">✓</span>
<span class="result-text">Success!</span>
</div>
<<else>>
<div class="result-banner failure">
<span class="result-icon">✗</span>
<span class="result-text">Failed...</span>
</div>
<</if>>
/* Show metric changes */
<<if !$interactionResult.blocked && $interactionResult.metricChanges>>
<div class="metric-changes">
<<set _changes = $interactionResult.metricChanges>>
<<if _changes.friendship>>
<div class="metric-change <<if _changes.friendship > 0>>positive<<else>>negative<</if>>">
<span class="metric-icon">🤝</span>
<span class="metric-name">Friendship:</span>
<span class="metric-value"><<if _changes.friendship > 0>>+<</if>><<print _changes.friendship>></span>
</div>
<</if>>
<<if _changes.love>>
<div class="metric-change <<if _changes.love > 0>>positive<<else>>negative<</if>>">
<span class="metric-icon">❤️</span>
<span class="metric-name">Love:</span>
<span class="metric-value"><<if _changes.love > 0>>+<</if>><<print _changes.love>></span>
</div>
<</if>>
<<if _changes.sex>>
<div class="metric-change <<if _changes.sex > 0>>positive<<else>>negative<</if>>">
<span class="metric-icon">🔥</span>
<span class="metric-name">Attraction:</span>
<span class="metric-value"><<if _changes.sex > 0>>+<</if>><<print _changes.sex>></span>
</div>
<</if>>
<<if _changes.fear>>
<div class="metric-change <<if _changes.fear > 0>>negative<<else>>positive<</if>>">
<span class="metric-icon">😨</span>
<span class="metric-name">Fear:</span>
<span class="metric-value"><<if _changes.fear > 0>>+<</if>><<print _changes.fear>></span>
</div>
<</if>>
<<if _changes.anger>>
<div class="metric-change <<if _changes.anger > 0>>negative<<else>>positive<</if>>">
<span class="metric-icon">😠</span>
<span class="metric-name">Anger:</span>
<span class="metric-value"><<if _changes.anger > 0>>+<</if>><<print _changes.anger>></span>
</div>
<</if>>
</div>
<</if>>
<<if !$interactionResult.blocked>>
<div class="chance-breakdown">
<div class="chance-header">
Success Chance: <span class="chance-value"><<print $interactionResult.finalChance>>%</span>
(Rolled: <<print $interactionResult.chanceRolled>>)
</div>
<div class="modifiers-list">
<<for _mod range ($interactionResult.modifiers ?? [])>>
<div class="modifier-item <<if _mod.value >= 0>>positive<<else>>negative<</if>>">
<span class="modifier-name"><<print _mod.name>>:</span>
<span class="modifier-value"><<if _mod.value >= 0>>+<</if>><<print _mod.value>>%</span>
</div>
<</for>>
</div>
</div>
<</if>>
</div>
<div class="btn padding-top">
<<button "Continue" "enhanced_interaction_system">>
<<unset $interactionResult>>
<<unset $currentInteraction>>
<</button>>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _interaction = setup.getInteractionDefinition("followMe")>>
<<set $interactionResult = setup.performEnhancedInteraction($player, $interactionNpc, "followMe")>>
<<if $interactionResult.blocked>>
<<include "enhanced_interaction_result_display">>
<<else>>
<<SpendTime _interaction.timeCost>>
<<SpendEnergy $player _interaction.energyCost>>
<<run setup.applyInteractionEffects($player, $interactionNpc, "followMe", $interactionResult)>>
<<ShowNpcIcon $interactionNpc>>
<<if $interactionResult.criticalSuccess>>
<<Chat $interactionNpc "Absolutely! I'd follow you anywhere! Lead the way! 🚶✨">>
<<ChatMessage "They eagerly agree to follow you!">>
<<elseif $interactionResult.criticalFailure>>
<<Chat $interactionNpc "What? No way! I'm not going anywhere with you!">>
<<ChatMessage "They firmly refused and seem annoyed by the request.">>
<<elseif $interactionResult.success>>
<<set _phrase = [
"Alright, lead the way!",
"Sure, I'll tag along with you.",
"Yeah, I'm in. Let's go.",
"Alright, you've convinced me. Let's see where this goes.",
"Fine, I'll come with you."
].random()>>
<<Chat $interactionNpc _phrase>>
<<ChatMessage "They agreed to follow you.">>
<<else>>
<<set _phrase = [
"Nah, I'm good. You go ahead.",
"Thanks, but I'd rather stay here.",
"Nope, not really feeling it. Maybe another time.",
"I'm not coming. I've got other plans.",
"I'll pass. Maybe later."
].random()>>
<<Chat $interactionNpc _phrase>>
<<ChatMessage "They declined your invitation.">>
<</if>>
/* Grants, status, money and resentment: one source, shared with the AI chat. */
<<set _consequences = setup.applyInteractionConsequences($player, $interactionNpc, "followMe", $interactionResult)>>
<<include "enhanced_interaction_result_display">>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<if setup.removePlayerFollower>>
<<run setup.removePlayerFollower($interactionNpc.info.id)>>
<<else>>
<<set _npcIndex = $playerFollowers.indexOf($interactionNpc.info.id)>>
<<if _npcIndex > -1>>
<<run $playerFollowers.splice(_npcIndex, 1)>>
<</if>>
<</if>>
<<set _phrase = [
"Alright, I'll go my own way then. See you later!",
"Okay, I'll head off. Catch you around!",
"Sure thing. I'll find something to do. Take care!",
"No problem. I'm going to go check out some places.",
"Got it. I'll be around. See you soon!"
].random()>>
<<Chat $interactionNpc _phrase>>
<<set _stopFollowMsg = $interactionNpc.info.firstName + " stopped following you and started heading toward their next destination.">>
<<ChatMessage _stopFollowMsg>>
/* Resume the ordinary schedule through the same stepwise route used by guests. */
<<run CompleteNpcHomeVisit($Characters.indexOf($interactionNpc))>>
<div class="btn padding-top">
<<button "Continue">>
<<unset $interactionNpc $indexNPC>>
<<set $gameSettings.allowSaves = true>>
<<set $canShowStatsBtn = true>>
<<goto setup.prepareInteractionReturnPassage()>>
<</button>>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "enhanced_interaction_jealousy_check">>
<<if _jealousIntervene>>
<<include "jealous_partner_intervenes">>
<<elseif _playerPartnerIntervene>>
<<include "player_partner_confrontation">>
<<else>>
<<set _interaction = setup.getInteractionDefinition("inviteHome")>>
<<set $interactionResult = setup.performEnhancedInteraction($player, $interactionNpc, "inviteHome")>>
<<if $interactionResult.blocked>>
<<include "enhanced_interaction_result_display">>
<<else>>
<<SpendTime _interaction.timeCost>>
<<SpendEnergy $player _interaction.energyCost>>
<<run setup.applyInteractionEffects($player, $interactionNpc, "inviteHome", $interactionResult)>>
<<set _consequences = setup.applyInteractionConsequences($player, $interactionNpc, "inviteHome", $interactionResult)>>
<<set _playerHomeBedroom = setup.getPlayerResidenceBedroom()>>
<<ShowNpcIcon $interactionNpc>>
<<if $interactionResult.criticalSuccess>>
<<set _journeyResult = _consequences.journey>>
<<if _journeyResult.ok>>
<<Chat $interactionNpc "Yes, finally. I was starting to think you'd never ask. 🏠💕">>
<<ChatMessage _journeyResult.reason>>
<<else>>
<<Chat $interactionNpc _journeyResult.reason>>
<</if>>
<<set $gameSettings.allowSaves = true>>
<<set $canShowStatsBtn = true>>
<div class="btn padding-top"><<button "Continue">><<unset $interactionNpc $indexNPC $interaction $interactType $FromInteraction $currentInteraction $interactionResult>><<goto setup.prepareInteractionReturnPassage()>><</button>></div>
<<elseif $interactionResult.criticalFailure>>
<<Chat $interactionNpc "To your place? That's... really forward. I don't think so.">>
<<ChatMessage "That came off way too pushy.">>
<<include "enhanced_interaction_result_display">>
<<elseif $interactionResult.success>>
<<set _journeyResult = _consequences.journey>>
<<set _relation = $player.getRelationship($interactionNpc.info.id, false)?.relation ?? "acquaintance">>
<<if _journeyResult.ok>>
<<switch _relation>>
<<case "dating" "soulmate">>
<<Chat $interactionNpc "Of course, honey! I'll head over. 💕">>
<<case "crush">>
<<Chat $interactionNpc "To your place? O-okay... I'll meet you there. 😊">>
<<case "fuckbuddy">>
<<Chat $interactionNpc "I know what you want. I'll head over. 😏">>
<<default>>
<<Chat $interactionNpc "Sure, why not? I'll meet you there.">>
<</switch>>
<<else>>
<<Chat $interactionNpc _journeyResult.reason>>
<</if>>
<<ChatMessage _journeyResult.reason>>
<<set $gameSettings.allowSaves = true>>
<<set $canShowStatsBtn = true>>
<div class="btn padding-top"><<button "Continue">><<unset $interactionNpc $indexNPC $interaction $interactType $FromInteraction $currentInteraction $interactionResult>><<goto setup.prepareInteractionReturnPassage()>><</button>></div>
<<else>>
<<Chat $interactionNpc "Thanks for the offer, but I'll pass for now.">>
<<ChatMessage "They politely declined.">>
<<include "enhanced_interaction_result_display">>
<</if>>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _interaction = setup.getInteractionDefinition("askPhoneNumber")>>
<<set $interactionResult = setup.performEnhancedInteraction($player, $interactionNpc, "askPhoneNumber")>>
<<if $interactionResult.blocked>>
<<include "enhanced_interaction_result_display">>
<<else>>
<<SpendTime _interaction.timeCost>>
<<SpendEnergy $player _interaction.energyCost>>
<<run setup.applyInteractionEffects($player, $interactionNpc, "askPhoneNumber", $interactionResult)>>
<<ShowNpcIcon $interactionNpc>>
<<if $interactionResult.criticalSuccess>>
<<Chat $interactionNpc "Of course! Here's my number! 📱 Call me whenever, day or night. I'd love to hear from you! 💕">>
<<ChatMessage "They happily gave you their phone number and seem excited!">>
<<elseif $interactionResult.criticalFailure>>
<<Chat $interactionNpc "Give you my number? Why would I do that? I barely know you!">>
<<ChatMessage "They refused and seem annoyed by the request.">>
<<elseif $interactionResult.success>>
<<set _phrase = [
"Sure, here you go. 📱",
"Alright, you can have my number.",
"Okay, let me give you my digits.",
"Fine, here's my number. Don't spam me though!",
"Yeah, I guess we can exchange numbers."
].random()>>
<<Chat $interactionNpc _phrase>>
<<ChatMessage "You got their phone number!">>
<<else>>
<<set _phrase = [
"Hmm, I'm not sure about that. Maybe another time.",
"I don't give my number out that easily.",
"Sorry, I'm not comfortable sharing that yet.",
"Let's get to know each other better first.",
"I'd rather not right now."
].random()>>
<<Chat $interactionNpc _phrase>>
<<ChatMessage "They politely declined to give you their number.">>
<</if>>
/* Grants, status, money and resentment: one source, shared with the AI chat. */
<<set _consequences = setup.applyInteractionConsequences($player, $interactionNpc, "askPhoneNumber", $interactionResult)>>
<<include "enhanced_interaction_result_display">>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _interaction = setup.getInteractionDefinition("askForHouseKeys")>>
<<set $interactionResult = setup.performEnhancedInteraction($player, $interactionNpc, "askForHouseKeys")>>
<<if $interactionResult.blocked>>
<<include "enhanced_interaction_result_display">>
<<else>>
<<SpendTime _interaction.timeCost>>
<<SpendEnergy $player _interaction.energyCost>>
<<run setup.applyInteractionEffects($player, $interactionNpc, "askForHouseKeys", $interactionResult)>>
<<ShowNpcIcon $interactionNpc>>
<<if $interactionResult.criticalSuccess>>
<<Chat $interactionNpc "Of course! I completely trust you. Here, take a spare set of keys - you're welcome anytime! 🔑💕">>
<<ChatMessage "They enthusiastically handed you a set of keys to their home!">>
<<elseif $interactionResult.criticalFailure>>
<<Chat $interactionNpc "Give you the keys to my home?! Are you out of your mind? Absolutely not!">>
<<ChatMessage "They are very offended by the request. Maybe you should build more trust first.">>
<<elseif $interactionResult.success>>
<<set _phrase = [
"Well... I suppose I can trust you. Here's a spare key. 🔑",
"Alright, but please be respectful of my space. Here you go.",
"Sure, I trust you enough. Don't lose them!",
"Okay, you can have a copy. Just don't throw any parties without me!",
"I guess we're close enough for that. Here, take these."
].random()>>
<<Chat $interactionNpc _phrase>>
<<ChatMessage "You received the keys to their home!">>
<<else>>
<<set _phrase = [
"That's a bit much for me right now...",
"Maybe when we know each other a bit better.",
"Sorry, I'm not ready to give out keys to my place.",
"That's a big step... Let's wait a bit longer.",
"I'd rather not. It's nothing personal."
].random()>>
<<Chat $interactionNpc _phrase>>
<<ChatMessage "They politely declined to give you the keys.">>
<</if>>
/* Grants, status, money and resentment: one source, shared with the AI chat. */
<<set _consequences = setup.applyInteractionConsequences($player, $interactionNpc, "askForHouseKeys", $interactionResult)>>
<<include "enhanced_interaction_result_display">>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set $playerNpcMoveInResult = setup.proposePlayerNpcMoveIn($player, $interactionNpc, "residential_apartment")>>
<<ShowNpcIcon $interactionNpc>>
<<if $playerNpcMoveInResult.ok>>
<<Chat $interactionNpc $playerNpcMoveInResult.reason>>
<<if $playerNpcMoveInResult.outcome == "accepted">>
<<ChatMessage "It's settled. They're packing up and heading over. It's official once they actually get there.">>
<<else>>
<<ChatMessage "You agreed to try more sleepovers before making the move permanent.">>
<</if>>
<<else>>
<<ChatMessage $playerNpcMoveInResult.reason>>
<</if>>
<<unset $playerNpcMoveInResult>>
<div class="btn padding-top"><<button "Back to your partner" "enhanced_interaction_system">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _householdView = setup.getPlayerNpcRelationshipView($interactionNpc)>>
<<ShowNpcIcon $interactionNpc>>
<div class="interaction-result-panel relationship-partner-panel">
<div class="result-banner success"><span class="result-text">Your household</span></div>
<div class="result-description">Current arrangement: <<print _householdView.cohabitation.contribution.replaceAll("_", " ")>> · planned weekly share $<<print _householdView.cohabitation.weeklyContribution>></div>
<div class="result-description">Expected nights at home: <<print _householdView.cohabitation.expectedNightsPerWeek>>/7 · quiet hours: <<print _householdView.cohabitation.quietHoursStart>>:00 · guests: <<print _householdView.cohabitation.guestPolicy.replaceAll("_", " ")>> · late call: <<print _householdView.cohabitation.callIfLateExpected ? "expected" : "optional">></div>
<div class="btn-container">
<div class="btn"><<button "Make time for each other" "enhanced_relationship_shared_time">><</button>></div>
<<set _ongoingEvening = setup.getPlayerNpcHouseholdEveningView($interactionNpc)>>
<<if _ongoingEvening && _ongoingEvening.status == "active">>
<div class="btn"><<button "Continue your evening" "enhanced_relationship_household_evening">><<set $householdEveningResult = setup.resumePlayerNpcHouseholdEvening($interactionNpc)>><</button>></div>
<</if>>
<div class="btn"><<button "Have dinner together" "enhanced_relationship_household_evening">><<set $householdEveningResult = setup.resolvePlayerNpcHouseholdEvening($interactionNpc, "dinner")>><</button>></div>
<div class="btn"><<button "Talk about the day" "enhanced_relationship_household_evening">><<set $householdEveningResult = setup.resolvePlayerNpcHouseholdEvening($interactionNpc, "talk")>><</button>></div>
<div class="btn"><<button "Spend a quiet evening" "enhanced_relationship_household_evening">><<set $householdEveningResult = setup.resolvePlayerNpcHouseholdEvening($interactionNpc, "quiet_evening")>><</button>></div>
<div class="btn"><<button "Watch something together" "enhanced_relationship_household_evening">><<set $householdEveningResult = setup.resolvePlayerNpcHouseholdEvening($interactionNpc, "entertainment")>><</button>></div>
<div class="btn"><<button "Spend private time together" "enhanced_relationship_household_evening">><<set $householdEveningResult = setup.resolvePlayerNpcHouseholdEvening($interactionNpc, "private_time")>><</button>></div>
<div class="btn"><<button "Give them space" "enhanced_relationship_household_evening">><<set $householdEveningResult = setup.resolvePlayerNpcHouseholdEvening($interactionNpc, "space")>><</button>></div>
<div class="btn"><<button "Keep money separate" "enhanced_relationship_household_saved">><<run setup.setPlayerNpcHouseholdContribution($interactionNpc, "independent")>><</button>></div>
<div class="btn"><<button "Ask for $100 weekly" "enhanced_relationship_household_saved">><<run setup.setPlayerNpcHouseholdContribution($interactionNpc, "fixed_share", 100)>><</button>></div>
<div class="btn"><<button "Share proportionally" "enhanced_relationship_household_saved">><<run setup.setPlayerNpcHouseholdContribution($interactionNpc, "proportional")>><</button>></div>
<div class="btn"><<button "Cover household costs" "enhanced_relationship_household_saved">><<run setup.setPlayerNpcHouseholdContribution($interactionNpc, "player_covers", 0)>><</button>></div>
<div class="btn"><<button "Ask them to call if late" "enhanced_relationship_household_saved">><<set $householdPreferenceResult = setup.setPlayerNpcHouseholdPreferences($interactionNpc, { callIfLateExpected: true })>><</button>></div>
<div class="btn"><<button "Do not require a late call" "enhanced_relationship_household_saved">><<set $householdPreferenceResult = setup.setPlayerNpcHouseholdPreferences($interactionNpc, { callIfLateExpected: false })>><</button>></div>
<div class="btn"><<button "Guests must be discussed first" "enhanced_relationship_household_saved">><<set $householdPreferenceResult = setup.setPlayerNpcHouseholdPreferences($interactionNpc, { guestPolicy: "ask_first" })>><</button>></div>
<div class="btn"><<button "Allow trusted friends as guests" "enhanced_relationship_household_saved">><<set $householdPreferenceResult = setup.setPlayerNpcHouseholdPreferences($interactionNpc, { guestPolicy: "trusted_friends" })>><</button>></div>
<div class="btn"><<button "Keep an open guest policy" "enhanced_relationship_household_saved">><<set $householdPreferenceResult = setup.setPlayerNpcHouseholdPreferences($interactionNpc, { guestPolicy: "open" })>><</button>></div>
<div class="btn"><<button "Expect five nights at home" "enhanced_relationship_household_saved">><<set $householdPreferenceResult = setup.setPlayerNpcHouseholdPreferences($interactionNpc, { expectedNightsPerWeek: 5 })>><</button>></div>
<div class="btn"><<button "Expect every night at home" "enhanced_relationship_household_saved">><<set $householdPreferenceResult = setup.setPlayerNpcHouseholdPreferences($interactionNpc, { expectedNightsPerWeek: 7 })>><</button>></div>
<div class="btn"><<button "Quiet hours from 22:00" "enhanced_relationship_household_saved">><<set $householdPreferenceResult = setup.setPlayerNpcHouseholdPreferences($interactionNpc, { quietHoursStart: 22 })>><</button>></div>
<div class="btn"><<button "Quiet hours from 23:00" "enhanced_relationship_household_saved">><<set $householdPreferenceResult = setup.setPlayerNpcHouseholdPreferences($interactionNpc, { quietHoursStart: 23 })>><</button>></div>
<div class="btn"><<button "Live separately for a while" "enhanced_relationship_move_out">><</button>></div>
</div>
</div>
<div class="btn padding-top"><<button "Back to your partner" "enhanced_interaction_system">><</button>></div>
<</nobr>><<nobr>>
<<ShowNpcIcon $interactionNpc>>
<<if $householdEveningResult.ok>>
<<if $householdEveningResult.cost gt 0>><<set _householdCostMsg = "Household cost: $" + $householdEveningResult.cost>><<ChatMessage _householdCostMsg>><</if>>
<<if $householdEveningResult.eveningId>>
<<set _eveningView = setup.observePlayerNpcHouseholdEvening($interactionNpc)>>
/* Consume the render request before the clock advances. Saved or reopened results never replay time. */
<<set _eveningRequestedMinutes = $householdEveningResult.minutes>>
<<set $householdEveningResult.minutes = 0>>
<<for _eveningStep = 0; _eveningStep lt 8 && _eveningRequestedMinutes gt 0 && _eveningView && _eveningView.id == $householdEveningResult.eveningId && _eveningView.status == "active"; _eveningStep++>>
<<set _eveningStepMinutes = Math.min(15, _eveningRequestedMinutes, _eveningView.remainingMinutes)>>
<<SpendTime _eveningStepMinutes>>
<<set _eveningRequestedMinutes -= _eveningStepMinutes>>
<<set _eveningView = setup.observePlayerNpcHouseholdEvening($interactionNpc)>>
<</for>>
<<if _eveningView && _eveningView.id == $householdEveningResult.eveningId>>
<div @data-household-evening-status="_eveningView.status"><<ChatMessage _eveningView.reason>></div>
<<if _eveningView.status == "active">>
<div class="btn"><<button "Continue your evening" "enhanced_relationship_household_evening">><<set $householdEveningResult = setup.resumePlayerNpcHouseholdEvening($interactionNpc)>><</button>></div>
<</if>>
<<else>><<ChatMessage "This evening is no longer available.">><</if>>
<<else>><<ChatMessage $householdEveningResult.reason>><</if>>
<<if $householdEveningResult.choice == "private_time">>
/* Private time is the real bedroom scene: the household moment is already
recorded, the sex system spends its own time and rolls its own consent. */
<div class="btn padding-top"><<button "Take it to the bedroom" "ChooseSexType">><<unset $householdEveningResult>><</button>></div>
<</if>>
<<else>>
<<ChatMessage $householdEveningResult.reason>>
<<if $householdEveningResult.alternative>>
<div class="btn"><<button "Accept their suggestion" "enhanced_relationship_household_evening">><<set $householdEveningResult = setup.resolvePlayerNpcHouseholdEvening($interactionNpc, $householdEveningResult.alternative)>><</button>></div>
<</if>>
<</if>>
<div class="btn padding-top"><<button "Back to your partner" "enhanced_interaction_system">><<unset $householdEveningResult>><</button>></div>
<</nobr>><<nobr>>
<<ShowNpcIcon $interactionNpc>>
<<if $householdPreferenceResult>>
<<ChatMessage $householdPreferenceResult.reason>>
<<unset $householdPreferenceResult>>
<<else>>
<<ChatMessage "You agreed on how to handle household expenses.">>
<</if>>
<div class="btn padding-top"><<button "Back to your partner" "enhanced_interaction_system">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _separationResult = setup.startPlayerNpcTrialSeparation($interactionNpc, "You both need some time living separately.")>>
<<ShowNpcIcon $interactionNpc>>
<<if _separationResult.ok>>
<<ChatMessage _separationResult.reason>>
<<else>>
<<ChatMessage _separationResult.reason>>
<</if>>
<div class="btn padding-top"><<button "Back to your partner" "enhanced_interaction_system">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<set _keyGranted = setup.grantPlayerResidenceAccess($player, $interactionNpc, "residential_apartment")>>
<<set _keyMsg = _keyGranted ? "You hand your partner a key. They can come and go now, but they still live at their own place." : "You cannot give them a key right now.">>
<<ChatMessage _keyMsg>>
<div class="btn padding-top"><<button "Back to your partner" "enhanced_interaction_system">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<set _reconcileResult = setup.reconcilePlayerNpcTrialSeparation($interactionNpc)>>
<<ChatMessage _reconcileResult.reason>>
<div class="btn padding-top"><<button "Back to your partner" "enhanced_interaction_system">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<set _concern = setup.getPlayerPartnerNightConcern($interactionNpc)>>
<<set _coupleView = setup.getPlayerNpcRelationshipView($interactionNpc)>>
<<if !_concern>>
<<ChatMessage "There's nothing hanging over you right now.">>
<<elseif ["forgiven", "agreement_changed", "affair_ended", "separated", "relationship_ended"].includes(_concern.discussionOutcome)>>
<<ChatMessage "You already had it out over this.">>
<<else>>
<<set _concernMsg = _concern.knowledge == "known" ? "You can throw it in their face, or decide what you want to do about it." : "You can ask. Doesn't mean you can prove anything.">>
<<ChatMessage _concernMsg>>
<div class="btn-container padding-top">
<<if !_concern.discussed>>
<div class="btn"><<button "Ask calmly" "enhanced_relationship_night_reaction">><<set $nightReactionResult = setup.resolvePlayerPartnerNightReaction($interactionNpc, "ask_calmly")>><</button>></div>
<div class="btn"><<button "Tell them not to lie to you" "enhanced_relationship_night_reaction">><<set $nightReactionResult = setup.resolvePlayerPartnerNightReaction($interactionNpc, "request_honesty")>><</button>></div>
<div class="btn"><<button "Accuse them" "enhanced_relationship_night_reaction">><<set $nightReactionResult = setup.resolvePlayerPartnerNightReaction($interactionNpc, "accuse")>><</button>></div>
<</if>>
<<if _concern.knowledge == "known">>
<div class="btn"><<button "Forgive them" "enhanced_relationship_night_reaction">><<set $nightReactionResult = setup.resolvePlayerPartnerNightReaction($interactionNpc, "forgive")>><</button>></div>
<div class="btn"><<button "Renegotiate as an open relationship" "enhanced_relationship_night_reaction">><<set $nightReactionResult = setup.resolvePlayerPartnerNightReaction($interactionNpc, "change_agreement")>><</button>></div>
<<if _concern.discussionOutcome != "affair_end_refused">><div class="btn"><<button "Demand that they end it" "enhanced_relationship_night_reaction">><<set $nightReactionResult = setup.resolvePlayerPartnerNightReaction($interactionNpc, "demand_end")>><</button>></div><</if>>
<<if _coupleView.cohabitation.status == "cohabiting">><div class="btn"><<button "Begin a trial separation" "enhanced_relationship_night_reaction">><<set $nightReactionResult = setup.resolvePlayerPartnerNightReaction($interactionNpc, "trial_separation")>><</button>></div><</if>>
<div class="btn"><<button "End the relationship" "enhanced_relationship_night_reaction">><<set $nightReactionResult = setup.resolvePlayerPartnerNightReaction($interactionNpc, "breakup")>><</button>></div>
<</if>>
</div>
<</if>>
<div class="btn padding-top"><<button "Back" "enhanced_interaction_system">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<ChatMessage $nightReactionResult.reason>>
<<if $nightReactionResult.relationshipEnded>>
<div class="btn padding-top"><<button "Continue" "enhanced_interaction_system">><</button>></div>
<<else>>
<div class="btn padding-top"><<button "Continue the conversation" "enhanced_interaction_system">><</button>></div>
<</if>>
<<unset $nightReactionResult>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<set _initiativeView = setup.getPlayerNpcRelationshipView($interactionNpc)>>
<<set _initiative = _initiativeView.pendingInitiative>>
<<if not _initiative>>
<<ChatMessage "Too late, they've moved on. Talk about something else.">>
<div class="btn padding-top"><<button "Continue" "enhanced_interaction_system">><</button>></div>
<<else>>
<<ChatMessage _initiative.line>>
<div class="interaction-result-panel relationship-initiative-panel">
<<if _initiative.topic == "partner_feminization_covert">>
<div class="result-description">Your partner waits. For a casual offer, they're watching you very closely.</div>
<div class="btn-container padding-top">
<div class="btn"><<button "Accept the food or drink" "enhanced_relationship_initiative_result">>
<<set $relationshipInitiativeResult = setup.resolvePlayerNpcRelationshipInitiative($player, $interactionNpc, "accept")>>
<</button>></div>
<div class="btn"><<button "Ask what is in it" "enhanced_relationship_initiative_result">>
<<set $relationshipInitiativeResult = setup.resolvePlayerNpcRelationshipInitiative($player, $interactionNpc, "question")>>
<</button>></div>
<div class="btn"><<button "Decline" "enhanced_relationship_initiative_result">>
<<set $relationshipInitiativeResult = setup.resolvePlayerNpcRelationshipInitiative($player, $interactionNpc, "decline")>>
<</button>></div>
</div>
<<elseif _initiative.topic == "partner_feminization_style">>
<div class="result-description">This one's personal. It's about how they want you to look.</div>
<div class="btn-container padding-top">
<div class="btn"><<button "Try it for them" "enhanced_relationship_initiative_result">>
<<set $relationshipInitiativeResult = setup.resolvePlayerNpcRelationshipInitiative($player, $interactionNpc, "accept")>>
<</button>></div>
<div class="btn"><<button "Ask why they want this" "enhanced_relationship_initiative_result">>
<<set $relationshipInitiativeResult = setup.resolvePlayerNpcRelationshipInitiative($player, $interactionNpc, "question")>>
<</button>></div>
<div class="btn"><<button "Not this time" "enhanced_relationship_initiative_result">>
<<set $relationshipInitiativeResult = setup.resolvePlayerNpcRelationshipInitiative($player, $interactionNpc, "decline")>>
<</button>></div>
</div>
<<elseif _initiative.topic == "move_in">>
<div class="result-description">They don't mean another sleepover. They mean moving in for good.</div>
<div class="btn-container">
<div class="btn"><<button "Live together" "enhanced_relationship_initiative_result">>
<<set $relationshipInitiativeResult = setup.resolvePlayerNpcRelationshipInitiative($player, $interactionNpc, "accept")>>
<</button>></div>
<div class="btn"><<button "Ask how it would work" "enhanced_relationship_initiative_result">>
<<set $relationshipInitiativeResult = setup.resolvePlayerNpcRelationshipInitiative($player, $interactionNpc, "question")>>
<</button>></div>
<div class="btn"><<button "Keep separate homes" "enhanced_relationship_initiative_result">>
<<set $relationshipInitiativeResult = setup.resolvePlayerNpcRelationshipInitiative($player, $interactionNpc, "decline")>>
<</button>></div>
</div>
<<elseif _initiative.topic == "household_talk">>
<div class="result-description">Your partner is suggesting how to spend tonight at home.</div>
<div class="btn-container">
<div class="btn"><<button "Sounds good" "enhanced_relationship_initiative_result">>
<<set $relationshipInitiativeResult = setup.resolvePlayerNpcRelationshipInitiative($player, $interactionNpc, "accept")>>
<</button>></div>
<div class="btn"><<button "Ask what they have in mind" "enhanced_relationship_initiative_result">>
<<set $relationshipInitiativeResult = setup.resolvePlayerNpcRelationshipInitiative($player, $interactionNpc, "question")>>
<</button>></div>
<div class="btn"><<button "Not tonight" "enhanced_relationship_initiative_result">>
<<set $relationshipInitiativeResult = setup.resolvePlayerNpcRelationshipInitiative($player, $interactionNpc, "decline")>>
<</button>></div>
</div>
<<elseif _initiative.topic == "come_home">>
<div class="result-description">Your partner has noticed how rarely you sleep at home lately.</div>
<div class="btn-container">
<div class="btn"><<button "Promise to be home tonight" "enhanced_relationship_initiative_result">>
<<set $relationshipInitiativeResult = setup.resolvePlayerNpcRelationshipInitiative($player, $interactionNpc, "accept")>>
<</button>></div>
<div class="btn"><<button "Ask what is wrong" "enhanced_relationship_initiative_result">>
<<set $relationshipInitiativeResult = setup.resolvePlayerNpcRelationshipInitiative($player, $interactionNpc, "question")>>
<</button>></div>
<div class="btn"><<button "Say you need the space" "enhanced_relationship_initiative_result">>
<<set $relationshipInitiativeResult = setup.resolvePlayerNpcRelationshipInitiative($player, $interactionNpc, "decline")>>
<</button>></div>
</div>
<<elseif _initiative.topic == "post_feminization_fantasy">>
<div class="result-description">They've been sitting on this one since you started changing, and it clearly matters to them.</div>
<div class="btn-container padding-top">
<div class="btn"><<button "Agree to discuss a guest" "enhanced_relationship_initiative_result">>
<<set $relationshipInitiativeResult = setup.resolvePlayerNpcRelationshipInitiative($player, $interactionNpc, "accept")>>
<</button>></div>
<div class="btn"><<button "Ask how it would work" "enhanced_relationship_initiative_result">>
<<set $relationshipInitiativeResult = setup.resolvePlayerNpcRelationshipInitiative($player, $interactionNpc, "question")>>
<</button>></div>
<div class="btn"><<button "Decline" "enhanced_relationship_initiative_result">>
<<set $relationshipInitiativeResult = setup.resolvePlayerNpcRelationshipInitiative($player, $interactionNpc, "decline")>>
<</button>></div>
</div>
<<elseif _initiative.topic == "kink_expression">>
<div class="result-description">You can engage with the idea, ask for a clearer explanation, or set a boundary.</div>
<div class="btn-container padding-top">
<div class="btn"><<button "Hear them out" "enhanced_relationship_initiative_result">>
<<set $relationshipInitiativeResult = setup.resolvePlayerNpcRelationshipInitiative($player, $interactionNpc, "accept")>>
<</button>></div>
<div class="btn"><<button "Ask them to explain" "enhanced_relationship_initiative_result">>
<<set $relationshipInitiativeResult = setup.resolvePlayerNpcRelationshipInitiative($player, $interactionNpc, "question")>>
<</button>></div>
<div class="btn"><<button "Say you are not interested" "enhanced_relationship_initiative_result">>
<<set $relationshipInitiativeResult = setup.resolvePlayerNpcRelationshipInitiative($player, $interactionNpc, "decline")>>
<</button>></div>
</div>
<<else>>
<div class="result-description">Your partner is asking for attention now instead of silently losing satisfaction.</div>
<div class="btn-container padding-top">
<div class="btn"><<button "Make time for them" "enhanced_relationship_initiative_result">>
<<set $relationshipInitiativeResult = setup.resolvePlayerNpcRelationshipInitiative($player, $interactionNpc, "accept")>>
<</button>></div>
<div class="btn"><<button "Not right now" "enhanced_relationship_initiative_result">>
<<set $relationshipInitiativeResult = setup.resolvePlayerNpcRelationshipInitiative($player, $interactionNpc, "decline")>>
<</button>></div>
</div>
<</if>>
</div>
<div class="btn padding-top"><<button "Back" "enhanced_interaction_system">><</button>></div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<set _postFemInvite = setup.getPlayerPostFeminizationInvitation($interactionNpc)>>
<<if not _postFemInvite>>
<<ChatMessage "That invitation is no longer active.">>
<<else>>
<<ChatMessage _postFemInvite.line>>
<div class="interaction-result-panel relationship-initiative-panel">
<div class="result-description">This creates one active pair and one observer. The NPC participants will travel to a private meeting place.</div>
<div class="btn-container padding-top">
<div class="btn"><<button "Accept" "enhanced_post_feminization_invitation_result">>
<<set $postFemInvitationResult = setup.respondToPlayerPostFeminizationInvitation($player, $interactionNpc, "accept")>>
<</button>></div>
<div class="btn"><<button "Ask about the roles" "enhanced_post_feminization_invitation_result">>
<<set $postFemInvitationResult = setup.respondToPlayerPostFeminizationInvitation($player, $interactionNpc, "question")>>
<</button>></div>
<div class="btn"><<button "Decline" "enhanced_post_feminization_invitation_result">>
<<set $postFemInvitationResult = setup.respondToPlayerPostFeminizationInvitation($player, $interactionNpc, "decline")>>
<</button>></div>
</div>
</div>
<</if>>
<div class="btn padding-top"><<button "Back" "enhanced_interaction_system">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<if $postFemInvitationResult>>
<<Chat $interactionNpc $postFemInvitationResult.npcLine>>
<<ChatMessage $postFemInvitationResult.summary>>
<<if $postFemInvitationResult.minutes gt 0>><<SpendTime $postFemInvitationResult.minutes>><</if>>
<<else>>
<<ChatMessage "Nothing came of it.">>
<</if>>
<<unset $postFemInvitationResult>>
<div class="btn padding-top"><<button "Continue" "enhanced_interaction_system">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<set $postFemEncounterResult = setup.resolvePlayerPostFeminizationMeeting($player, $interactionNpc)>>
<<if $postFemEncounterResult.ok>>
<div class="interaction-result-panel">
<div class="result-banner success"><span class="result-icon">✓</span><span class="result-text">The arranged meeting takes place</span></div>
<div class="result-description">Observer: <<print $postFemEncounterResult.observerName>> · Active pair: <<print $postFemEncounterResult.activePairNames.join(" and ")>></div>
</div>
<<if $postFemEncounterResult.media and $postFemEncounterResult.media.path>>
<<Video $postFemEncounterResult.media.path>>
<</if>>
<<ChatMessage $postFemEncounterResult.reason>>
<<SpendTime 120>>
<<else>>
<<ChatMessage $postFemEncounterResult.reason>>
<</if>>
<<unset $postFemEncounterResult>>
<div class="btn padding-top"><<button "Continue" "enhanced_interaction_system">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<if $relationshipInitiativeResult>>
<<Chat $interactionNpc $relationshipInitiativeResult.npcLine>>
<<ChatMessage $relationshipInitiativeResult.summary>>
<<if $relationshipInitiativeResult.femininityChange>>
<div class="interaction-result-panel">
<div class="result-banner success">
<span class="result-icon">✨</span>
<span class="result-text">Your body became a little more feminine</span>
</div>
</div>
<</if>>
<<if $relationshipInitiativeResult.discoveredKink>>
<div class="interaction-result-panel">
<div class="result-description">💡 You learned something new about your partner's preferences.</div>
</div>
<</if>>
<<if $relationshipInitiativeResult.minutes gt 0>><<SpendTime $relationshipInitiativeResult.minutes>><</if>>
/* Captured at render time: the story variable is cleared below, before any click. */
<<set _householdEveningChoice = $relationshipInitiativeResult.householdEvening>>
<<if _householdEveningChoice>>
<div class="btn padding-top"><<button "Start the evening now" "enhanced_relationship_household_evening">>
<<set $householdEveningResult = setup.resolvePlayerNpcHouseholdEvening($interactionNpc, _householdEveningChoice)>>
<</button>></div>
<</if>>
<<else>>
<<ChatMessage "They didn't give you an answer.">>
<</if>>
<<unset $relationshipInitiativeResult>>
<div class="btn padding-top"><<button "Continue" "enhanced_interaction_system">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set $relationshipDateTimingMode = $relationshipDateTimingMode ?? "now">>
<<set $relationshipDateFormat = $relationshipDateFormat ?? "standard">>
<<set $relationshipDateDay = $relationshipDateDay ?? 1>>
<<set $relationshipDateHour = $relationshipDateHour ?? 18>>
<<set $relationshipDateMinute = $relationshipDateMinute ?? 0>>
<div class="interaction-choice interaction-choice--date-time">
<<InteractionChoiceHeader "Make a little time" "Plan something together" "An afternoon out or a quick catch-up. Start with what suits you both." `$relationshipDateReturnPassage === "PhoneCall" ? "PhoneCall" : "enhanced_interaction_system"`>>
<<InteractionChoiceOptions "$relationshipDateFormat" `[{value: "standard", title: "An ordinary outing", description: "Take your time together. Duration depends on the venue."}, {value: "brief", title: "A quick catch-up", description: "20 minutes in the park or over coffee, with a fixed ending."}]` "What kind of meeting?">>
<<InteractionChoiceOptions "$relationshipDateTimingMode" `[{value: "now", title: "Head out now", description: "Find somewhere that works for you both today."}, {value: "calendar", title: "Plan ahead", description: "Pick a day and time within the next seven days."}]` "When would you like to go?">>
<div class="interaction-choice__calendar">
<<InteractionChoiceCalendar "$relationshipDate" `[8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22]`>>
</div>
<p class="interaction-choice__note">Your partner keeps their usual routine until it is time to leave. The meeting needs to fit around work, rest and other plans.</p>
<div class="interaction-choice__submit"><<button "Find a place" "enhanced_relationship_date_planner">>
<<if $relationshipDateTimingMode === "calendar">>
<<set $relationshipDateSelectedMinute = setup.playerNpcDateCalendarMinute($relationshipDateDay, $relationshipDateHour, $relationshipDateMinute)>>
<<else>><<unset $relationshipDateSelectedMinute>><</if>>
<</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _dateCalendarMinute = $relationshipDateSelectedMinute>>
<<set _dateOptions = setup.getPlayerNpcDateOptions($player, $interactionNpc, _dateCalendarMinute, $relationshipDateFormat ?? "standard")>>
<<set _replacementDate = setup.getPlayerNpcDateCancellation($interactionNpc)>>
<<set $relationshipDatePayer = $relationshipDatePayer ?? "auto">>
<div class="interaction-choice">
<<InteractionChoiceHeader "Somewhere for two" "Where shall we go?" "Choose a place that fits your plans, their preferences and your budget." "enhanced_relationship_date_time">>
<div class="interaction-choice__summary">
<div><span class="interaction-choice__eyebrow">Your meeting</span><strong><<if _dateCalendarMinute !== undefined>><<print setup.playerNpcDateTimeLabel(_dateCalendarMinute)>><<else>>Head out now<</if>> · <<if $relationshipDateFormat == "brief">>20-minute catch-up<<else>>Ordinary outing<</if>></strong></div>
<div class="interaction-choice__back"><<button "Change time" "enhanced_relationship_date_time">><</button>></div>
</div>
<<if _replacementDate>>
<p class="interaction-choice__note">Choose a new time and place for the cancelled date.</p>
<</if>>
<<InteractionChoicePayment "$relationshipDatePayer">>
<section class="interaction-choice__section">
<h2>Choose a place <span class="interaction-choice__count"><<print _dateOptions.filter(option => option.available).length>> available</span></h2>
<p>Select a place to send the invitation. Your partner will make their own way there.</p>
<div class="interaction-choice__venues">
<<for _dateOption range _dateOptions>>
<<capture _dateOption _replacementDate _dateCalendarMinute>>
<article class="interaction-choice__venue" @data-available="_dateOption.available" @data-venue="_dateOption.venue">
<h3>
<<if _dateOption.available>>
<<button _dateOption.label "enhanced_relationship_date_scheduled">>
<<if _replacementDate>>
<<set $relationshipDateResult = setup.reschedulePlayerNpcDate($player, $interactionNpc, _replacementDate.meetingId, _dateOption.venue, $relationshipDatePayer, _dateCalendarMinute, _dateOption.format ?? "standard")>>
<<else>>
<<set $relationshipDateResult = setup.schedulePlayerNpcDate($player, $interactionNpc, _dateOption.venue, $relationshipDatePayer, _dateCalendarMinute, _dateOption.format ?? "standard")>>
<</if>>
<</button>>
<<else>>
<button type="button" disabled><<print _dateOption.label>></button>
<</if>>
</h3>
<div class="interaction-choice__badges"><span class="interaction-choice__badge"><<if _dateOption.cost > 0>>$<<print _dateOption.cost>><<else>>Free<</if>></span><<if _dateOption.preferenceScore >= 1.18>><span class="interaction-choice__badge interaction-choice__badge--preferred">A favorite</span><</if>></div>
<<if _dateOption.preferenceLabel>><p><<print _dateOption.preferenceLabel>></p><</if>>
<<if !_dateOption.available>><p class="interaction-choice__unavailable"><<print _dateOption.reason>></p><</if>>
</article>
<</capture>>
<</for>>
</div>
<<if !_dateOptions.length>><p class="interaction-choice__note">No places are available for this meeting. Try changing the time or meeting format.</p><</if>>
</section>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<set _cancelView = setup.getPlayerNpcRelationshipView($interactionNpc)>>
<<set _cancelledOuting = setup.getPlayerNpcDateCancellation($interactionNpc)>>
<<if $relationshipDateCancellationResult>>
<<if !$relationshipDateCancellationResult.ok || !_cancelledOuting || $relationshipDateCancellationResult.reason !== _cancelledOuting.npcLine>>
<<ChatMessage $relationshipDateCancellationResult.reason>>
<</if>>
<<unset $relationshipDateCancellationResult>>
<</if>>
<<if _cancelView.plannedMeeting && ["planned", "traveling"].includes(_cancelView.plannedMeeting.status)>>
<<ChatMessage "Tell your partner that you cannot make the outing.">>
<div class="btn"><<button "I have another commitment" "enhanced_relationship_date_cancellation">>
<<set $relationshipDateCancellationResult = setup.explainPlayerNpcDateCancellation($interactionNpc, "schedule")>>
<</button>></div>
<div class="btn"><<button "I need to rest" "enhanced_relationship_date_cancellation">>
<<set $relationshipDateCancellationResult = setup.explainPlayerNpcDateCancellation($interactionNpc, "tired")>>
<</button>></div>
<div class="btn"><<button "I want to cancel our outing" "enhanced_relationship_date_cancellation">>
<<set $relationshipDateCancellationResult = setup.explainPlayerNpcDateCancellation($interactionNpc, "changed_plans")>>
<</button>></div>
<<elseif _cancelledOuting>>
<<Chat $interactionNpc _cancelledOuting.npcLine>>
<<if !_cancelView.plannedMeeting || !["planned", "traveling", "active"].includes(_cancelView.plannedMeeting.status)>>
<<capture _cancelledOuting>><div class="btn"><<button "Choose another outing" "enhanced_relationship_date_time">><<set $relationshipDateFormat = _cancelledOuting.format ?? "standard">><</button>></div><</capture>>
<</if>>
<<capture _cancelledOuting>>
<div class="btn"><<button "Leave it unplanned" "enhanced_relationship_date_cancellation">>
<<set $relationshipDateCancellationResult = setup.releasePlayerNpcDateCancellation($interactionNpc, _cancelledOuting.meetingId)>>
<</button>></div>
<</capture>>
<<else>>
<<ChatMessage "There is no cancelled outing awaiting a new plan.">>
<</if>>
<div class="btn padding-top"><<button "Back" `$relationshipDateReturnPassage === "PhoneCall" ? "PhoneCall" : "enhanced_interaction_system"`>><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<if $relationshipDateResult && $relationshipDateResult.ok>>
<<if $relationshipDateResult.meeting?.format == "brief">>
<<Chat $interactionNpc "I can make time for a short catch-up. Let's meet on time so we can both keep our other plans.">>
<<elseif $relationshipDateResult.meeting?.calendarScheduled>>
<<Chat $interactionNpc "That time works for me. I'll make my own way there.">>
<<else>>
<<Chat $interactionNpc "Sounds good. I'll make my own way there, see you when you turn up.">>
<</if>>
<<ChatMessage $relationshipDateResult.reason>>
<<else>>
<<Chat $interactionNpc "That plan doesn't work right now. Let's choose another time or place.">>
<<set _dateFailureMsg = $relationshipDateResult?.reason ?? "The date could not be planned.">>
<<ChatMessage _dateFailureMsg>>
<</if>>
<<unset $relationshipDateResult>>
<div class="btn padding-top"><<button "Continue" `$relationshipDateReturnPassage === "PhoneCall" ? "PhoneCall" : "enhanced_interaction_system"`>><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<set _resolvedDate = setup.resolvePlayerNpcDateArrival($player, $interactionNpc)>>
<<if _resolvedDate.ok>>
<<ChatMessage _resolvedDate.reason>>
<div class="btn padding-top"><<button "Start the date" "enhanced_relationship_date_session">><</button>></div>
<<else>>
<<Chat $interactionNpc "We can't start the date yet.">>
<<ChatMessage _resolvedDate.reason>>
<</if>>
<div class="btn padding-top"><<button "Continue" "enhanced_interaction_system">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<run setup.advancePlayerNpcVisits()>>
<div class="interaction-choice">
<<InteractionChoiceHeader "A little time at home" "Make yourself at home" "Enjoy the visit and decide what to do together." `$player.info.currentLocation == $interactionNpc.info.currentLocation ? "enhanced_interaction_system" : $player.info.currentLocation`>>
<<set _homeVisit = setup.getPlayerNpcVisit($interactionNpc)>>
<<set _homeVisitMedia = setup.getPlayerNpcVisitMedia($interactionNpc)>>
<<if _homeVisitMedia && CheckContentFilter($player, $interactionNpc)>>
<div data-home-visit-media><<Video _homeVisitMedia "text_fallback">></div>
<</if>>
<<if $homeVisitActionResult>>
<<ChatMessage $homeVisitActionResult.reason>>
<<unset $homeVisitActionResult>>
<<elseif _homeVisit>>
<<ChatMessage _homeVisit.reason>>
<</if>>
<<if _homeVisit && !["completed", "cancelled"].includes(_homeVisit.stage)>>
<div class="interaction-choice__context">
<div class="result-description">Home visit · <<print _homeVisit.stage>></div>
<<if _homeVisit.inspection?.completedMinute != null>>
<div class="result-description" data-home-visit-impression>
<<if _homeVisit.inspection.response == "declined">>
Your guest chose to skip looking around. You respected their answer.
<<else>>
<<if _homeVisit.inspection.familiar>>Your guest remembered an earlier visit. <</if>>
<<if _homeVisit.inspection.response == "welcomed">>
Looking around gave you a chance to talk about everyday life at home.
<<elseif _homeVisit.inspection.response == "concerned">>
Your guest asked about the upkeep the home needs.
<<else>>
Your guest kept the conversation about the home fairly general.
<</if>>
<<if _homeVisit.inspection.otherPeople > 0>>Other people were in the room during the conversation. <</if>>
<</if>>
</div>
<</if>>
<<if _homeVisit.stage == "travelling">>
<div class="result-description">Both of you need to arrive. The invitation does not include an overnight stay.</div>
<<elseif _homeVisit.stage == "visiting">>
<div class="result-description">Enjoy the visit together. You can discuss staying until morning in the evening.</div>
<<elseif _homeVisit.stage == "resting">>
<div class="result-description">You agreed to rest until morning. You can still end the visit here.</div>
<</if>>
<<set _encounterMenu = setup.getPlayerNpcEncounterMenu($interactionNpc, "visit")>>
<<set _homeVisitActions = _encounterMenu.primary>>
<section class="interaction-choice__section">
<h2>What would you like to do?</h2>
<p>A few next steps for this visit.</p>
<div class="interaction-choice__actions interaction-choice__actions--primary"><<include "enhanced_relationship_home_visit_choices">></div>
</section>
<<for _choiceGroup range _encounterMenu.groups>>
<section class="interaction-choice__section">
<h2><<print _choiceGroup.label>> <span class="interaction-choice__count"><<print _choiceGroup.actions.length>></span></h2>
<<set _homeVisitActions = _choiceGroup.actions>>
<div class="interaction-choice__actions"><<include "enhanced_relationship_home_visit_choices">></div>
</section>
<</for>>
</div>
<</if>>
<div class="interaction-choice__footer"><<button "Return to your location" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<div class="interaction-choice">
<<InteractionChoiceHeader "Just the two of you" "Enjoy your time together" "A conversation, a change of plans or a moment to slow down." "enhanced_interaction_system">>
<<set _dateView = setup.getPlayerNpcDateSession($interactionNpc)>>
<<if $relationshipDateActionResult>>
<<ChatMessage $relationshipDateActionResult.reason>>
<<if $relationshipDateActionResult.mediaPath && setup.isDateVenueMediaCompatible($relationshipDateActionResult.mediaPath, $interactionNpc) && CheckContentFilter($interactionNpc)>><<Video $relationshipDateActionResult.mediaPath>><</if>>
<<unset $relationshipDateActionResult>>
<</if>>
<<if _dateView.meeting && _dateView.meeting.status == "active">>
<div class="interaction-choice__context">
<div class="result-description">Date at <<print _dateView.meeting.venueLabel>> · <<print _dateView.stageLabel>></div>
<<if _dateView.paceLabel>><div class="result-description">Suggested pace for today: <<print _dateView.paceLabel>>. You can still change your plans.</div><</if>>
<<if _dateView.meeting.format == "brief">><div class="result-description">Your catch-up ends at <<print setup.playerNpcDateTimeLabel(_dateView.meeting.expiresMinute)>>.</div><</if>>
<<if _dateView.meeting.session.continuationInvitation == "offered">>
<<Chat $interactionNpc "I've enjoyed being with you. Would you like to go somewhere private?">>
<</if>>
<<if _dateView.proposal>>
<<Chat $interactionNpc _dateView.proposal.reason>>
<</if>>
<<if _dateView.meeting.session.destination>>
<div class="result-description">Agreed meeting place: <<print _dateView.destinationLabel>>. Both of you need to arrive before continuing.</div>
<</if>>
<<set _occasionGift = setup.getPlayerNpcOccasionGiftView($player, $interactionNpc)>>
<<if _occasionGift>>
<div class="result-description">Occasion gift: <<print _occasionGift.label>>.</div>
<<if _occasionGift.canOffer>>
<div class="btn padding-top"><<button "Offer the occasion gift (5 min)" "enhanced_relationship_date_session">>
<<set $relationshipDateActionResult = setup.offerPlayerNpcOccasionGift($player, $interactionNpc)>>
<<if $relationshipDateActionResult.minutes > 0>><<SpendTime $relationshipDateActionResult.minutes>><</if>>
<</button>></div>
<<else>>
<div class="result-description"><<print _occasionGift.reason>></div>
<</if>>
<</if>>
<<set _encounterMenu = setup.getPlayerNpcEncounterMenu($interactionNpc, "date")>>
<<set _dateActions = _encounterMenu.primary>>
<section class="interaction-choice__section">
<h2>What would you like to do?</h2>
<p>A few next steps for your date.</p>
<div class="interaction-choice__actions interaction-choice__actions--primary"><<include "enhanced_relationship_date_choices">></div>
</section>
<<for _choiceGroup range _encounterMenu.groups>>
<section class="interaction-choice__section">
<h2><<print _choiceGroup.label>> <span class="interaction-choice__count"><<print _choiceGroup.actions.length>></span></h2>
<<set _dateActions = _choiceGroup.actions>>
<div class="interaction-choice__actions"><<include "enhanced_relationship_date_choices">></div>
</section>
<</for>>
</div>
<<else>>
<<set _dateEndReason = _dateView.meeting?.cancelReason ?? "The date has ended.">>
<<ChatMessage _dateEndReason>>
<</if>>
</div>
<</nobr>><<for _dateAction range _dateActions>>
<<capture _dateAction>>
<div class="interaction-choice__action" @data-action="_dateAction.id" @data-ending="['finish', 'stop', 'stop_private', 'respect', 'respect_answer'].includes(_dateAction.id)"><<button _dateAction.label "enhanced_relationship_date_session">>
<<set $relationshipDateActionResult = setup.performPlayerNpcEncounterAction($interactionNpc, "date", _dateAction.id)>>
<</button>></div>
<</capture>>
<</for>><<for _homeVisitAction range _homeVisitActions>>
<<capture _homeVisitAction>>
<div class="interaction-choice__action" @data-action="_homeVisitAction.id" @data-ending="['leave', 'stop', 'stop_private', 'respect', 'respect_answer'].includes(_homeVisitAction.id)"><<button _homeVisitAction.label "enhanced_relationship_home_visit">>
<<if _homeVisitAction.id == "rest">>
<<set $homeVisitActionResult = {ok: false, reason: "The visit has ended.", minutes: 0}>>
<<for _homeRestSteps = 0; _homeRestSteps < 26 && setup.getPlayerNpcVisit($interactionNpc)?.stage == "resting"; _homeRestSteps++>>
<<set $homeVisitActionResult = setup.performPlayerNpcVisitAction($interactionNpc, "rest")>>
<<if !$homeVisitActionResult.ok>><<break>><</if>>
<<SpendTime $homeVisitActionResult.minutes>>
<<run setup.advancePlayerNpcVisits()>>
<</for>>
<<if setup.getPlayerNpcVisit($interactionNpc)?.stage == "morning">><<RestorePlayerFromSleep>><</if>>
<<set $homeVisitActionResult.reason = setup.getPlayerNpcVisit($interactionNpc)?.reason ?? "The visit has ended.">>
<<else>>
<<set $homeVisitActionResult = setup.performPlayerNpcEncounterAction($interactionNpc, "visit", _homeVisitAction.id)>>
<</if>>
<</button>></div>
<</capture>>
<</for>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<set _historyView = setup.getPlayerNpcRelationshipView($interactionNpc).history>>
<<if $relationshipHistoryResult>>
<<ChatMessage $relationshipHistoryResult.reason>>
<<unset $relationshipHistoryResult>>
<</if>>
<div class="interaction-result-panel">
<div class="result-description">Our history</div>
<<for _dateSummary range _historyView.dateSummaries>>
<div class="result-description"><<print _dateSummary.completed>> <<print _dateSummary.label>> together · <<print _dateSummary.enjoyable>> enjoyed by both</div>
<</for>>
<<if !_historyView.milestones.length>>
<div class="result-description">You haven't reached any relationship milestones together yet.</div>
<</if>>
<<for _milestone range _historyView.milestones>>
<div class="result-description">
<strong><<print _milestone.label>></strong> · <<print setup.playerNpcDateTimeLabel(_milestone.minute)>><br>
<<- _milestone.detail>>
</div>
<<if _historyView.canReflect>>
<<capture _milestone>>
<div class="btn padding-top"><<button "Talk about this memory (5 min)" "enhanced_relationship_history">>
<<set $relationshipHistoryResult = setup.reflectOnPlayerNpcRelationship($player, $interactionNpc, _milestone.id)>>
<<if $relationshipHistoryResult.minutes > 0>><<SpendTime $relationshipHistoryResult.minutes>><</if>>
<</button>></div>
<</capture>>
<</if>>
<</for>>
<<if _historyView.milestones.length && !_historyView.canReflect>>
<div class="result-description">You reminisced together recently. Spend some more time together before bringing it up again.</div>
<</if>>
</div>
<div class="btn padding-top"><<button "Back" "enhanced_interaction_system">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<set _boundaryView = setup.getPlayerNpcRelationshipView($interactionNpc)>>
<<Chat $interactionNpc "So what are the rules for us? I'd rather we pick them than just drift into it.">>
<div class="interaction-result-panel">
<div class="result-description">Current agreement: <<print _boundaryView.boundaryLabel>></div>
<div class="btn-container padding-top">
<div class="btn"><<button "Stay exclusive" "enhanced_relationship_boundary_saved">>
<<set $relationshipBoundarySaved = setup.setPlayerNpcSexualExclusivity($player, $interactionNpc, "exclusive")>>
<</button>></div>
<div class="btn"><<button "Allow partner sharing" "enhanced_relationship_boundary_saved">>
<<set $relationshipBoundarySaved = setup.setPlayerNpcSexualExclusivity($player, $interactionNpc, "sharing_allowed")>>
<</button>></div>
</div>
</div>
<div class="btn padding-top"><<button "Back" "enhanced_interaction_system">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<if $relationshipBoundarySaved>>
<<Chat $interactionNpc "Good. Now we both know where we stand.">>
<<ChatMessage "That's the deal now.">>
<<else>>
<<ChatMessage "You couldn't get them to agree to that.">>
<</if>>
<<unset $relationshipBoundarySaved>>
<div class="btn padding-top"><<button "Continue" "enhanced_interaction_system">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "enhanced_interaction_jealousy_check">>
<<if _jealousIntervene>>
<<include "jealous_partner_intervenes">>
<<elseif _playerPartnerIntervene>>
<<include "player_partner_confrontation">>
<<else>>
<<set _interaction = setup.getInteractionDefinition("askToDate")>>
<<set $interactionResult = setup.performEnhancedInteraction($player, $interactionNpc, "askToDate")>>
<<if $interactionResult.blocked>>
<<include "enhanced_interaction_result_display">>
<<else>>
<<SpendTime _interaction.timeCost>>
<<SpendEnergy $player _interaction.energyCost>>
<<run setup.applyInteractionEffects($player, $interactionNpc, "askToDate", $interactionResult)>>
<<ShowNpcIcon $interactionNpc>>
<<if $interactionResult.criticalSuccess>>
<<Chat $interactionNpc "Yes! God, I was starting to think you'd never ask. 💖💖💖">>
<<ChatMessage "They said yes. You're together now.">>
<<elseif $interactionResult.criticalFailure>>
<<Chat $interactionNpc "Date you? Are you serious? That's never going to happen. Sorry.">>
<<ChatMessage "You've been harshly rejected. This hurts...">>
<<elseif $interactionResult.success>>
<<Chat $interactionNpc "Really? You want to date me? ...Yes! I'd love that! 💕">>
<<ChatMessage "They said yes! You're now dating!">>
<<else>>
<<Chat $interactionNpc "I'm flattered, but... I don't think I'm ready for that. Sorry.">>
<<ChatMessage "They gently declined. Maybe try to get closer first.">>
<</if>>
/* Grants, status, money and resentment: one source, shared with the AI chat. */
<<set _consequences = setup.applyInteractionConsequences($player, $interactionNpc, "askToDate", $interactionResult)>>
<<include "enhanced_interaction_result_display">>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _interaction = setup.getInteractionDefinition("askToBeFriends")>>
<<set $interactionResult = setup.performEnhancedInteraction($player, $interactionNpc, "askToBeFriends")>>
<<if $interactionResult.blocked>>
<<include "enhanced_interaction_result_display">>
<<else>>
<<SpendTime _interaction.timeCost>>
<<SpendEnergy $player _interaction.energyCost>>
<<run setup.applyInteractionEffects($player, $interactionNpc, "askToBeFriends", $interactionResult)>>
<<ShowNpcIcon $interactionNpc>>
<<if $interactionResult.criticalSuccess>>
<<Chat $interactionNpc "Of course! I feel like we really click! Let's be great friends! 🤝">>
<<ChatMessage "You've made a new friend!">>
<<run setup.setPlayerNpcRelationshipStatus($player, $interactionNpc, "friend", {source: "player_friendship"})>>
<<elseif $interactionResult.criticalFailure>>
<<Chat $interactionNpc "Friends? With you? I don't think so.">>
<<ChatMessage "They rejected your friendship offer harshly.">>
<<elseif $interactionResult.success>>
<<Chat $interactionNpc "Sure, I'd like that! We can be friends.">>
<<ChatMessage "You're now friends!">>
<<run setup.setPlayerNpcRelationshipStatus($player, $interactionNpc, "friend", {source: "player_friendship"})>>
<<else>>
<<Chat $interactionNpc "Let's keep getting to know each other first, okay?">>
<<ChatMessage "They want to take things slow.">>
<</if>>
<<include "enhanced_interaction_result_display">>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _interaction = setup.getInteractionDefinition("askToBeBestFriends")>>
<<set $interactionResult = setup.performEnhancedInteraction($player, $interactionNpc, "askToBeBestFriends")>>
<<if $interactionResult.blocked>>
<<include "enhanced_interaction_result_display">>
<<else>>
<<SpendTime _interaction.timeCost>>
<<SpendEnergy $player _interaction.energyCost>>
<<run setup.applyInteractionEffects($player, $interactionNpc, "askToBeBestFriends", $interactionResult)>>
<<ShowNpcIcon $interactionNpc>>
<<if $interactionResult.criticalSuccess>>
<<Chat $interactionNpc "Best friends? You're already my best friend! BFF forever! 💖">>
<<ChatMessage "You've become best friends!">>
<<run setup.setPlayerNpcRelationshipStatus($player, $interactionNpc, "bestFriend", {source: "player_friendship"})>>
<<elseif $interactionResult.criticalFailure>>
<<Chat $interactionNpc "Best friends? That's a bit much... I don't feel that close to you.">>
<<ChatMessage "They don't see you as a best friend.">>
<<elseif $interactionResult.success>>
<<Chat $interactionNpc "Yeah! We are pretty close, aren't we? Best friends it is!">>
<<ChatMessage "You're now best friends!">>
<<run setup.setPlayerNpcRelationshipStatus($player, $interactionNpc, "bestFriend", {source: "player_friendship"})>>
<<else>>
<<Chat $interactionNpc "I really like you, but... I'm not ready for that level of commitment yet.">>
<<ChatMessage "They need more time.">>
<</if>>
<<include "enhanced_interaction_result_display">>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "enhanced_interaction_jealousy_check">>
<<if _jealousIntervene>>
<<include "jealous_partner_intervenes">>
<<elseif _playerPartnerIntervene>>
<<include "player_partner_confrontation">>
<<else>>
<<set _interaction = setup.getInteractionDefinition("confessInterest")>>
<<set $interactionResult = setup.performEnhancedInteraction($player, $interactionNpc, "confessInterest")>>
<<if $interactionResult.blocked>>
<<include "enhanced_interaction_result_display">>
<<else>>
<<SpendTime _interaction.timeCost>>
<<SpendEnergy $player _interaction.energyCost>>
<<run setup.applyInteractionEffects($player, $interactionNpc, "confessInterest", $interactionResult)>>
<<ShowNpcIcon $interactionNpc>>
<<if $interactionResult.criticalSuccess>>
<<Chat $interactionNpc "Really?! I... I've been feeling the same way! I'm so happy! 💕">>
<<ChatMessage "They feel the same! You're now mutual crushes!">>
<<run setup.setPlayerNpcRelationshipStatus($player, $interactionNpc, "crush", {source: "confession"})>>
<<elseif $interactionResult.criticalFailure>>
<<Chat $interactionNpc "What? No... I don't see you that way at all. This is awkward...">>
<<ChatMessage "They don't share your feelings. This is embarrassing.">>
<<elseif $interactionResult.success>>
<<Chat $interactionNpc "I... I think I might feel something too. Let's see where this goes...">>
<<ChatMessage "They're open to exploring these feelings!">>
<<run setup.setPlayerNpcRelationshipStatus($player, $interactionNpc, "crush", {source: "confession"})>>
<<else>>
<<Chat $interactionNpc "That's sweet, but... I think we're better as friends.">>
<<ChatMessage "They want to stay friends.">>
<</if>>
<<include "enhanced_interaction_result_display">>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "enhanced_interaction_jealousy_check">>
<<if _jealousIntervene>>
<<include "jealous_partner_intervenes">>
<<elseif _playerPartnerIntervene>>
<<include "player_partner_confrontation">>
<<else>>
<<set _interaction = setup.getInteractionDefinition("proposeFWB")>>
<<set $interactionResult = setup.performEnhancedInteraction($player, $interactionNpc, "proposeFWB")>>
<<if $interactionResult.blocked>>
<<include "enhanced_interaction_result_display">>
<<else>>
<<SpendTime _interaction.timeCost>>
<<SpendEnergy $player _interaction.energyCost>>
<<run setup.applyInteractionEffects($player, $interactionNpc, "proposeFWB", $interactionResult)>>
<<ShowNpcIcon $interactionNpc>>
<<set _playerRel = $player.getRelationship($interactionNpc.info.id)>>
<<set _npcRel = $interactionNpc.getRelationship($player.info.id)>>
<<if $interactionResult.criticalSuccess>>
<<Chat $interactionNpc "I was hoping you'd ask! No strings attached sounds perfect right now~ 😏">>
<<ChatMessage "They eagerly agree to a friends with benefits arrangement!">>
<<run setup.setPlayerNpcRelationshipStatus($player, $interactionNpc, "fuckbuddy", {source: "player_fwb"})>>
<<elseif $interactionResult.criticalFailure>>
<<Chat $interactionNpc "Excuse me?! That's disgusting! I thought we were friends!">>
<<ChatMessage "They're deeply offended by your proposition.">>
<<elseif $interactionResult.success>>
<<Chat $interactionNpc "Well... I'm not looking for anything serious right now. Why not?">>
<<ChatMessage "You're now friends with benefits!">>
<<run setup.setPlayerNpcRelationshipStatus($player, $interactionNpc, "fuckbuddy", {source: "player_fwb"})>>
<<else>>
<<Chat $interactionNpc "I don't think that's a good idea for us. Let's keep things as they are.">>
<<ChatMessage "They prefer to keep the relationship platonic.">>
<</if>>
<<include "enhanced_interaction_result_display">>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<set _currentRelation = $player.getRelationship($interactionNpc.info.id, false)?.relation ?? "acquaintance">>
<<Chat $player "I think we need to talk... I don't think this is working out.">>
<<set _reaction = random(1, 3)>>
<<if _reaction == 1>>
<<Chat $interactionNpc "What?! You're breaking up with me?! I can't believe this!">>
<<IncreaseFear $player $interactionNpc -10>>
<<IncreaseAnger $player $interactionNpc 20>>
<<elseif _reaction == 2>>
<<Chat $interactionNpc "I... yeah. I saw it coming. Fine.">>
<<IncreaseAnger $player $interactionNpc 5>>
<<else>>
<<Chat $interactionNpc "Fine! I was going to break up with you anyway! Good riddance!">>
<<IncreaseAnger $player $interactionNpc 15>>
<<IncreaseLove $player $interactionNpc -15>>
<</if>>
<<IncreaseLove $player $interactionNpc -20>>
<<IncreaseFriendship $player $interactionNpc -15>>
<<IncreaseSex $player $interactionNpc -10>>
/* Reset relation to acquaintance or friend depending on remaining metrics */
<<set _playerRel = $player.getRelationship($interactionNpc.info.id)>>
<<set _npcRel = $interactionNpc.getRelationship($player.info.id)>>
<<set _metrics = _playerRel.metrics>>
<<if _metrics.friendship >= 30>>
<<run setup.setPlayerNpcRelationshipStatus($player, $interactionNpc, "friend", {source: "player_breakup", breakupReason: "The player ended the relationship."})>>
<<ChatMessage "You broke up but remain friends.">>
<<else>>
<<run setup.setPlayerNpcRelationshipStatus($player, $interactionNpc, "acquaintance", {source: "player_breakup", breakupReason: "The player ended the relationship."})>>
<<ChatMessage "You broke up. The relationship is over.">>
<</if>>
<div class="btn padding-top">
<<button "Continue" "NudeCheck">><<set $canShowStatsBtn = true>><<set $gameSettings.allowSaves = true>><</button>>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<set _proposalType = $pendingNpcProposal.type>>
<<set _reason = $pendingNpcProposal.reason>>
<<set _currentRelation = $player.getRelationship($interactionNpc.info.id, false)?.relation ?? "acquaintance">>
/* Determine if this is a downgrade or friendzone */
<<set _isDowngrade = false>>
<<set _isFriendzone = false>>
<<if _proposalType == "friendzone">>
<<set _isFriendzone = true>>
<<elseif _currentRelation == "dating" || _currentRelation == "soulmate">>
<<if _proposalType == "friend" || _proposalType == "acquaintance">>
<<set _isDowngrade = true>>
<</if>>
<<elseif _currentRelation == "fuckbuddy">>
<<if _proposalType == "friend" || _proposalType == "acquaintance">>
<<set _isDowngrade = true>>
<</if>>
<<elseif _currentRelation == "bestFriend">>
<<if _proposalType == "friend" || _proposalType == "acquaintance">>
<<set _isDowngrade = true>>
<</if>>
<<elseif _currentRelation == "friend">>
<<if _proposalType == "acquaintance">>
<<set _isDowngrade = true>>
<</if>>
<<elseif _currentRelation == "crush">>
<<if _proposalType == "friend" || _proposalType == "acquaintance">>
<<set _isDowngrade = true>>
<</if>>
<</if>>
<div class="interaction-result-panel">
<<if _isDowngrade>>
<div class="result-banner failure">
<span class="result-icon">💔</span>
<span class="result-text"><<print $interactionNpc.info.firstName>> wants to talk...</span>
</div>
<<elseif _isFriendzone>>
<div class="result-banner">
<span class="result-icon">😅</span>
<span class="result-text"><<print $interactionNpc.info.firstName>> wants to clarify something...</span>
</div>
<<else>>
<div class="result-banner success">
<span class="result-icon">💬</span>
<span class="result-text"><<print $interactionNpc.info.firstName>> wants to talk...</span>
</div>
<</if>>
<div class="result-description"><<print _reason>></div>
<<if _isFriendzone>>
/* Friendzone message */
<<Chat $interactionNpc "Look, I'll just say it. I like you, I really do... but as a friend. That's all it is for me. We're still good, yeah?">>
<<elseif _isDowngrade>>
/* Downgrade messages */
<<switch _currentRelation>>
<<case "dating" "soulmate">>
<<Chat $interactionNpc "I've been thinking... I don't think this is working out between us. I think we should break up.">>
<<case "fuckbuddy">>
<<Chat $interactionNpc "Look, I think we should stop this... arrangement. Let's just be friends, okay?">>
<<case "bestFriend">>
<<Chat $interactionNpc "I feel like we've grown apart lately. I don't know if we're as close as we used to be...">>
<<case "friend">>
<<Chat $interactionNpc "I don't really feel like we're friends anymore. Things have changed between us.">>
<<case "crush">>
<<Chat $interactionNpc "I used to have feelings for you, but... I don't feel that way anymore. I'm sorry.">>
<</switch>>
<<else>>
/* Upgrade messages */
<<switch _proposalType>>
<<case "friend">>
<<Chat $interactionNpc "Hey, I really enjoy spending time with you. I think we're pretty good friends now, don't you think?">>
<<case "bestFriend">>
<<Chat $interactionNpc "You know, I feel like we've gotten really close. You're my best friend, you know that?">>
<<case "crush">>
<<Chat $interactionNpc "I... I need to tell you something. I think I have feelings for you...">>
<<case "dating">>
<<Chat $interactionNpc "I've been thinking a lot about us... Would you like to be my partner? Like, officially?">>
<<case "soulmate">>
<<Chat $interactionNpc "I don't say this lightly. Every day with you feels like the one I was waiting for. I think you're the one for me - the person I want beside me for good.">>
<<case "fuckbuddy">>
<<Chat $interactionNpc "So... I was thinking. We're both adults here. What if we added some... benefits to our friendship?">>
<</switch>>
<</if>>
</div>
<<if _isFriendzone>>
<div class="btn-container padding-top">
<div class="btn"><<button "Okay. Friends it is 🤝" "enhanced_npc_proposal_accept">><</button>></div>
<div class="btn"><<button "Actually, I have feelings for you... 💕" "enhanced_npc_proposal_confess">><</button>></div>
</div>
<<elseif _isDowngrade>>
<div class="btn-container padding-top">
<div class="btn"><<button "Okay... 💔" "enhanced_npc_proposal_accept">><</button>></div>
<div class="btn"><<button "Please, give me another chance! 🙏" "enhanced_npc_proposal_decline">><</button>></div>
</div>
<<else>>
<div class="btn-container padding-top">
<div class="btn"><<button "Accept 💕" "enhanced_npc_proposal_accept">><</button>></div>
<div class="btn"><<button "I need time to think... 🤔" "enhanced_npc_proposal_postpone">><</button>></div>
<div class="btn"><<button "I'm sorry, but no 💔" "enhanced_npc_proposal_decline">><</button>></div>
</div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<set _proposalType = $pendingNpcProposal.type>>
<<set _currentRelation = $player.getRelationship($interactionNpc.info.id, false)?.relation ?? "acquaintance">>
/* Check if this is accepting a downgrade or friendzone */
<<set _isDowngrade = false>>
<<set _isFriendzone = (_proposalType == "friendzone")>>
<<if _currentRelation == "dating" || _currentRelation == "soulmate" || _currentRelation == "fuckbuddy" || _currentRelation == "bestFriend" || _currentRelation == "crush">>
<<if _proposalType == "friend" || _proposalType == "acquaintance">>
<<set _isDowngrade = true>>
<</if>>
<<elseif _currentRelation == "friend">>
<<if _proposalType == "acquaintance">>
<<set _isDowngrade = true>>
<</if>>
<</if>>
<<if _isFriendzone>>
/* Accepting friendzone - change relation type */
<<Chat $interactionNpc "Thanks for understanding. I really do value our friendship, you know.">>
<<set _playerRel = $player.getRelationship($interactionNpc.info.id)>>
<<set _npcRel = $interactionNpc.getRelationship($player.info.id)>>
<<run setup.setPlayerNpcRelationshipStatus($player, $interactionNpc, "friendzone", {source: "npc_proposal"})>>
<<set _msg = "You've been friendzoned by " + $interactionNpc.info.firstName + ". They see you only as a friend.">>
<<ChatMessage _msg>>
<<elseif _isDowngrade>>
/* Accepting a downgrade - change relation type directly */
<<Chat $interactionNpc "I'm glad you understand. I hope we can still be okay with each other.">>
<<set _playerRel = $player.getRelationship($interactionNpc.info.id)>>
<<set _npcRel = $interactionNpc.getRelationship($player.info.id)>>
<<run setup.setPlayerNpcRelationshipStatus($player, $interactionNpc, _proposalType, {source: "npc_downgrade", breakupReason: "The NPC ended the relationship."})>>
<<set _resultMsg = "Your relationship with " + $interactionNpc.info.firstName + " is now: " + _proposalType>>
<<ChatMessage _resultMsg>>
<<else>>
/* Accepting an upgrade - get relations first */
<<set _playerRel = $player.getRelationship($interactionNpc.info.id)>>
<<set _npcRel = $interactionNpc.getRelationship($player.info.id)>>
<<switch _proposalType>>
<<case "friend">>
<<Chat $interactionNpc "Great! I'm so happy! Let's hang out more often!">>
<<run setup.setPlayerNpcRelationshipStatus($player, $interactionNpc, "friend", {source: "npc_proposal"})>>
<<set _msg = "You're now friends with " + $interactionNpc.info.firstName + "!">>
<<ChatMessage _msg>>
<<case "bestFriend">>
<<Chat $interactionNpc "I knew you felt the same! Best friends forever! 🤝">>
<<run setup.setPlayerNpcRelationshipStatus($player, $interactionNpc, "bestFriend", {source: "npc_proposal"})>>
<<set _msg = "You're now best friends with " + $interactionNpc.info.firstName + "!">>
<<ChatMessage _msg>>
<<case "crush">>
<<Chat $interactionNpc "Really?! You feel the same? I'm so relieved! 💕">>
<<run setup.setPlayerNpcRelationshipStatus($player, $interactionNpc, "crush", {source: "npc_proposal"})>>
<<IncreaseLove $player $interactionNpc 15>>
<<set _msg = "You and " + $interactionNpc.info.firstName + " are now mutual crushes!">>
<<ChatMessage _msg>>
<<case "dating">>
<<Chat $interactionNpc "Yes! I'm so happy! We're officially together now! 💖">>
<<run setup.setPlayerNpcRelationshipStatus($player, $interactionNpc, "dating", {source: "npc_proposal"})>>
<<IncreaseLove $player $interactionNpc 20>>
<<set _msg = "You and " + $interactionNpc.info.firstName + " are now dating!">>
<<ChatMessage _msg>>
<<case "soulmate">>
<<Chat $interactionNpc "You feel it too... Then that's it. You and me, for good. 💞">>
<<run setup.setPlayerNpcRelationshipStatus($player, $interactionNpc, "soulmate", {source: "npc_proposal"})>>
<<IncreaseLove $player $interactionNpc 10>>
<<set _msg = "You and " + $interactionNpc.info.firstName + " are soulmates now!">>
<<ChatMessage _msg>>
<<case "fuckbuddy">>
<<Chat $interactionNpc "Nice~ This is going to be fun. No strings attached, right? 😏">>
<<run setup.setPlayerNpcRelationshipStatus($player, $interactionNpc, "fuckbuddy", {source: "npc_proposal"})>>
<<IncreaseSex $player $interactionNpc 15>>
<<set _msg = "You and " + $interactionNpc.info.firstName + " are now friends with benefits!">>
<<ChatMessage _msg>>
<</switch>>
<</if>>
<<unset $pendingNpcProposal>>
/* After any relationship change - return to location to prevent immediate re-proposals */
<div class="btn padding-top">
<<button "Continue" "NudeCheck">><<set $canShowStatsBtn = true>><<set $gameSettings.allowSaves = true>><</button>>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<set _proposalType = $pendingNpcProposal.type>>
<<set _currentRelation = $player.getRelationship($interactionNpc.info.id, false)?.relation ?? "acquaintance">>
/* Check if this is declining a downgrade (asking for another chance) */
<<set _isDowngrade = false>>
<<if _currentRelation == "dating" || _currentRelation == "soulmate" || _currentRelation == "fuckbuddy" || _currentRelation == "bestFriend" || _currentRelation == "crush">>
<<if _proposalType == "friend" || _proposalType == "acquaintance">>
<<set _isDowngrade = true>>
<</if>>
<<elseif _currentRelation == "friend">>
<<if _proposalType == "acquaintance">>
<<set _isDowngrade = true>>
<</if>>
<</if>>
<<if _isDowngrade>>
/* Player is asking for another chance */
<<set _secondChanceRoll = random(1, 100)>>
<<set _relationMetrics = $player.getRelationship($interactionNpc.info.id, false)?.metrics>>
<<set _successChance = 30 + Math.floor(_relationMetrics.friendship / 3) + Math.floor(_relationMetrics.love / 3)>>
<<if _secondChanceRoll <= _successChance>>
/* NPC gives another chance */
<<Chat $interactionNpc "...Fine. I'll give you one more chance. But things need to change, okay? *They agreed to give you another chance!*">>
<<run $player.getRelationship($interactionNpc.info.id).metrics.increaseAnger(5)>>
<<run $interactionNpc.getRelationship($player.info.id).metrics.increaseAnger(5)>>
<<else>>
/* NPC refuses - change relation type directly */
<<set _refuseMsg = 'I\'m sorry, but my mind is made up. This is for the best. (Your relationship is now: ' + _proposalType + ')'>>
<<Chat $interactionNpc _refuseMsg>>
<<set _playerRel = $player.getRelationship($interactionNpc.info.id)>>
<<set _npcRel = $interactionNpc.getRelationship($player.info.id)>>
<<run setup.setPlayerNpcRelationshipStatus($player, $interactionNpc, _proposalType, {source: "npc_downgrade", breakupReason: "The NPC ended the relationship."})>>
<<run _playerRel.metrics.increaseAnger(10)>>
<<run _npcRel.metrics.increaseAnger(10)>>
<</if>>
<<else>>
/* Declining an upgrade offer */
<<switch _proposalType>>
<<case "friend">>
<<Chat $interactionNpc "Oh... okay. That's fine, I guess. *They seem a bit disappointed*">>
<<run $player.getRelationship($interactionNpc.info.id).metrics.increaseAnger(5)>>
<<run $interactionNpc.getRelationship($player.info.id).metrics.increaseAnger(5)>>
<<case "bestFriend">>
<<Chat $interactionNpc "I see... I thought we were closer than that. *They're hurt*">>
<<run $player.getRelationship($interactionNpc.info.id).metrics.increaseAnger(8)>>
<<run $interactionNpc.getRelationship($player.info.id).metrics.increaseAnger(8)>>
<<IncreaseFriendship $player $interactionNpc -5>>
<<case "crush">>
<<Chat $interactionNpc "Oh... right. Sorry for making it weird... *This will affect your relationship*">>
<<IncreaseLove $player $interactionNpc -10>>
<<run $player.getRelationship($interactionNpc.info.id).metrics.increaseAnger(10)>>
<<run $interactionNpc.getRelationship($player.info.id).metrics.increaseAnger(10)>>
<<case "dating">>
<<Chat $interactionNpc "I... I see. I'm sorry for assuming... *They're heartbroken*">>
<<IncreaseLove $player $interactionNpc -15>>
<<run $player.getRelationship($interactionNpc.info.id).metrics.increaseAnger(15)>>
<<run $interactionNpc.getRelationship($player.info.id).metrics.increaseAnger(15)>>
<<case "fuckbuddy">>
<<Chat $interactionNpc "Oh, that's okay. Forget I said anything! *They try to play it off casually*">>
<<run $player.getRelationship($interactionNpc.info.id).metrics.increaseAnger(5)>>
<<run $interactionNpc.getRelationship($player.info.id).metrics.increaseAnger(5)>>
<</switch>>
<</if>>
<<unset $pendingNpcProposal>>
/* After any proposal response - return to location to prevent loops */
<div class="btn padding-top">
<<button "Continue" "NudeCheck">><<set $canShowStatsBtn = true>><<set $gameSettings.allowSaves = true>><</button>>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<set _proposalType = $pendingNpcProposal.type>>
<<set _relationMetrics = $player.getRelationship($interactionNpc.info.id, false)?.metrics>>
/* Roll for NPC reaction - higher friendship/love = better chance of accepting delay */
<<set _acceptRoll = random(1, 100)>>
<<set _acceptChance = 50 + Math.floor(_relationMetrics.friendship / 4) + Math.floor(_relationMetrics.love / 4)>>
<<if _acceptRoll <= _acceptChance>>
/* NPC understands and accepts the delay */
<<switch _proposalType>>
<<case "friend">>
<<Chat $interactionNpc "Oh, okay! No pressure. Just know that I really enjoy hanging out with you. *They seem understanding*">>
<<case "bestFriend">>
<<Chat $interactionNpc "Take your time. I just wanted you to know you matter to me. *They smile warmly*">>
<<case "crush">>
<<Chat $interactionNpc "O-oh... okay. I get it. This is a lot to process. Take your time, I'll wait. *They look nervous but hopeful*">>
<<case "dating">>
<<Chat $interactionNpc "It's a big step, I get it. I'm not going anywhere. 💕 *They're patient and caring*">>
<<case "fuckbuddy">>
<<Chat $interactionNpc "Sure, no rush! Just let me know whenever. No pressure at all. *They seem casual about it*">>
<</switch>>
<<ChatMessage "They accepted your need for time. No hard feelings!">>
<<else>>
/* NPC is a bit hurt but still accepts */
<<switch _proposalType>>
<<case "friend">>
<<Chat $interactionNpc "Oh... sure, I guess. *They seem slightly disappointed but try to hide it*">>
<<run $interactionNpc.getRelationship($player.info.id).metrics.increaseAnger(2)>>
<<case "bestFriend">>
<<Chat $interactionNpc "Right... of course. *They look a bit hurt but nod understandingly*">>
<<run $interactionNpc.getRelationship($player.info.id).metrics.increaseAnger(3)>>
<<case "crush">>
<<Chat $interactionNpc "I... I see. Yeah, take your time... *They try to hide their disappointment*">>
<<run $interactionNpc.getRelationship($player.info.id).metrics.increaseAnger(5)>>
<<case "dating">>
<<Chat $interactionNpc "Oh... okay. *They look down, clearly disappointed but accepting*">>
<<run $interactionNpc.getRelationship($player.info.id).metrics.increaseAnger(5)>>
<<case "fuckbuddy">>
<<Chat $interactionNpc "Oh, yeah, no worries. *They shrug, but you sense slight disappointment*">>
<<run $interactionNpc.getRelationship($player.info.id).metrics.increaseAnger(2)>>
<</switch>>
<<ChatMessage "They accepted, but seem slightly hurt by the delay.">>
<</if>>
<<unset $pendingNpcProposal>>
/* After postponing - return to location to prevent immediate re-proposals */
<div class="btn padding-top">
<<button "Continue" "NudeCheck">><<set $canShowStatsBtn = true>><<set $gameSettings.allowSaves = true>><</button>>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
/* Player confesses feelings when NPC tries to friendzone them */
<<set _relationMetrics = $player.getRelationship($interactionNpc.info.id, false)?.metrics>>
<<set _npcMetrics = $interactionNpc.getRelationship($player.info.id, false)?.metrics>>
/* Roll for NPC reaction - depends on current love/attraction */
<<set _confessRoll = random(1, 100)>>
<<set _successChance = 20 + Math.floor(_relationMetrics.love / 2) + Math.floor(_npcMetrics.love / 2) + Math.floor(_relationMetrics.sex / 4)>>
<<if _confessRoll <= _successChance>>
/* NPC is surprised but considers it */
<<Chat $interactionNpc "W-what? You... have feelings for me? I... I didn't realize. Maybe I've been too hasty...">>
<<ChatMessage "That caught them off guard, and they're not saying no.">>
<<IncreaseLove $player $interactionNpc 10>>
/* Don't change to friendzone, stay as friends */
<<else>>
/* NPC gently but firmly rejects */
<<set _rejectRoll = random(1, 3)>>
<<switch _rejectRoll>>
<<case 1>>
<<Chat $interactionNpc "Oh... that's flattering, honestly. But I don't see you like that. Sorry... we're still friends, right?">>
<<case 2>>
<<Chat $interactionNpc "Thanks for saying it straight. It doesn't change anything for me, though. You're a great friend, and that's all it's going to be.">>
<<case 3>>
<<Chat $interactionNpc "That's... really sweet of you to say. But I don't feel the same way. I hope this doesn't make things weird between us...">>
<</switch>>
<<ChatMessage "They've confirmed they only see you as a friend.">>
<<set _playerRel = $player.getRelationship($interactionNpc.info.id)>>
<<set _npcRel = $interactionNpc.getRelationship($player.info.id)>>
<<run setup.setPlayerNpcRelationshipStatus($player, $interactionNpc, "friendzone", {source: "npc_friendzone"})>>
<<run _playerRel.metrics.increaseAnger(5)>>
<</if>>
<<unset $pendingNpcProposal>>
<div class="btn padding-top">
<<button "Continue" "NudeCheck">><<set $canShowStatsBtn = true>><<set $gameSettings.allowSaves = true>><</button>>
</div>
<</nobr>><<widget "InitInteractionTips">>
<<done>>
<<script>>
(function() {
var player = State.variables.player;
var npc = State.variables.interactionNpc;
if (!player || !npc) return;
window.initNpcInteractionMenu(document.querySelector('#passages .passage:last-child .main-interaction-panel'), {
getReason: function(id) { return setup.getInteractionBlockReason(player, npc, id); },
getTips: function(id) { return setup.getImprovementTips(player, npc, id); },
getCost: function(id) { return setup.getInteractionDefinition(id); }
});
})();
<</script>>
<</done>>
<</widget>><<nobr>>
<<set _currentFirstName = $interactionNpc.info.firstName>>
<<set _currentSecondName = $interactionNpc.info.secondName>>
<<set _npcMetrics = $player.getRelationship($interactionNpc.info.id, false)?.metrics>>
/* Calculate success chance based on relationship */
<<set _renameChance = 20 + Math.floor(_npcMetrics.friendship / 2) + Math.floor(_npcMetrics.love / 3) + Math.floor(_npcMetrics.fear / 4)>>
<<set _renameChance = Math.min(95, Math.max(5, _renameChance))>>
<div class="rename-dialog">
<p>Current name: <strong><<print _currentFirstName>> <<print _currentSecondName>></strong></p>
<p>Success chance: <strong><<print _renameChance>>%</strong></p>
<p class="rename-hint">Higher friendship, love, or fear increases your chances.</p>
<div class="rename-inputs">
<label>First Name:
<<textbox "_newFirstName" _currentFirstName>>
</label>
<label>Last Name:
<<textbox "_newSecondName" _currentSecondName>>
</label>
</div>
<div class="rename-buttons">
<<set _renameButtonText = "Try to Rename (" + _renameChance + "%)">>
<<button _renameButtonText>>
<<set _roll = random(1, 100)>>
<<if _roll <= _renameChance>>
/* Success */
<<if _newFirstName && _newFirstName.trim() != "">>
<<set $interactionNpc.info.firstName = _newFirstName.trim()>>
<</if>>
<<if _newSecondName && _newSecondName.trim() != "">>
<<set $interactionNpc.info.secondName = _newSecondName.trim()>>
<</if>>
<<run Dialog.close()>>
<<run UI.alert("Success! " + $interactionNpc.info.firstName + " accepted their new name!")>>
<<goto "enhanced_interaction_system">>
<<else>>
/* Failure */
<<run $player.getRelationship($interactionNpc.info.id).metrics.increaseAnger(5)>>
<<run Dialog.close()>>
<<run UI.alert("Failed! They refused to accept a new name and are slightly annoyed.")>>
<</if>>
<</button>>
<<button "Cancel">>
<<run Dialog.close()>>
<</button>>
</div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _battleSetControls = {attack: true, seduce: true, items: true, actions: true}>>
<<StartFight $player $interactionNpc _battleSetControls undefined undefined undefined true>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _relData = $player.getRelationship($interactionNpc.info.id)>>
<<set _metrics = _relData.metrics>>
<<set _currentRelation = _relData.relation ?? "acquaintance">>
/* Get metric values - access directly like other code */
<<set _lovVal = Math.floor(_metrics.love) || 0>>
<<set _sexVal = Math.floor(_metrics.sex) || 0>>
/* Calculate success chance */
<<set _bdsmChance = Math.min(95, Math.floor(30 + _lovVal * 0.5 + _sexVal * 0.8))>>
<<set _roll = random(1, 100)>>
<<set _success = _roll <= _bdsmChance>>
<<set _npcName = $interactionNpc.info.firstName>>
<<Chat $player "I've got something special in mind... Would you be interested in a more... intense experience? I know a place where we could explore some boundaries together.">>
<<if _success>>
/* Success - NPC agrees */
<<set _responseOptions = [
"That sounds... intriguing. I've always been curious about that kind of thing.",
"You know what? Yeah, I trust you. Let's do it.",
"I've heard about things like this... I'm nervous but excited.",
"As long as it's with you, I'm willing to try new things."
]>>
<<set _response = _responseOptions[random(0, _responseOptions.length - 1)]>>
<<Chat $interactionNpc _response>>
/* Charge player money */
<<set $player.money -= 200>>
/* Set up for BDSM session - use $interactionNpc directly */
<<set $bdsmSessionPaid = true>>
<<set $bdsmReturnLocation = $player.info.currentLocation>>
<div class="interaction-result-panel bdsm-result">
<div class="result-banner critical-success">
<span class="result-icon">⛓️</span>
<span class="result-text">BDSM Session Agreed!</span>
</div>
<div class="result-description"><<print _npcName>> is ready to explore new boundaries with you.</div>
<div class="metric-changes">
<div class="metric-change negative">
<span class="metric-icon">💰</span>
<span class="metric-name">Money:</span>
<span class="metric-value">-$200</span>
</div>
</div>
<div class="chance-breakdown">
<div class="chance-header">
Success Chance: <span class="chance-value"><<print _bdsmChance>>%</span>
(Rolled: <<print _roll>>)
</div>
</div>
<div class="result-buttons">
<div class="btn">
<<button "⛓️ Go to Training Room" "BDSMTrainingRoom">>
<<set $interactionNpc.info.currentLocation = "BDSMTrainingRoom">>
<<set $player.info.currentLocation = "BDSMTrainingRoom">>
<</button>>
</div>
<div class="btn">
<<button "Maybe Later" "enhanced_interaction_system">>
<<set $player.money += 200>>
<<unset $bdsmSessionPaid>>
<<unset $bdsmReturnLocation>>
<</button>>
</div>
</div>
</div>
<<else>>
/* Failure - NPC refuses */
<<set _refuseOptions = [
"Whoa, that's... a bit too intense for me right now. Maybe some other time?",
"Thanks, but that's not something I'm up for.",
"Sorry, but I don't think I'm ready for something like that yet.",
"That's... not really my thing. Can we just hang out normally?"
]>>
<<set _refuse = _refuseOptions[random(0, _refuseOptions.length - 1)]>>
<<Chat $interactionNpc _refuse>>
/* Slight relationship penalty for failed attempt */
<<run _metrics.increaseAnger(3)>>
<div class="interaction-result-panel bdsm-result">
<div class="result-banner failure">
<span class="result-icon">❌</span>
<span class="result-text">Invitation Declined</span>
</div>
<div class="result-description"><<print _npcName>> isn't ready for this kind of experience yet.</div>
<div class="metric-changes">
<div class="metric-change negative">
<span class="metric-icon">😠</span>
<span class="metric-name">Anger:</span>
<span class="metric-value">+3</span>
</div>
</div>
<div class="chance-breakdown">
<div class="chance-header">
Success Chance: <span class="chance-value"><<print _bdsmChance>>%</span>
(Rolled: <<print _roll>>)
</div>
</div>
<div class="result-buttons">
<div class="btn">
<<button "Continue" "enhanced_interaction_system">><</button>>
</div>
</div>
</div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<set _occasionView = setup.getPlayerNpcOccasionView($player, $interactionNpc)>>
<<if $relationshipOccasionResult>>
<<ChatMessage $relationshipOccasionResult.reason>>
<<unset $relationshipOccasionResult>>
<</if>>
<div class="interaction-result-panel">
<div class="result-description"><strong>Our occasions</strong></div>
<div class="result-description">Mark a real milestone together. Agree on a format, prepare something to talk about and choose a date that suits both of you.</div>
<<if !_occasionView.occasions.length>>
<div class="result-description">There are no occasions to arrange right now. Shared milestones become occasions after 7, 30, 100 and 365 days; planning opens two days before.</div>
<</if>>
<<for _occasion range _occasionView.occasions>>
<<capture _occasion>>
<div class="interaction-result-panel" @data-occasion-status="_occasion.plan?.status ?? 'available'">
<div class="result-description"><strong><<print _occasion.label>></strong> · <<print _occasion.dueLabel>></div>
<div class="result-description"><<- _occasion.memory>></div>
<<if _occasion.canPropose>>
<<for _format range _occasionView.formats>>
<<capture _format>>
<div class="btn padding-top"><<button _format.label "enhanced_relationship_occasions">>
<<set $relationshipOccasionResult = setup.proposePlayerNpcOccasion($player, $interactionNpc, _occasion.key, _format.id)>>
<<if $relationshipOccasionResult.minutes > 0>><<SpendTime $relationshipOccasionResult.minutes>><</if>>
<</button>></div>
<</capture>>
<</for>>
<<elseif _occasion.plan?.status === "counteroffer">>
<<set _occasionCounterLine = "I would prefer " + _occasion.venueLabel.toLowerCase() + " for this occasion.">>
<<Chat $interactionNpc _occasionCounterLine>>
<div class="btn padding-top"><<button "Accept their suggestion" "enhanced_relationship_occasions">>
<<set $relationshipOccasionResult = setup.proposePlayerNpcOccasion($player, $interactionNpc, _occasion.key, _occasion.plan.venue, true)>>
<<if $relationshipOccasionResult.minutes > 0>><<SpendTime $relationshipOccasionResult.minutes>><</if>>
<</button>></div>
<<elseif _occasion.plan?.status === "ready">>
<div class="result-description">Agreed: <<print _occasion.venueLabel>>.</div>
<<for _preparation range _occasionView.preparations>>
<<capture _preparation>>
<div class="btn padding-top"><<button _preparation.label "enhanced_relationship_occasions">>
<<set $relationshipOccasionResult = setup.setPlayerNpcOccasionPreparation($player, $interactionNpc, _occasion.key, _preparation.id)>>
<</button>></div>
<</capture>>
<</for>>
<<if _occasion.plan.preparation>>
<div class="result-description">Prepared: <<print _occasion.preparationLabel>>.</div>
<div class="btn padding-top"><<button "Choose the celebration date" "enhanced_relationship_occasion_time">>
<<set $relationshipOccasionKey = _occasion.key>>
<<set $relationshipOccasionDay = 1, $relationshipOccasionHour = 18, $relationshipOccasionMinute = 0, $relationshipOccasionPayer = "auto">>
<</button>></div>
<</if>>
<<elseif _occasion.plan?.status === "scheduled">>
<div class="result-description">Arranged: <<print _occasion.venueLabel>> on <<print _occasion.meetingLabel>>. Prepared: <<print _occasion.preparationLabel>>.</div>
<div class="btn padding-top"><<button "Review or cancel the outing" "enhanced_relationship_date_cancellation">><</button>></div>
<<elseif _occasion.plan?.status === "completed">>
<div class="result-description">You celebrated this occasion together.</div>
<<elseif _occasion.plan?.status === "postponed">>
<div class="result-description">Your partner wants to rest first. Revisit the invitation after <<print _occasion.retryLabel>>.</div>
<<elseif _occasion.plan?.status === "declined">>
<div class="result-description">The invitation has been set aside. Give it a day before raising it again.</div>
<<else>>
<div class="result-description">There is no longer time to arrange this occasion.</div>
<</if>>
<<if _occasion.plan?.gift>>
<div class="result-description">Gift: <<print _occasion.giftLabel>> · <<print _occasion.plan.gift.status>>.</div>
<</if>>
<<if _occasion.canChooseGift>>
<div class="result-description">You may bring a gift you already own. It is optional and stays in your inventory until accepted.</div>
<<for _gift range _occasionView.gifts>>
<<capture _gift _occasion>>
<<set _giftLabel = "Bring " + _gift.label>>
<div class="btn padding-top"><<button _giftLabel "enhanced_relationship_occasions">>
<<set $relationshipOccasionResult = setup.setPlayerNpcOccasionGift($player, $interactionNpc, _occasion.key, _gift.id)>>
<</button>></div>
<</capture>>
<</for>>
<<if !_occasionView.gifts.length>>
<div class="result-description">You have no suitable gift in your inventory.</div>
<</if>>
<<if _occasion.plan?.gift>>
<div class="btn padding-top"><<button "Celebrate without a gift" "enhanced_relationship_occasions">>
<<set $relationshipOccasionResult = setup.setPlayerNpcOccasionGift($player, $interactionNpc, _occasion.key, null)>>
<</button>></div>
<</if>>
<</if>>
<<if ["ready", "counteroffer"].includes(_occasion.plan?.status)>>
<div class="btn padding-top"><<button "Leave this invitation for another day" "enhanced_relationship_occasions">>
<<set $relationshipOccasionResult = setup.setAsidePlayerNpcOccasion($player, $interactionNpc, _occasion.key)>>
<</button>></div>
<</if>>
</div>
<</capture>>
<</for>>
<<for _celebrated range _occasionView.completed>>
<div class="result-description">Celebrated: <<print _celebrated.label>> · <<print _celebrated.dateLabel>>.</div>
<</for>>
</div>
<div class="btn padding-top"><<button "Our history" "enhanced_relationship_history">><</button>></div>
<div class="btn padding-top"><<button "Back" "enhanced_interaction_system">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<div class="interaction-choice">
<<InteractionChoiceHeader "Something worth celebrating" "Save a little time for it" "Pick a day, set a time and work out the details together." "enhanced_relationship_occasions" "Back to occasions">>
<<set _occasion = setup.getPlayerNpcOccasionView($player, $interactionNpc).occasions.find(entry => entry.key === $relationshipOccasionKey)>>
<<if _occasion?.plan?.status === "ready" && _occasion.plan.preparation>>
/* Offer only calendar days inside the occasion window [due, due + 7 days]. */
<<set _occasionTodayStart = setup.playerNpcDateCalendarMinute(0, 0, 0)>>
<<set _occasionFirstDay = Math.max(0, Math.floor((_occasion.dueMinute - _occasionTodayStart) / 1440))>>
<<set _occasionLastDay = Math.min(7, Math.floor((_occasion.dueMinute + 7 * 1440 - _occasionTodayStart) / 1440))>>
<<set _occasionDays = []>>
<<for _occasionDayOffset = _occasionFirstDay; _occasionDayOffset <= _occasionLastDay; _occasionDayOffset++>><<run _occasionDays.push(_occasionDayOffset)>><</for>>
<<if !_occasionDays.includes($relationshipOccasionDay)>><<set $relationshipOccasionDay = _occasionDays[0] ?? 0>><</if>>
<<set $relationshipOccasionHour = $relationshipOccasionHour ?? 18>>
<<set $relationshipOccasionMinute = $relationshipOccasionMinute ?? 0>>
<<set $relationshipOccasionPayer = $relationshipOccasionPayer ?? "auto">>
<div class="interaction-choice__summary"><div><span class="interaction-choice__eyebrow">The occasion</span><strong><<print _occasion.label>> · <<print _occasion.venueLabel>></strong></div></div>
<p class="interaction-choice__note">Choose a time on or within seven days after <<print _occasion.dueLabel>>.</p>
<div class="interaction-choice__calendar">
<<InteractionChoiceCalendar "$relationshipOccasion" `[8, 10, 12, 14, 16, 18, 20, 22]` _occasionDays>>
</div>
<<InteractionChoicePayment "$relationshipOccasionPayer">>
<div class="interaction-choice__submit"><<button "Arrange the celebration" "enhanced_relationship_occasions">>
<<set $relationshipOccasionResult = setup.schedulePlayerNpcOccasion($player, $interactionNpc, $relationshipOccasionKey, setup.playerNpcDateCalendarMinute($relationshipOccasionDay, $relationshipOccasionHour, $relationshipOccasionMinute), $relationshipOccasionPayer)>>
<</button>></div>
<<else>>
<<ChatMessage "Return to the invitation before arranging a date.">>
<</if>>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _meet = setup.playerNpcMeetings.forNpc($interactionNpc)>>
<<set _venueOptions = setup.playerNpcMeetings.venueOptions()>>
<<if !$meetDraft || !Object.values(_venueOptions).includes($meetDraft.venue)>>
<<set $meetDraft = {venue: Object.values(_venueOptions)[0], day: 1, slot: 1080}>>
<</if>>
<<ShowNpcIcon $interactionNpc>>
<div class="money-panel meet-panel">
<h3 class="money-panel__title">📅 Meet up with <<= $interactionNpc.info.firstName>></h3>
<<if _meet>>
<div class="money-panel__state">
<p>You agreed to meet <b><<= _meet.placeAt>></b> <<= _meet.when>>.</p>
<p><<= _meet.statusLabel>>.</p>
</div>
<<if _meet.status != "met">>
<div class="money-panel__buttons">
<div class="btn"><<button "Call it off" "enhanced_interaction_meet_do">><<set $meetResult = setup.playerNpcMeetings.cancel(setup.playerNpcMeetings.forNpc($interactionNpc).id)>><</button>></div>
</div>
<div class="money-panel__hint">Calling it off two hours ahead is fine. Any later and they will mind.</div>
<</if>>
<<else>>
<div class="money-panel__group">
<div class="money-panel__label">Where</div>
<<listbox "$meetDraft.venue" autoselect>><<optionsfrom _venueOptions>><</listbox>>
</div>
<div class="money-panel__group">
<div class="money-panel__label">When</div>
<<listbox "$meetDraft.day" autoselect>><<optionsfrom setup.playerNpcMeetings.dayOptions()>><</listbox>>
<<listbox "$meetDraft.slot" autoselect>><<optionsfrom setup.playerNpcMeetings.timeOptions()>><</listbox>>
</div>
<div class="money-panel__buttons">
<div class="btn"><<button "Ask" "enhanced_interaction_meet_do">><<set $meetResult = setup.playerNpcMeetings.propose($interactionNpc, $meetDraft.venue, $meetDraft.day, $meetDraft.slot)>><</button>></div>
</div>
<div class="money-panel__hint">They check work, class, opening hours and how long it takes both of you to get there. If they agree, they will really come and wait for you.</div>
<</if>>
<div class="padding-top">
<div class="btn"><<button "Back" "enhanced_interaction_system">><<unset $meetResult>><</button>></div>
</div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
/* The decision ran in the button handler; this page only shows it, so a refresh or Back never repeats it. */
<<set _r = $meetResult>>
<<if !_r>><<goto "enhanced_interaction_meet">><</if>>
<<ShowNpcIcon $interactionNpc>>
<<if _r.npcLine>>
<<Chat $interactionNpc _r.npcLine>>
<</if>>
<<ChatMessage _r.reason>>
<<if _r.outcome == "counter">>
<<set _label = "Sure: " + _r.counter.label>>
<div class="padding-top">
<div class="btn"><<button _label "enhanced_interaction_meet_do">><<set $meetResult = setup.playerNpcMeetings.acceptCounter($interactionNpc, $meetResult.counter.location, $meetResult.counter.minute)>><</button>></div>
</div>
<</if>>
<div class="padding-top">
<div class="btn"><<button "Meet up" "enhanced_interaction_meet">><<unset $meetResult>><</button>></div>
<div class="btn"><<button "Back" "enhanced_interaction_system">><<unset $meetResult>><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _m = setup.npcMoney.view($player, $interactionNpc)>>
<<ShowNpcIcon $interactionNpc>>
<div class="money-panel">
<h3 class="money-panel__title">💵 Money with <<= $interactionNpc.info.firstName>></h3>
<div class="money-panel__state">
<<if _m.youOwe > 0>>
<p>You owe them <b>$<<= _m.youOwe>></b><<if _m.overdue>>, and it is overdue<</if>>.</p>
<</if>>
<<if _m.theyOwe > 0>>
<p>They owe you <b>$<<= _m.theyOwe>></b>.</p>
<</if>>
<p>You have $<<= _m.playerMoney>> on you.</p>
</div>
<div class="money-panel__group">
<div class="money-panel__label">🎁 Give money</div>
<div class="money-panel__buttons">
<<for _amt range _m.amounts>>
<<capture _amt>>
<<set _label = "Give $" + _amt>>
<<if _m.playerMoney >= _amt>>
<div class="btn"><<button _label "enhanced_interaction_money_do">><<set $moneyResult = setup.npcMoney.run("give", $player, $interactionNpc, _amt)>><</button>></div>
<<else>>
<div class="btn non-interacting"><<button _label>><</button>></div>
<</if>>
<</capture>>
<</for>>
</div>
</div>
<div class="money-panel__group">
<div class="money-panel__label">🤝 Ask for a loan</div>
<<if _m.canBorrow>>
<div class="money-panel__buttons">
<<for _amt range _m.amounts>>
<<capture _amt>>
<<set _label = "Borrow $" + _amt>>
<div class="btn"><<button _label "enhanced_interaction_money_do">><<set $moneyResult = setup.npcMoney.run("borrow", $player, $interactionNpc, _amt)>><</button>></div>
<</capture>>
<</for>>
</div>
<div class="money-panel__hint">Friends lend at most $200. Pay it back within a week.</div>
<<else>>
<div class="money-panel__hint"><<= _m.borrowReason>></div>
<</if>>
</div>
<div class="money-panel__group">
<div class="money-panel__label">💸 Lend them money</div>
<div class="money-panel__buttons">
<<for _amt range _m.amounts>>
<<capture _amt>>
<<set _label = "Lend $" + _amt>>
<<if _m.playerMoney >= _amt && _m.theyOwe == 0>>
<div class="btn"><<button _label "enhanced_interaction_money_do">><<set $moneyResult = setup.npcMoney.run("lend", $player, $interactionNpc, _amt)>><</button>></div>
<<else>>
<div class="btn non-interacting"><<button _label>><</button>></div>
<</if>>
<</capture>>
<</for>>
</div>
</div>
<<if _m.youOwe > 0>>
<div class="money-panel__group">
<div class="money-panel__label">↩️ Pay them back</div>
<div class="money-panel__buttons">
<<set _label = "Pay back all $" + _m.youOwe>>
<<if _m.playerMoney >= _m.youOwe>>
<div class="btn"><<button _label "enhanced_interaction_money_do">><<set $moneyResult = setup.npcMoney.run("repay", $player, $interactionNpc, _m.youOwe)>><</button>></div>
<<else>>
<div class="btn non-interacting"><<button _label>><</button>></div>
<</if>>
<<for _amt range [20, 50]>>
<<capture _amt>>
<<set _label = "Pay $" + _amt>>
<<if _amt < _m.youOwe && _m.playerMoney >= _amt>>
<div class="btn"><<button _label "enhanced_interaction_money_do">><<set $moneyResult = setup.npcMoney.run("repay", $player, $interactionNpc, _amt)>><</button>></div>
<</if>>
<</capture>>
<</for>>
</div>
</div>
<</if>>
<<if _m.theyOwe > 0>>
<div class="money-panel__group">
<div class="money-panel__label">📒 What they owe you</div>
<div class="money-panel__buttons">
<div class="btn"><<button "Ask for your money back" "enhanced_interaction_money_do">><<set $moneyResult = setup.npcMoney.run("askBack", $player, $interactionNpc, 0)>><</button>></div>
<div class="btn"><<button "Forgive the debt" "enhanced_interaction_money_do">><<set $moneyResult = setup.npcMoney.run("forgive", $player, $interactionNpc, 0)>><</button>></div>
</div>
</div>
<</if>>
<div class="padding-top">
<div class="btn"><<button "Back" "enhanced_interaction_system">><</button>></div>
</div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
/* The action ran in the button handler; this page only shows it, so a refresh or Back never repeats it. */
<<set _r = $moneyResult>>
<<if !_r>><<goto "enhanced_interaction_money">><</if>>
<<ShowNpcIcon $interactionNpc>>
<<if _r.npcLine>>
<<Chat $interactionNpc _r.npcLine>>
<</if>>
<<ChatMessage _r.message>>
<<if _r.outcome == "counter">>
<<set _label = "Borrow $" + _r.amount + " instead">>
<div class="padding-top">
<div class="btn"><<button _label "enhanced_interaction_money_do">><<set $moneyResult = setup.npcMoney.run("borrow", $player, $interactionNpc, _r.amount)>><</button>></div>
</div>
<</if>>
<div class="padding-top">
<div class="btn"><<button "Money" "enhanced_interaction_money">><</button>></div>
<div class="btn"><<button "Back" "enhanced_interaction_system">><<unset $moneyResult>><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<set _curLoc = passage()>>
<<if $source != "SpikeDrink_BarEvent" && $source != "SpikeDrink_NightClub" && $source != "ForceGiveItem">>
<<include "Filter">>
<</if>>
<<if $player.inventory.items.size > 0>>
<div class="item-shop-container">
<<for _item range $player.inventory.items>>
/* Tools and weapons are not givable - TryGiveItem has no branch for
them (and the type converter used to throw on Consumables). */
<<if $source != "SpikeDrink_BarEvent" && $source != "SpikeDrink_NightClub" && $source != "ForceGiveItem">>
<<if _item.getItemStringByType(_item.type) == "Consumables" || _item.getItemStringByType(_item.type) == "Weapon" || _item.getItemStringByType(_item.type) == "Ammunition">>
<<continue>>
<</if>>
<</if>>
<<if $filterType != "All">>
<<if _item.type != _item.getItemTypeByString($filterType)>>
<<continue>>
<</if>>
<</if>>
<<capture _item>>
<div class="shop-item">
__<<link '<h3 class="item-title"><<print _item.name>></h3>'>>
<<run Dialog.create(_item.name)>>
<<run Dialog.wiki(_item.getImg())>>
<<run Dialog.open();>>
<</link>>__
<p class="item-quantity">Quantity: <<print _item.quantity>></p>
<<if $source == "SpikeDrink_BarEvent">>
<div class="btn">
<<button "To spike a drink" "SpikeDrink_InviteToBar">>
<<run $filterType = _item.getItemStringByType(_item.type)>>
<<set $item = _item>>
<<unset $source>>
<</button>></div>
<<elseif $source == "SpikeDrink_NightClub">>
<div class="btn">
<<button "Give" "SpikeDrink_NightClub">>
<<run $filterType = _item.getItemStringByType(_item.type)>>
<<set $item = _item>>
<<unset $source>>
<</button>></div>
<<elseif $source == "ForceGiveItem">>
<div class="btn">
<<button "Give" $player.info.currentLocation>>
<<run $filterType = _item.getItemStringByType(_item.type)>>
<<set $item = _item>>
<<if $player.inventory.getItemByName($item.name)>>
<<run $interactionNpc.useItem($item, $player)>>
<<run $player.inventory.removeItem($item.name, 1)>>
<</if>>
<<unset $source $filterType $item>>
<<LeaveInteractionSettings>>
<</button>></div>
<<else>>
<div class="btn">
<<button "Give" "TryGiveItem">>
<<run $filterType = _item.getItemStringByType(_item.type)>>
<<set $item = _item>>
<</button>></div>
<</if>>
</div>
<</capture>>
<</for>>
</div>
<</if>>
<div class="padding-top">
<<if $source == "SpikeDrink_BarEvent" || $source == "ForceGiveItem">>
<<BackButton "<<set $canShowStatsBtn = true>> <<unset $interactionNpc $interactionType $filterType $source>> <<set $gameSettings.allowSaves = true>>">>
<<elseif $source == "SpikeDrink_NightClub">>
<div class="btn"><<button "Back" "NightClub_DrinkGame_ApproachToNPC">>
<<unset $filterType>>
<</button>></div>
<<else>>
<div class="btn"><<button "Back" "enhanced_interaction_system">>
<<unset $filterType>>
<</button>></div>
<</if>>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<set _itemUsed = false>>
<<if $filterType == "Drug">>
<<if $interactionNpc.dailyEvents.getOrRegisterEvent($interactionNpc.info.id, "GiveDrugs", 0) < 5>>
<<run $interactionNpc.dailyEvents.registerEvent($interactionNpc.info.id, "GiveDrugs", 1)>>
<<if ($interactionNpc.attributes.dominance.value < 5
&&
($player.getRelationship($interactionNpc.info.id, false)?.metrics?.friendship ?? 0) > 90)
|| ($player.characterEvents.isEventRegistered($player.info.id, "Became A Pimp") == true && $interactionNpc.info.characterWork == "Hooker")>>
<<Chat $interactionNpc "All right. I'll take it.">>
<<set _itemUsed = true>>
<<else>>
<<Chat $interactionNpc "I don't want to take it.">>
<</if>>
<<else>>
<<Chat $interactionNpc "I've taken enough today.">>
<</if>>
<<elseif $filterType == "Gift">>
<<if $interactionNpc.dailyEvents.getOrRegisterEvent($interactionNpc.info.id, "GotGift" + $item.name, 0) < 1>>
<<run $interactionNpc.dailyEvents.registerEvent($interactionNpc.info.id, "GotGift" + $item.name, 1)>>
<<Chat $interactionNpc "Thank you.">>
<<set _itemUsed = true>>
<<else>>
<<Chat $interactionNpc "You already gave it to me today.">>
<</if>>
<<elseif $filterType == "Clothing" || $filterType == "Food">>
<<if $interactionNpc.info.clothesPreference == $item.additionalDetails.gender || ($player.characterEvents.isEventRegistered($player.info.id, "Became A Pimp") == true && $interactionNpc.info.characterWork == "Hooker")>>
<<Chat $interactionNpc "Thank you.">>
<<run $interactionNpc.inventory.addItem($item.copy(1))>>
<<run $player.inventory.removeItem($item.name, 1)>>
<<else>>
<<set _clothItem = convertToClothingItem($item)>>
<<set _msg = "I don't wear " + $item.additionalDetails.gender + "'s clothing.">>
<<Chat $interactionNpc _msg>>
<</if>>
<</if>>
<<if _itemUsed == true>>
<<run $interactionNpc.useItem($item, $player)>>
<<run $player.inventory.removeItem($item.name, 1)>>
<</if>>
<div class="padding-top">
<div class="btn"><<button "Back" "GiveItems">><<unset $item>><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<set _gossipTarget = $interactionNpc>>
<<set _witnesses = (typeof window.getWitnessesAboutNpc === 'function')
? window.getWitnessesAboutNpc(_gossipTarget.info.id, _gossipTarget.info.id)
: []>>
<<if !_witnesses || _witnesses.length === 0>>
<<set _noGossipMsg = 'You don\'t have anything fresh to share about ' + _gossipTarget.info.firstName + ' right now.'>>
<<ChatMessage _noGossipMsg>>
<div class="padding-top">
<div class="btn"><<button "Back" "enhanced_interaction_system">><</button>></div>
</div>
<<else>>
<<ChatMessage "Pick something you saw to bring up.">>
<div class="btn-container padding-top">
<<for _gi = 0; _gi < _witnesses.length; _gi++>>
<<set _w = _witnesses[_gi]>>
<<set _otherId = (_w.npc1 === _gossipTarget.info.id) ? _w.npc2 : _w.npc1>>
<<set _otherChar = window.findById ? window.findById(_otherId) : null>>
<<if _otherChar>>
<<set _meta = (typeof window.describeNpcPair === 'function')
? window.describeNpcPair(_otherChar, _gossipTarget, _w.type, 'unrelated')
: 'Something with ' + _otherChar.info.firstName + '.'>>
<<set _btnText = '"I saw you with ' + _otherChar.info.firstName + '..." (' + _w.type + ')'>>
<<capture _w _otherChar _meta>>
<div class="btn"><<button _btnText "GossipAboutPair_Resolve">>
<<set $gossipWitnessSnapshot = _w>>
<<set $gossipOtherChar = _otherChar>>
<<set $gossipFlavorLine = _meta>>
<</button>></div>
<</capture>>
<</if>>
<</for>>
</div>
<div class="padding-top">
<div class="btn"><<button "Back" "enhanced_interaction_system">><</button>></div>
</div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<set _w = $gossipWitnessSnapshot>>
<<set _other = $gossipOtherChar>>
<<set _flavor = $gossipFlavorLine>>
<<set _target = $interactionNpc>>
<<if !_w || !_other>>
<div class="btn padding-top"><<button "Back" "enhanced_interaction_system">><</button>></div>
<<else>>
/* Effect classification matching narration buckets */
<<set _isAdult = (typeof window.isAdultInteraction === 'function') ? window.isAdultInteraction(_w.type) : false>>
<<set _isRom = (typeof window.isRomanceInteraction === 'function') ? window.isRomanceInteraction(_w.type) : false>>
<<set _isCon = (typeof window.isConflictInteraction === 'function') ? window.isConflictInteraction(_w.type) : false>>
<<set _targetLoveForOther = _target.getRelationship(_other.info.id, false)?.metrics?.love ?? 0>>
<<if _isAdult || _isRom>>
/* Romantic / sex witnessed */
<<if _targetLoveForOther > 30>>
/* Jealousy seed - they cared about the other */
<<set _msg = _target.info.firstName + " goes still. \"" + _other.info.firstName + " did what?\" - Whatever ground you just shifted, you shifted hard.">>
<<ChatMessage _msg>>
<<set _delta = { friendship: 1, love: -3, fear: 2, anger: 4 }>>
<<run $player.setRelationship(_target.info.id, _delta, true)>>
<<run _target.setRelationship($player.info.id, _delta, true)>>
/* The "other" NPC takes a bigger hit from the target */
<<set _otherDelta = { friendship: -3, love: -5, anger: 5 }>>
<<run _target.setRelationship(_other.info.id, _otherDelta, true)>>
<<else>>
/* Just gossip - friendship bond */
<<set _msg = _target.info.firstName + " raises an eyebrow at you. \"Tell me everything.\"">>
<<ChatMessage _msg>>
<<set _delta = { friendship: 2 }>>
<<run $player.setRelationship(_target.info.id, _delta, true)>>
<<run _target.setRelationship($player.info.id, _delta, true)>>
<</if>>
<<elseif _isCon>>
/* Conflict witnessed - commiseration */
<<set _msg = _target.info.firstName + " sighs. \"Yeah, that fight was bad. Thanks for not pretending you didn\'t see.\"">>
<<ChatMessage _msg>>
<<set _delta = { friendship: 1 }>>
<<run $player.setRelationship(_target.info.id, _delta, true)>>
<<run _target.setRelationship($player.info.id, _delta, true)>>
<<else>>
/* Social / funny moment - light bond */
<<set _msg = _target.info.firstName + " laughs. \"You saw that? Stop watching me.\"">>
<<ChatMessage _msg>>
<<set _delta = { friendship: 2 }>>
<<run $player.setRelationship(_target.info.id, _delta, true)>>
<<run _target.setRelationship($player.info.id, _delta, true)>>
<</if>>
/* Mark consumed for this target so we don't reuse */
<<if typeof window.markWitnessGossiped === 'function'>>
<<run window.markWitnessGossiped($gossipWitnessSnapshot, _target.info.id)>>
<</if>>
<<SpendTime 5>>
<div class="btn padding-top"><<button "Back" "enhanced_interaction_system">>
<<unset $gossipWitnessSnapshot $gossipOtherChar $gossipFlavorLine>>
<</button>></div>
<</if>>
<</nobr>><<nobr>>
<<if $player.characterEvents.isEventRegistered($player.info.id, "Is a pimp's whore")>>
<<include "Pimp_PimpsWhoreEvent">>
<<set _finish = true>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _intA = $talkPairNPC1>>
<<set _intB = $talkPairNPC2>>
<<if !_intA || !_intB>>
<<unset $talkPairNPC1 $talkPairNPC2 $talkPairIndexNPC1 $talkPairIndexNPC2 $talkPairInteractionType $talkPairLocation $observePhase>>
<<goto $player.info.currentLocation>>
<</if>>
/* Remove pair from current NpcInteractions list */
<<if typeof window.removeNpcInteractionByIds === 'function'>>
<<run window.removeNpcInteractionByIds(_intA.info.id, _intB.info.id)>>
<</if>>
/* Penalty payload - setRelationship reads .friendship / .anger off the object directly */
<<set _intPenalty = { friendship: -3, love: 0, sex: 0, fear: 0, anger: 2 }>>
<<run $player.setRelationship(_intA.info.id, _intPenalty, true)>>
<<run $player.setRelationship(_intB.info.id, _intPenalty, true)>>
<<run _intA.setRelationship($player.info.id, _intPenalty, true)>>
<<run _intB.setRelationship($player.info.id, _intPenalty, true)>>
<<set _cm = _intA.info.firstName + ' and ' + _intB.info.firstName + ' freeze when you step in. You broke whatever that was. Neither of them is thanking you.'>>
<<ChatMessage _cm>>
<div class="btn-container">
<div class="btn"><<button "Back to location" $player.info.currentLocation>>
<<unset $talkPairNPC1 $talkPairNPC2 $talkPairIndexNPC1 $talkPairIndexNPC2 $talkPairInteractionType $talkPairLocation $observePhase>>
<</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _intA = $talkPairNPC1>>
<<set _intB = $talkPairNPC2>>
<<set _intType = $talkPairInteractionType>>
<<set _intAction = $intervenePairAction ?? 'defuse'>>
<<set _intLocation = _intA ? (_intA.info.currentLocation ?? '') : ''>>
<<if !_intA || !_intB>>
<<unset $talkPairNPC1 $talkPairNPC2 $talkPairIndexNPC1 $talkPairIndexNPC2 $talkPairInteractionType $talkPairLocation $intervenePairAction $observePhase>>
<<goto $player.info.currentLocation>>
<</if>>
/* Witness recording (Phase 4) - record the pair the player chose to engage with */
<<if typeof window.recordWitnessedInteraction === 'function'>>
<<run window.recordWitnessedInteraction(_intA.info.id, _intB.info.id, _intType, _intLocation)>>
<</if>>
<<switch _intAction>>
/* ───── Defuse a conflict ───── */
<<case "defuse">>
<<set _avgAnger = ((_intA.getRelationship(_intB.info.id, false)?.metrics?.anger ?? 0) + (_intB.getRelationship(_intA.info.id, false)?.metrics?.anger ?? 0)) / 2>>
<<set _playerDom = $player.attributes.dominance.value ?? 0>>
<<set _check = (_playerDom * 10) - _avgAnger + Random(0, 30, false)>>
<<if _check >= 30>>
<<set _msg = "You step between " + _intA.info.firstName + " and " + _intB.info.firstName + " and lower the temperature. Both of them step back, breathing easier.">>
<<ChatMessage _msg>>
<<set _good = { friendship: 3, anger: -3 }>>
<<run $player.setRelationship(_intA.info.id, _good, true)>>
<<run $player.setRelationship(_intB.info.id, _good, true)>>
<<run _intA.setRelationship($player.info.id, _good, true)>>
<<run _intB.setRelationship($player.info.id, _good, true)>>
<<set _calm = { friendship: 0, anger: -15 }>>
<<run _intA.setRelationship(_intB.info.id, _calm, true)>>
<<run _intB.setRelationship(_intA.info.id, _calm, true)>>
<<if typeof window.removeNpcInteractionByIds === 'function'>>
<<run window.removeNpcInteractionByIds(_intA.info.id, _intB.info.id)>>
<</if>>
<<else>>
<<set _msg = _intA.info.firstName + " and " + _intB.info.firstName + " both round on you. Now they're mad at the same person - you.">>
<<ChatMessage _msg>>
<<set _bad = { friendship: -2, anger: 5 }>>
<<run $player.setRelationship(_intA.info.id, _bad, true)>>
<<run $player.setRelationship(_intB.info.id, _bad, true)>>
<<run _intA.setRelationship($player.info.id, _bad, true)>>
<<run _intB.setRelationship($player.info.id, _bad, true)>>
<</if>>
/* ───── Side with NPC1 ───── */
<<case "side_with_a">>
<<set _msg = "You back " + _intA.info.firstName + ". " + _intB.info.firstName + " notices.">>
<<ChatMessage _msg>>
<<set _withA = { friendship: 3, love: 1 }>>
<<set _againstB = { friendship: -3, love: -2, anger: 2 }>>
<<run $player.setRelationship(_intA.info.id, _withA, true)>>
<<run _intA.setRelationship($player.info.id, _withA, true)>>
<<run $player.setRelationship(_intB.info.id, _againstB, true)>>
<<run _intB.setRelationship($player.info.id, _againstB, true)>>
<<if typeof window.removeNpcInteractionByIds === 'function'>>
<<run window.removeNpcInteractionByIds(_intA.info.id, _intB.info.id)>>
<</if>>
/* ───── Side with NPC2 ───── */
<<case "side_with_b">>
<<set _msg = "You back " + _intB.info.firstName + ". " + _intA.info.firstName + " notices.">>
<<ChatMessage _msg>>
<<set _withB = { friendship: 3, love: 1 }>>
<<set _againstA = { friendship: -3, love: -2, anger: 2 }>>
<<run $player.setRelationship(_intB.info.id, _withB, true)>>
<<run _intB.setRelationship($player.info.id, _withB, true)>>
<<run $player.setRelationship(_intA.info.id, _againstA, true)>>
<<run _intA.setRelationship($player.info.id, _againstA, true)>>
<<if typeof window.removeNpcInteractionByIds === 'function'>>
<<run window.removeNpcInteractionByIds(_intA.info.id, _intB.info.id)>>
<</if>>
/* ───── Cheer on a fight ───── */
<<case "cheer_on">>
<<set _msg = "You don't break it up. You watch - and they hear you cheering. Whatever this was just got worse.">>
<<ChatMessage _msg>>
<<if $player.attributes && $player.attributes.corruption && typeof $player.attributes.corruption.increase === 'function'>>
<<run $player.attributes.corruption.increase(1)>>
<</if>>
<<set _hotter = { friendship: 0, anger: 5 }>>
<<run _intA.setRelationship(_intB.info.id, _hotter, true)>>
<<run _intB.setRelationship(_intA.info.id, _hotter, true)>>
<<set _player_disrespect = { friendship: -1, anger: 1 }>>
<<run _intA.setRelationship($player.info.id, _player_disrespect, true)>>
<<run _intB.setRelationship($player.info.id, _player_disrespect, true)>>
/* ───── Join in (social/dance/share_drink etc.) ───── */
<<case "join_in">>
<<set _msg = "You slide in beside " + _intA.info.firstName + " and " + _intB.info.firstName + ". They make room. Whatever they were doing, you're part of it now.">>
<<ChatMessage _msg>>
<<set _joinDelta = { friendship: 2, love: 0 }>>
<<run $player.setRelationship(_intA.info.id, _joinDelta, true)>>
<<run $player.setRelationship(_intB.info.id, _joinDelta, true)>>
<<run _intA.setRelationship($player.info.id, _joinDelta, true)>>
<<run _intB.setRelationship($player.info.id, _joinDelta, true)>>
<<if $player.status && $player.status.horny && typeof $player.status.horny.increase === 'function'>>
<<set _isRom = (typeof window.isRomanceInteraction === 'function') ? window.isRomanceInteraction(_intType) : false>>
<<if _isRom>>
<<run $player.status.horny.increase(10)>>
<</if>>
<</if>>
<<SpendTime 15>>
<<if typeof window.removeNpcInteractionByIds === 'function'>>
<<run window.removeNpcInteractionByIds(_intA.info.id, _intB.info.id)>>
<</if>>
/* ───── Default: just close out cleanly ───── */
<<default>>
<<ChatMessage 'You decide not to get involved.'>>
<</switch>>
<div class="btn-container padding-top">
<div class="btn"><<button "Back to location" $player.info.currentLocation>>
<<unset $talkPairNPC1 $talkPairNPC2 $talkPairIndexNPC1 $talkPairIndexNPC2 $talkPairInteractionType $talkPairLocation $intervenePairAction $observePhase>>
<</button>></div>
</div>
<</nobr>><<nobr>>
<div class="btn"><<button "Attack">>
<<set _battleSetControls = {attack: true, seduce: false, items: true, actions: true}>>
<<StartFight $player $interactionNpc _battleSetControls "Etheriant_FinishFight_Win" "Etheriant_FinishFight_Lose">>
<</button>></div>
<div class="btn"><<button "Leave" "NudeCheck">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<Chat $player 'It\'s done. Now I need to report back to Damian.'>>
<<set _targetName = $interactionNpc.info.firstName + " " + $interactionNpc.info.secondName + " must be eliminated.">>
<<run completeTaskByQuestID("damian_contract", _targetName)>>
/* <<run console.log("Quest", _targetName)>> */
<<DeleteCharacter $interactionNpc>>
<div class="padding-top">
<div class="btn"><<button "Continue" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _phrase1 = 'Pain shoots through your body as you collapse to the ground, your vision blurring. The Etheriant looms over you,' + $interactionNpc.pronounHisHer() + ' eyes glowing with an eerie, unnatural light. A wicked grin spreads across ' + $interactionNpc.pronounHisHer() + ' face as ' + $interactionNpc.pronoun().toLowerCase() + ' kneels beside you.'>>
<<ChatMessage _phrase1>>
<<Chat $interactionNpc 'You put up a fight, I’ll give you that. But it wasn’t enough.'>>
<<set _phrase2 = $interactionNpc.pronoun() + ' extends a hand, and a surge of Etherium pulses through your veins. A burning sensation spreads through your body, twisting and warping something deep inside you.'>>
<<ChatMessage _phrase2>>
<<Chat $interactionNpc 'You’ll feel it soon… the change. The moment when you stop being who you are. When Etherium becomes a part of you.'>>
<<set _phrase3 = $interactionNpc.pronoun() + ' stands, looking down at you with amusement.'>>
<<ChatMessage _phrase3>>
<<Chat $interactionNpc 'Enjoy your last moments of normalcy. You won’t be the same next time we meet.'>>
<<set _phrase4 = 'With that, ' + $interactionNpc.pronoun().toLowerCase() + ' turns and disappears into the shadows, leaving you writhing on the ground, the unnatural energy coursing through your veins, changing you from within.'>>
<<ChatMessage _phrase4>>
<<run $player.characterEvents.registerEvent($player.info.id, "InfectedByEfirium", 1)>>
<div class="padding-top">
<div class="btn"><<button "Continue" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
</div>
<</nobr>><<nobr>>
<<if $playerlock == true>>
<div class="btn non-interacting"><<button "Sex">><</button>></div>
<<else>>
<div class="btn"><<button "Sex" "Sex">><<set $sexType = "Rape">><</button>></div>
<</if>>
<div class="btn"><<button "Release the servant" 'ReleaseServant'>><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<run $interactionNpc.characterEvents.unregisterEvent($player.info.id, "isServant", 1)>>
<<ChatMessage 'You weaken your control over your servant.'>>
<div class="btn padding-top"><<button "Continue" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
<</nobr>><<nobr>>
<<if $player.characterEvents.isEventRegistered($player.info.id, "Became A Pimp") == false>>
<div class="btn"><<button "Ask questions" "AskQuestions_Pimp">><</button>></div>
<<else>>
<div class="btn"><<button "Persuade" "Persuade">><<set $persuadeType = "Persuade">><</button>></div>
<div class="btn"><<button "Give Item" "GiveItems">><<set $filterType = "All">><<unset $source>><</button>></div>
<</if>>
<</nobr>><<nobr>>
<<run _contentAllow = CheckContentFilter($interactionNpc)>>
<<if (_contentAllow == true)>>
<div class="btn"><<button "Offer yourself" "OfferYourselfToSecurity_Pimp">><</button>></div>
<<else>>
<div class="btn non-interacting" id="offer-yourself-btn"><<button "Offer yourself">><</button>></div>
<<done>>
<<run addHoverTooltip('offer-yourself-btn', 'Disabled by content filter')>>
<</done>>
<</if>>
<div class="btn"><<button "Talk" "PimpSecurityTalk_Pimp">><</button>></div>
<div class="btn"><<button "Leave" "NudeCheck">><</button>></div>
<</nobr>><<nobr>>
<<if $player.money >= 500 && ($player.dailyEvents.isEventRegistered($player.info.id, "RemoveChastityCage") || $player.genitalia() == "Vagina")>>
<div class="btn"><<button "Sex (500)" "Sex">><<set $sexType = "hooker">><<set $player.money -= 500>><</button>></div>
<<elseif $player.money >= 500 && $player.dailyEvents.isEventRegistered($player.info.id, "RemoveChastityCage") == false>>
<div class="btn"><<button "Sex (500)" "ChastityCageLock_Pimp">><</button>></div>
<<else>>
<div class="btn non-interacting"><<button "Sex (500)">><</button>></div>
<</if>>
<div class="btn"><<button "Leave" "NudeCheck">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<DrawImage $interactionNpc.getPhotoImage()>>
<<Chat $interactionNpc 'Hey, you walking around here naked has got me all worked up. Now you’re going to have to do something about it.'>>
<div class="btn"><<button "Agree (Sex)" "PassiveSex">><<set $sexType = "hookerWork">><<set $aggressiveFuck = true>><</button>></div>
<div class="btn padding-top"><<button "Refuse (Fight)">>
<<set _battleSetControls = {attack: true, seduce: true, items: true, actions: true}>>
<<StartFight $player $interactionNpc _battleSetControls undefined undefined>>
<</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ResolveMadDogDebtTaskName>>
<<set _madDogImg = "Media\\Characters\\QuestChars\\MadDog\\MadDog.jpg">>
<<DrawImg _madDogImg>>
<<if getQuestState("mad_dog_quest1") == "failed">>
<<Chat $interactionNpc 'You missed the deadline and embarrassed me. I can give you one new debtor, but this time you finish the job.'>>
<div class="btn padding-top"><<button "Ask for another chance" "MadDog_Quest1_Retry">><</button>></div>
<</if>>
<<if getQuestState("mad_dog_quest1") == "active" && _madDogDebtTaskState == "completed" && getTaskState("mad_dog_quest1", "Return to Mad Dog") != "completed">>
<<set _debtText = "Hand over the money ($" + $debtAmount + ")">>
<<if $player.money >= $debtAmount>>
<div class="btn padding-top"><<button _debtText "MadDog_Interaction_HandOvereMoney">><</button>></div>
<<else>>
<div class="btn non-interacting padding-top"><<button _debtText>><</button>></div>
<</if>>
<</if>>
<<if getQuestState("robert_quest_1") == "active" && getTaskState("robert_quest_1", "Get the serum") != 'completed' && $player.characterEvents.isEventRegistered($player.info.id, "TalkingWithMad_Robert") == false>>
<<LockSettings>>
<<goto "MadDog_Robert_Quest_01_Serum_Choose">>
<<elseif getQuestState("robert_quest_1") == "active" && getTaskState("robert_quest_1", "Get the serum") != 'completed' && $player.characterEvents.isEventRegistered($player.info.id, "TalkingWithMad_Robert") == true>>
<div class="btn padding-top"><<button "Buy Serum" "MadDog_Robert_Quest_01_Serum_Buy">><<LockSettings>><</button>></div>
<</if>>
<div class="btn padding-top"><<button "Leave" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ResolveMadDogDebtTaskName>>
<<if getTaskState("mad_dog_quest1", "Return to Mad Dog") == "not found">>
<<run addTaskToQuest("mad_dog_quest1", { description: "Return to Mad Dog", completed: false })>>
<</if>>
<<set _madDogImg = "Media\\Characters\\QuestChars\\MadDog\\MadDog.jpg">>
<<set _earn = Math.round($debtAmount * 0.10)>>
<<set _mdText = "Great job, keep it up. Here\'s your share.($" + _earn + ")">>
<<ChatWithoutNPC 'Mad Dog' _madDogImg _mdText>>
<<set $player.money -= $debtAmount>>
<<run $player.money += _earn>>
<<set _debtorChar = getCharacterByID($debtorID)>>
<<if _debtorChar && (_debtorChar.saveData instanceof Map)>>
<<run _debtorChar.saveData.delete("madDogDebtor")>>
<<run _debtorChar.saveData.delete("madDogDebtTaskName")>>
<</if>>
<<run completeTaskByQuestID("mad_dog_quest1", _madDogDebtTaskName)>>
<<run completeTaskByQuestID("mad_dog_quest1", "Return to Mad Dog")>>
<<ChatMessage 'He nods, counting the bills. Then he lowers his voice.'>>
<<include "MadDogCreateQuest">>
<div class="btn padding-top"><<button "Continue" $player.info.currentLocation>><<unset $debtAmount $debtTaskName $debtorID $daysToCompleteDebt $madDogDebtDueDay>><<LeaveInteractionSettings>><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ChatWithoutNPC 'Mad Dog' _madDogImg 'If you\'re really hunting dirt on BioGenesis-talk to the hard-nosed bitch. Park. Dead fountain. After six.'>>
<<run _questList = [
{
id: "rayna_voss_quest1",
title: "Detective",
description: "I’ve got a new lead on BioGenesis - a hard‑nosed private investigator who’s been digging into the corporation for years. I need to track her down and squeeze out every bit of information I can.",
state: "active",
questType: "side",
tasks: [
{ description: "Track down Detective Rayna Voss in the city park", completed: false }
],
}
]>>
<<CreateQuest _questList true>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _madDogImg = "Media\\Characters\\QuestChars\\MadDog\\MadDog.jpg">>
<<ChatWithoutNPC 'Mad Dog' _madDogImg '*squinted at you* What do you want?'>>
<<ChatMessage 'You scratched the back of your head and started explaining the situation.'>>
<<ChatWithoutNPC 'Mad Dog' _madDogImg '*burst out laughing* Yeah, I’ve got connections with some crooked scientists at BioGenesis. They slip me their experimental serums. Right now, I’ve got two in stock: ‘Mask’ and ‘Bimbo.’ Pick one. ‘Mask’ will make him young and strong - a real man. ‘Bimbo’ will turn him into a dumb slut with big tits and an empty head. Experimental stuff, you get it. What’s your choice? Each one’s $2,000.'>>
<<ChatMessage 'You froze. Was this for real? You’d been expecting some kind of impotence cure, but now… it was a choice between an alpha male and a sex doll.'>>
<<ChatMessage 'You stared at the vials. ‘Mask’ made sense-Robert clearly wanted strength. But ‘Bimbo’… damn, what if you took it? Curiosity and a hint of lust tugged at you. Finally, you made up your mind.'>>
<<if $player.characterEvents.isEventRegistered($player.info.id, "TalkingWithMad_Robert") == false>>
<<run $player.characterEvents.registerEvent($player.info.id, "TalkingWithMad_Robert", 1)>>
<</if>>
<div class="btn padding-top"><<button "Continue" "MadDog_Robert_Quest_01_Serum_Buy">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if $player.money >= 2000>>
<div class="btn padding-top"><<button "Choose Mask ($2000)" $player.info.currentLocation>><<LeaveInteractionSettings>><<include "MadDog_Robert_Quest_01_Serum_Complite_Mask">><</button>></div>
<div class="btn padding-top"><<button "Choose Bimbo ($2000)" $player.info.currentLocation>><<LeaveInteractionSettings>><<include "MadDog_Robert_Quest_01_Serum_Complite_Bimbo">><</button>></div>
<<else>>
<div class="btn non-interacting"><<button "Choose Mask ($2000)">><</button>></div>
<div class="btn non-interacting"><<button "Choose Bimbo ($2000)">><</button>></div>
<</if>>
<div class="btn padding-top"><<button "Leave" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set $player.money -= 2000>>
<<run completeTaskByQuestID("robert_quest_1", "Get the serum")>>
<<run $player.characterEvents.registerEvent($player.info.id, "ChooseMaskSerum_Robert", 1)>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set $player.money -= 2000>>
<<run $player.characterEvents.registerEvent($player.info.id, "ChooseBimboSerum_Robert", 1)>>
<<run completeTaskByQuestID("robert_quest_1", "Get the serum")>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<run $player.getRelationship($interactionNpc.info.id)>>
<<run $interactionNpc.getRelationship($player.info.id)>>
<<include "CheckKnowns">>
<<if typeof window.GetNpcPartnerFeminizationHint === "function">>
<<set _partnerChangeHint = window.GetNpcPartnerFeminizationHint($player, $interactionNpc)>>
<<if _partnerChangeHint>><<ChatMessage _partnerChangeHint>><</if>>
<</if>>
<<CheckDatingProposal $player $interactionNpc>>
<<set _genderReact = ReactionToTransform($interactionNpc)>>
<<if _genderReact>>
<<goto "NPC_Reaction_To_Transformation">>
<</if>>
/* Phase 6: jealousy divert - partner caught with someone today */
<<if typeof window.getCaughtWithOtherId === 'function'>>
<<set _caughtId = window.getCaughtWithOtherId($interactionNpc)>>
<<if _caughtId !== -1>>
<<run $interactionNpc.dailyEvents.unregisterEvent(_caughtId, 'caught_with_other')>>
<<set _sharingAllowed = typeof window.IsPlayerNpcPartnerSharingAllowed === 'function' && window.IsPlayerNpcPartnerSharingAllowed($interactionNpc)>>
<<if !_sharingAllowed>>
<<set $playerPartner = $interactionNpc>>
<<set $playerPartnerIndex = $indexNPC>>
<<set $playerPartnerConfrontationReason = "npc_cheating">>
<<set $playerPartnerConfrontationOtherName = "someone else">>
<<goto "player_partner_confrontation">>
<</if>>
<</if>>
<</if>>
/* Reactivity asides: an NPC who caught their partner cheating today vents about
it once; a freshly single NPC mentions the split once a day. */
<<if typeof window.getWitnessedCheatingId === 'function'>>
<<set _cheaterId = window.getWitnessedCheatingId($interactionNpc)>>
<<if _cheaterId !== -1>>
<<run $interactionNpc.dailyEvents.unregisterEvent(_cheaterId, 'witnessed_cheating')>>
<<set _cheaterChar = window.findById ? window.findById(_cheaterId) : null>>
<<set _cheaterName = _cheaterChar ? _cheaterChar.info.firstName : "my partner">>
<<set _ventMsg = $interactionNpc.info.firstName + ' looks like hell. "I caught ' + _cheaterName + ' with someone else today. Don\'t... just don\'t ask."'>>
<<ChatMessage _ventMsg>>
<</if>>
<</if>>
<<if typeof window.getRecentBreakupExId === 'function' && !$interactionNpc.dailyEvents.isEventRegistered($interactionNpc.info.id, "MentionedBreakup")>>
<<set _exId = window.getRecentBreakupExId($interactionNpc)>>
<<if _exId !== -1>>
<<run $interactionNpc.dailyEvents.registerEvent($interactionNpc.info.id, "MentionedBreakup", 1)>>
<<set _exChar = window.findById ? window.findById(_exId) : null>>
<<set _exName = _exChar ? _exChar.info.firstName : "my ex">>
<<set _splitMsg = $interactionNpc.info.firstName + ' gives you a tired half-smile. "' + _exName + ' and I split up. Still getting used to saying that out loud."'>>
<<ChatMessage _splitMsg>>
<</if>>
<</if>>
<<if $interactionNpc.info.characterWork == "Pimp" || $interactionNpc.info.characterWork == "Hooker" || $interactionNpc.info.characterWork == "Brothel Worker" || $interactionNpc.info.characterWork == "Brothel Security" >>
<<set _canTakeClothOff = false>>
<<else>>
<<set _canTakeClothOff = true>>
<</if>>
<<set $gameSettings.allowSaves = false>>
<<set $canShowStatsBtn = false>>
<div class="npc-interaction-ui">
<div class="btn-container padding-top">
<<if $player.status.energy.value >= 5>>
<<if $interactionNpc.characterEvents.isEventRegistered($player.info.id, "isServant") == true>>
<<include "Interactions_Servant">>
<<else>>
<<switch $interactionNpc.info.characterWork>>
<<case "None" "Student" "Hooker" "Brothel Worker" "Plastic Surgeon" "Photographer" "Porn director">>
<<include "enhanced_interaction_system">>
<<case "Pimp">>
<<include "InteractionEvent_Pimp">>
<<if _finish != true>>
<<include "enhanced_interaction_system">>
<</if>>
<<case "Pimp's whore">>
<<include "Interactions_Whore_Of_Pimp">>
<<case "Brothel Security">>
<<include "Interactions_PimpSecurity">>
<<set _finish = true>>
<<case "Etheriant">>
<<include "Interactions_Etheriant">>
<<set _finish = true>>
/* Every ordinary profession uses the common interaction menu.
Keeping this as the fallback also makes future jobs safe by default. */
<<default>>
<<include "enhanced_interaction_system">>
<</switch>>
<</if>>
<</if>>
</div>
<<if $player.status.energy.value < 5>>
<<ChatMessage "You're too tired.">>
<div class="btn padding-top"><<button "Leave" "NudeCheck">>
<<set $canShowStatsBtn = true>>
<<set $gameSettings.allowSaves = true>>
<</button>></div>
<</if>>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<</nobr>><<nobr>>
<<if $dateTime.hours >= 8 && $dateTime.hours <=20>>
<<set _workHour = true>>
<</if>>
<</nobr>><<nobr>>
<<if Random(0,100) > 94 && $gameSettings.contentFilter.NPC_Activity == true && $interactionNpc.info.characterWork != "Hooker" &&
($player.getRelationship($interactionNpc.info.id, false)?.metrics?.fear ?? 0) < 50
&& CanTriggerNpcInitiatedEvent($player, $dateTime)>>
<<set $FromInteraction = true>>
<<run MarkNpcInitiatedEventTriggered($player, $dateTime)>>
<<include "EventChoose">>
<</if>>
<</nobr>><<nobr>>
<<include "GetNPCStatsToVisualize">>
<div class="padding-top">
<div class="container-stat-visual">
<div class="row-stat-visual">
<div class="stat-card-stat-visual">
<div class="stat-title-stat-visual">Friendship</div>
<div class="stat-visual-stat-visual">_Friendship/100</div>
</div>
<div class="stat-card-stat-visual">
<div class="stat-title-stat-visual">Love</div>
<div class="stat-visual-stat-visual">_Love/100</div>
</div>
<div class="stat-card-stat-visual">
<div class="stat-title-stat-visual">Fear</div>
<div class="stat-visual-stat-visual">_Fear/100</div>
</div>
<div class="stat-card-stat-visual">
<div class="stat-title-stat-visual">Mood</div>
<div class="stat-visual-stat-visual">_Mood/100</div>
</div>
</div>
<div class="row-stat-visual">
<div class="stat-card-stat-visual">
<div class="stat-title-stat-visual">Dominance</div>
<div class="stat-visual-stat-visual">_Dominance/100</div>
</div>
<div class="stat-card-stat-visual">
<div class="stat-title-stat-visual">Lust</div>
<div class="stat-visual-stat-visual">_Lust/100</div>
</div>
<div class="stat-card-stat-visual">
<div class="stat-title-stat-visual">Horny</div>
<div class="stat-visual-stat-visual">_Horny/100</div>
</div>
<div class="stat-card-stat-visual">
<div class="stat-title-stat-visual">Aggression</div>
<div class="stat-visual-stat-visual">_Aggression/100</div>
</div>
</div>
<div class="btn"><<button "More" "GetCharStatsForPanel">><<set $fromInteractions = true>><<set $isPlayerStats = false>><</button>></div>
</div>
</div>
<</nobr>><<nobr>>
<<run _metrics = $player.getRelationship($interactionNpc.info.id, false)?.metrics ?? { friendship: 0, love: 0, fear: 0 }>>
<<run _Friendship = Math.trunc(_metrics.friendship)>>
<<run _Love = Math.trunc(_metrics.love)>>
<<run _Fear = Math.trunc(_metrics.fear)>>
<<run _Mood = Math.trunc($interactionNpc.behavior.mood.value)>>
<<run _Dominance = Math.trunc($interactionNpc.attributes.dominance.value)>>
<<run _Lust = Math.trunc($interactionNpc.attributes.lust.value)>>
<<run _Horny = Math.trunc($interactionNpc.status.horny.value)>>
<<run _Aggression = Math.trunc($interactionNpc.status.aggression.value)>>
<</nobr>><<nobr>>
/* Legacy placeholder: debtor action is rendered only inside enhanced_interaction_system. */
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _obsA = $talkPairNPC1>>
<<set _obsB = $talkPairNPC2>>
<<set _obsPose = $talkPairInteractionType>>
<<set _obsKin = (typeof window.getKinship === 'function' && _obsA && _obsB) ? window.getKinship(_obsA, _obsB) : 'unrelated'>>
<<set _obsPhase = $observePhase ?? 1>>
<<set _obsLocation = _obsA ? (_obsA.info.currentLocation ?? '') : ''>>
/* Defensive: if pair vanished, return to location */
<<if !_obsA || !_obsB>>
<<unset $talkPairNPC1 $talkPairNPC2 $talkPairIndexNPC1 $talkPairIndexNPC2 $talkPairInteractionType $talkPairLocation $observePhase>>
<<goto $player.info.currentLocation>>
<</if>>
<<set _obsIsAdult = (typeof window.isAdultInteraction === 'function') ? window.isAdultInteraction(_obsPose) : false>>
<<set _obsIsConflict = (typeof window.isConflictInteraction === 'function') ? window.isConflictInteraction(_obsPose) : false>>
<<set _obsIsRomance = (typeof window.isRomanceInteraction === 'function') ? window.isRomanceInteraction(_obsPose) : false>>
<<set _obsAllowMedia = (typeof window.CheckContentFilter === 'function') ? CheckContentFilter(_obsA, _obsB) : true>>
<<set _obsMedia = window.GetNpcPairObservationMedia(_obsA, _obsB, _obsPose, _obsPhase, _obsAllowMedia)>>
<<if _obsIsConflict && typeof window.describeObservedNpcConflict === 'function'>>
<<set _obsText = window.describeObservedNpcConflict(_obsA, _obsB, _obsPose, _obsKin, _obsPhase, _obsLocation)>>
<<elseif _obsIsRomance && typeof window.describeObservedNpcRomance === 'function'>>
<<set _obsText = window.describeObservedNpcRomance(_obsA, _obsB, _obsPose, _obsKin, _obsPhase, _obsLocation)>>
<<elseif _obsIsAdult && typeof window.describeObservedNpcSex === 'function'>>
<<set _obsText = window.describeObservedNpcSex(_obsA, _obsB, _obsPose, _obsKin, _obsPhase)>>
<<else>>
<<set _obsText = (typeof window.describeNpcPair === 'function')
? window.describeNpcPair(_obsA, _obsB, _obsPose, _obsKin)
: _obsA.info.firstName + ' and ' + _obsB.info.firstName + ' are in the middle of something.'>>
<</if>>
<<if _obsMedia && _obsMedia.text>>
<<set _obsText = _obsMedia.text>>
<</if>>
/* Witness recording - used by Phase 4 gossip system */
<<if _obsPhase === 1 && typeof window.recordWitnessedInteraction === 'function'>>
<<run window.recordWitnessedInteraction(_obsA.info.id, _obsB.info.id, _obsPose, _obsLocation)>>
<</if>>
<div class="observe-phase-indicator">
<div class="observe-phase-label">Watching <strong><<print _obsA.info.firstName>></strong> & <strong><<print _obsB.info.firstName>></strong> - phase <<print _obsPhase>> of 3</div>
<div class="observe-phase-bar"><div class="observe-phase-fill" @style="'width: ' + (_obsPhase * 33) + '%'"></div></div>
</div>
/* Adult pairs get the same Media\Sex\... clips the player sex system uses,
keyed on both partners' genders. The final phase shows a cum/finish clip
like the normal system; falls back to text-only when no clip exists.
A kissing or making-out pair gets the Media\Interactions\Kiss clip for
their genders, indoors only; flirt and cuddle have no clip and the
resolver returns nothing for them.
Every clip is gated by the player's content filter, applied to the
watched pair's two genders (CheckContentFilter's pair mode). */
<<if _obsAllowMedia>>
<<set _obsVid = _obsMedia ? _obsMedia.path : ''>>
<<if _obsVid>>
<<Video _obsVid>>
<</if>>
<</if>>
<<ChatMessage _obsText>>
<div class="btn-container">
<<if _obsPhase < 3>>
<div class="btn"><<button "Keep watching">>
<<run window.AwardNpcPairObservation(_obsA, _obsB, _obsPose, _obsPhase + 1)>>
<<set $observePhase = _obsPhase + 1>>
<<goto "ObserveNpcPair">>
<</button>></div>
<<if _obsPhase === 1>>
<div class="btn"><<button "Sneak closer">>
<<run window.AwardNpcPairObservation(_obsA, _obsB, _obsPose, 2)>>
<<set $observePhase = 2>>
<<goto "ObserveNpcPair">>
<</button>></div>
<</if>>
<</if>>
<div class="btn"><<button "Leave quietly" $player.info.currentLocation>>
<<unset $talkPairNPC1 $talkPairNPC2 $talkPairIndexNPC1 $talkPairIndexNPC2 $talkPairInteractionType $talkPairLocation $observePhase>>
<</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<set _surgeryMsg = "Persuade " + $interactionNpc.pronounHimHer() + " to have the surgery">>
<div class="padding-top">
<div class="btn-container">
<div class="btn"><<button "Change sexual preference" "ChangeSexPref_old">><</button>></div>
<div class="btn"><<button "Change sex role" "ChangeSexRole_old">><</button>></div>
<div class="btn"><<button "Inspire Submission" "InspireSubmission">><</button>></div>
<div class="btn"><<button "Change clothing preference" "ChangeClothingPreference">><</button>></div>
<div class="btn"><<button "Change your clothes" "ChangeNPC_Cloth">><</button>></div>
<div class="btn"><<button "Change name" "ChangeNPC_Name">><</button>></div>
<<if $interactionNpc.gender() == "Male" && (IsStudent($interactionNpc) || IsOrdinaryCitizen($interactionNpc))
&& $interactionNpc.characterEvents.isEventRegistered($interactionNpc.info.id, "Takes female hormones") == false>>
<div class="btn"><<button "Start taking female hormones" "TakeFemaleHormones">><</button>></div>
<</if>>
<div class="btn"><<button _surgeryMsg "PersuadeSurgery">><</button>></div>
<<if $interactionNpc.gender() != "Male" && (IsStudent($interactionNpc) || IsOrdinaryCitizen($interactionNpc)) &&
($player.characterEvents.isEventRegistered($player.info.id, "CanRecruit Hookers") == true
|| $player.characterEvents.isEventRegistered($player.info.id, "Became A Pimp") == true)>>
<div class="btn"><<button "Persuade to become a whore" "PersuadeToBecomeWhore">><</button>></div>
<</if>>
<<run _pronoun = $interactionNpc.pronounHimHer().toLowerCase()>>
<<set _leaveBtnText = ($persuadeType == "Coerce") ? "Ask " + _pronoun + " to leave" : "Make " + _pronoun + " leave">>
<<if $persuadeType == "Coerce">>
<div class="btn"><<button _leaveBtnText "AskToLeave">><</button>></div>
<<else>>
<div class="btn"><<button _leaveBtnText "AskToLeave">><</button>></div>
<</if>>
</div>
</div>
<div class="padding-top">
<<if $persuadeType == "Persuade">>
<div class="btn"><<button "Back" "CharacterInteractions">><<unset $persuadeType>><</button>></div>
<<else>>
<div class="btn"><<button "Back" "CharacterInteractions">><<unset $persuadeType>><</button>></div>
<</if>>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if $persuadeType == "Coerce">>
<<run _needCheck = {Friend: false, NPC_Dom: true, Player_Dom: true}>>
<<else>>
<<run _needCheck = {Friend: true, NPC_Dom: true, Player_Dom: true}>>
<</if>>
<<include "PersuadeCheck">>
<<if _allow == true>>
<<Chat $interactionNpc 'Enter a new Name'>>
<div class="input-container">
<div class="text-field text-field_floating-2">
<input type="text" id="firstName" name="firstName" value="First Name">
<label class="text-field__label" for="email">First Name</label>
</div>
</div>
<div class="padding-top">
<div class="btn"><<button "Accept" "Persuade">>
<<run $interactionNpc.info.firstName = document.getElementById("firstName").value>>
<</button>></div>
</div>
<<else>>
<<ChatMessage _needMsg>>
<div class="padding-top">
<div class="btn"><<button "Back" "Persuade">><</button>></div>
</div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if $persuadeType == "Coerce">>
<<run _needCheck = {Friend: false, NPC_Dom: true, Player_Dom: true}>>
<<else>>
<<run _needCheck = {Friend: true, NPC_Dom: true, Player_Dom: true}>>
<</if>>
<<include "PersuadeCheck">>
<<if _allow == true>>
<<set _leaveMsg = $interactionNpc.info.firstName + " agrees and leaves.">>
<<Chat $interactionNpc _leaveMsg>>
<<run CompleteNpcHomeVisit($indexNPC)>>
<div style="margin-top: 10px;">
<div class="btn"><<button "Leave" $player.info.currentLocation>>
<<unset $interactionNpc $indexNPC>>
<<SetSaveBtn true>>
<</button>></div>
</div>
<<else>>
<<ChatMessage _needMsg>>
<div class="padding-top">
<div class="btn"><<button "Back" "Persuade">><</button>></div>
</div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<run _needCheck = {Friend: true, NPC_Dom: true, Player_Dom: true}>>
<<include "PersuadeCheck">>
<<set _npcName = $interactionNpc.info.firstName>>
<<if _allow == true>>
<<set _rand = Random(1, 10) * -1>>
<<SetCharProgression $interactionNpc 'dominance' _rand true>>
<<set _agreeMsg = _npcName + " agrees to take female hormones.">>
<<ChatMessage _agreeMsg>>
<<run $interactionNpc.characterEvents.registerEvent($interactionNpc.info.id, "Takes female hormones", 1)>>
<<else>>
<<ChatMessage _needMsg>>
<<set _refuseMsg = _npcName + " does not agree to take female hormones.">>
<<ChatMessage _refuseMsg>>
<</if>>
<div class="padding-top">
<div class="btn"><<button "Back" "Persuade">><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<run _needCheck = {Friend: true, NPC_Dom: false, Player_Dom: false}>>
<<include "PersuadeCheck">>
<<if _allow == true>>
<<set _rand = Random(1, 5) * -1>>
<<SetCharProgression $interactionNpc 'dominance' _rand true>>
<<set _rand = Random(5, 10) * -1>>
<<SetCharProgression $interactionNpc 'dominance' _rand true>>
<<ChatMessage "You have successfully instilled submissiveness.">>
<<set _relUpgrd = {friendship: Random(-1.0, -3.0, true)}>>
<<SetRelations $player $interactionNpc _relUpgrd>>
<<else>>
<<ChatMessage _needMsg>>
<<set _msg = $interactionNpc.info.firstName + " doesn't trust you.">>
<<set _relUpgrd = {friendship: Random(-1.0, -3.0, true)}>>
<<SetRelations $player $interactionNpc _relUpgrd>>
<<ChatMessage _msg>>
<</if>>
<div class="padding-top">
<div class="btn"><<button "Back" "Persuade">><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<run _needCheck = {Friend: true, NPC_Dom: true, Player_Dom: true}>>
<<include "PersuadeCheck">>
<<if ($player.characterEvents.isEventRegistered($player.info.id, "Became A Pimp") == true && $interactionNpc.info.characterWork == "Hooker")>>
<<set _allow = true>>
<</if>>
<<if _allow == true>>
<<Chat $interactionNpc "Okay, I'll do it.">>
<div class="padding-top">
<div class="btn"><<button "Go to the clinic" "PlasticSurgery">><<set $isPlayer = false>><</button>></div>
</div>
<<else>>
<<ChatMessage _needMsg>>
<<Chat $interactionNpc "I'm not going to do that.">>
<<set _relUpgrd = {friendship: Random(-1.0, -5.0, true)}>>
<<SetRelations $player $interactionNpc _relUpgrd>>
<div class="padding-top">
<div class="btn"><<button "Back" "Persuade">><</button>></div>
</div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<run _needCheck = {Friend: true, NPC_Dom: true, Player_Dom: true}>>
<<include "PersuadeCheck">>
<<if _allow == true>>
<<run SetNpcScriptedRole($interactionNpc, "Hooker")>>
<<Chat $interactionNpc "I think you're right. I'm gonna be a whore.">>
<<if $player.characterEvents.isEventRegistered($player.info.id, "Became A Pimp") == false>>
<<set $Earnings = 50>>
<<switch Math.trunc($interactionNpc.body.face.value)>>
<<case 3>>
<<set $Earnings += 200>>
<<case 4>>
<<set $Earnings += 400>>
<<case 5>>
<<set $Earnings += 500>>
<<case 6>>
<<set $Earnings += 800>>
<</switch>>
<<switch Math.trunc($interactionNpc.body.breastSize.value)>>
<<case 1>>
<<set $Earnings += 150>>
<<case 2>>
<<set $Earnings += 250>>
<<case 3>>
<<set $Earnings += 400>>
<<case 4>>
<<set $Earnings += 600>>
<<case 5>>
<<set $Earnings += 800>>
<<case 6>>
<<set $Earnings += 1000>>
<</switch>>
<<switch Math.trunc($interactionNpc.body.buttSize.value)>>
<<case 1>>
<<set $Earnings += 150>>
<<case 2>>
<<set $Earnings += 250>>
<<case 3>>
<<set $Earnings += 400>>
<<case 4>>
<<set $Earnings += 600>>
<<case 5>>
<<set $Earnings += 800>>
<<case 6>>
<<set $Earnings += 1000>>
<</switch>>
<<if $interactionNpc.genitalia() == "Vagina">>
<<set $Earnings += 200>>
<</if>>
<<set $player.money += $Earnings>>
<<set _msg = "The pimp paid you " + $Earnings + "$ for the new girl.">>
<<ChatMessage _msg>>
<</if>>
<<else>>
<<ChatMessage _needMsg>>
<<Chat $interactionNpc "Don't be ridiculous.">>
<<set _relUpgrd = {friendship: Random(-1.0, -5.0, true)}>>
<<SetRelations $player $interactionNpc _relUpgrd>>
<</if>>
<div class="padding-top">
<div class="btn"><<button "Back" "CharacterInteractions">><<unset $persuadeType>><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<div class="padding-top">
<div class="btn-container">
<div class="btn"><<button "You must like masculinity" "TryChangeSexPref">><<set $sexPref = "masculinity">><</button>></div>
<div class="btn"><<button "You must like femininity" "TryChangeSexPref">><<set $sexPref = "femininity">><</button>></div>
<div class="btn"><<button "You must like both" "TryChangeSexPref">><<set $sexPref = "both">><</button>></div>
</div>
</div>
<div class="padding-top">
<div class="btn"><<button "Back" "Persuade">><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<run _needCheck = {Friend: true, NPC_Dom: true, Player_Dom: true}>>
<<include "PersuadeCheck">>
<<if ($player.characterEvents.isEventRegistered($player.info.id, "Became A Pimp") == true && $interactionNpc.info.characterWork == "Hooker")>>
<<set _allow = true>>
<</if>>
<<if _allow == true>>
<<switch $sexPref>>
<<case "masculinity">>
<<run $interactionNpc.info.sexualPreference = "Manly">>
<<case "femininity">>
<<run $interactionNpc.info.sexualPreference = "Feminine">>
<<case "both">>
<<run $interactionNpc.info.sexualPreference = "Bi">>
<</switch>>
<<Chat $interactionNpc "I think you're right.">>
<<else>>
<<ChatMessage _needMsg>>
<<Chat $interactionNpc "Don't be ridiculous.">>
<<set _relUpgrd = {friendship: Random(-1.0, -5.0, true)}>>
<<SetRelations $player $interactionNpc _relUpgrd>>
<</if>>
<div class="padding-top">
<div class="btn"><<button "Back" "Persuade">><<unset $sexPref>><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<div class="padding-top">
<div class="btn-container">
<div class="btn"><<button "Be more active" "TryChangeSexRole">><<set $sexRole = "active">><</button>></div>
<div class="btn"><<button "Be more passive" "TryChangeSexRole">><<set $sexRole = "passive">><</button>></div>
<div class="btn"><<button "Be versatile" "TryChangeSexRole">><<set $sexRole = "versatile">><</button>></div>
</div>
</div>
<div class="padding-top">
<div class="btn"><<button "Back" "Persuade">><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<run _needCheck = {Friend: true, NPC_Dom: true, Player_Dom: true}>>
<<include "PersuadeCheck">>
<<if ($player.characterEvents.isEventRegistered($player.info.id, "Became A Pimp") == true && $interactionNpc.info.characterWork == "Hooker")>>
<<set _allow = true>>
<</if>>
<<if _allow == true>>
<<switch $sexRole>>
<<case "active">>
<<run $interactionNpc.info.SexRole = "Active">>
<<case "passive">>
<<run $interactionNpc.info.SexRole = "Passive">>
<<case "versatile">>
<<run $interactionNpc.info.SexRole = "Versatile">>
<</switch>>
<<Chat $interactionNpc "I think you're right.">>
<<else>>
<<ChatMessage _needMsg>>
<<Chat $interactionNpc "Don't be ridiculous.">>
<<set _relUpgrd = {friendship: Random(-1.0, -5.0, true)}>>
<<SetRelations $player $interactionNpc _relUpgrd>>
<</if>>
<div class="padding-top">
<div class="btn"><<button "Back" "Persuade">><</button>></div>
</div>
<<unset $sexRole>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<div class="padding-top">
<div class="btn-container">
<<if $interactionNpc.info.clothesPreference != "women">>
<div class="btn"><<button "You should wear women's clothing" "TryChangeClothPref">><<set $pref = "women">><</button>></div>
<<else>>
<div class="btn"><<button "You should wear men's clothing" "TryChangeClothPref">><<set $pref = "men">><</button>></div>
<</if>>
</div>
</div>
<div class="padding-top">
<div class="btn"><<button "Back" "Persuade">><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<run _needCheck = {Friend: true, NPC_Dom: true, Player_Dom: true}>>
<<include "PersuadeCheck">>
<<if ($player.characterEvents.isEventRegistered($player.info.id, "Became A Pimp") == true && $interactionNpc.info.characterWork == "Hooker")>>
<<set _allow = true>>
<</if>>
<<if _allow == true>>
<<set $interactionNpc.info.clothesPreference = $pref>>
<<run $interactionNpc.AddCloth(true)>>
<<Chat $interactionNpc "I think you're right.">>
<<else>>
<<ChatMessage _needMsg>>
<<Chat $interactionNpc "Don't be ridiculous.">>
<</if>>
<div class="padding-top">
<div class="btn"><<button "Back" "Persuade">><<unset $pref>><</button>></div>
</div>
<</nobr>><<nobr>>
<<set _allow = true>>
<<set _needMsg = "">>
<<if $persuadeType == "Coerce">>
<<if ($player.getRelationship($interactionNpc.info.id, false)?.metrics?.fear ?? 0) < 80>>
<<set _needMsg += "(Fear level is too low. Less than 80)<br>">>
<<set _allow = false>>
<</if>>
<<elseif $persuadeType == "Persuade">>
<<if _needCheck.Friend == true && ($player.getRelationship($interactionNpc.info.id, false)?.metrics?.friendship ?? 0) < 90>>
<<set _needMsg += "(Your level of friendship is too low)<br>">>
<<set _allow = false>>
<</if>>
<<if _needCheck.NPC_Dom == true && $interactionNpc.attributes.dominance.value >= 2>>
<<run _pronoun = capitalizeFirstLetter($interactionNpc.pronounHisHer())>>
<<set _needMsg += "(" + _pronoun + " dominance level is excessively high)<br>">>
<<set _allow = false>>
<</if>>
<<if _needCheck.Player_Dom == true && $player.attributes.dominance.value < $interactionNpc.attributes.dominance.value>>
<<set _needMsg += "(Your level of dominance is too low.)<br>">>
<<set _allow = false>>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "HGheck">>
<<ShowNpcIcon $interactionNpc>>
<div class="padding-top">
<div class="btn-container">
<div class="btn"><<button "Learn about management" "HokerAsk">><<set $typeOfAsk = "Learn">><</button>></div>
<div class="btn"><<button "Sexual services (Free)" "AskSexServices">><</button>></div>
<<if _SheIsHG == false>>
<div class="btn"><<button "Make her a head girl" "HokerAsk">><<set $typeOfAsk = "MakeHerHeadGirl">><</button>></div>
<<else>>
<div class="btn"><<button "Collect the earned money" "HokerAsk">><<set $typeOfAsk = "CollectMoney">><</button>></div>
<div class="btn"><<button "How many girls work for me?" "HokerAsk">><<set $typeOfAsk = "HowManyGirls">><<set $askType = "Work For Faction">><</button>></div>
<</if>>
<div class="btn"><<button "Back" "CharacterInteractions">><<unset $typeOfAsk _SheIsHG _HeadGirls _HeadGirl>><</button>></div>
</div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<include "HGheck">>
<<switch $typeOfAsk >>
<<case "MakeHerHeadGirl">>
<<set $pimpEarnings = 0>>
<<if _HeadGirls.length > 0>>
<<run _HeadGirl.characterEvents.unregisterEvent(_HeadGirl.info.id, "Is Head Girl")>>
<</if>>
<<run $interactionNpc.characterEvents.registerEvent($interactionNpc.info.id, "Is Head Girl", 1)>>
<<ChatMessage 'You appointed a new girl to the position of the head girl.'>>
<<case "Learn">>
<<Chat $interactionNpc "You can appoint one of your girls as a head girl; she will collect your share and settle with the faction. However, remember that if you have already appointed another girl to this position, all the funds collected will be lost.">>
<<case "CollectMoney">>
<<if $pimpEarnings > 0>>
<<set $pimpEarnings = $pimpEarnings / 4>>
<<run $pimpEarnings = Math.trunc($pimpEarnings)>>
<<Chat $interactionNpc "Here is your share of the earnings.">>
<<set _msg = "She gives you $" + $pimpEarnings>>
<<run $player.money += $pimpEarnings>>
<<set $pimpEarnings = 0>>
<<ChatMessage _msg>>
<<else>>
<<ChatMessage "We haven't earned anything yet.">>
<</if>>
<<case "HowManyGirls">>
<<set _chars = []>>
<<run _hookers = $Characters.filter((character) => character.info.characterWork == "Hooker")>>
<<run _hookers.forEach((hooker) => { _chars.push($Characters.indexOf(hooker))})>>
<<set _msg = "Currently, " + _hookers.length + " girls are working for you.">>
<<Chat $interactionNpc _msg>>
<<if _hookers.length > 0>>
<div class="padding-up">
<<linkreplace "Hookers">>
<<DisplayCharacters _chars "compact">>
<</linkreplace>>
</div>
<</if>>
<</switch>>
<div class="padding-top">
<div class="btn"><<button "Back" "HookerTalk">><</button>></div>
</div>
<<unset $typeOfAsk _SheIsHG _HeadGirls _HeadGirl>>
<</nobr>><<nobr>>
<<set _HeadGirlYet = false>>
<<set _SheIsHG = false>>
<<run _HeadGirls = $Characters.filter(
(character) => character.characterEvents.isEventRegistered(character.info.id, "Is Head Girl") == true)>>
<<if _HeadGirls.length > 0>>
<<set _HeadGirlYet = true>>
<<run _HeadGirl = _HeadGirls[0]>>
<<if _HeadGirl.info.id == $interactionNpc.info.id>>
<<set _SheIsHG = true>>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<div class="enhanced-interaction-panel">
<div class="categories-row">
<div class="interaction-category">
<div class="category-header">
<span class="category-icon">💼</span>
<span class="category-title">Pimp Services</span>
</div>
<div class="category-buttons">
<div class="interaction-btn" data-category="job">
<<button "📋 Learn about recruiting" "AskForRecruiting_Pimp">><</button>>
</div>
<div class="interaction-btn" data-category="job">
<<button "💰 I want to earn some extra money" "AskForWork_Pimp">><</button>>
</div>
<div class="interaction-btn" data-category="job">
<<button "🏴 Are you working for a faction?" "OtherQuestions_Pimp">><<set $askType = "Work For Faction">><</button>>
</div>
<div class="interaction-btn" data-category="job">
<<button "👑 Can I become a pimp too?" "OtherQuestions_Pimp">><<set $askType = "Become Pimp">><</button>>
</div>
</div>
</div>
</div>
<div class="categories-row">
<div class="interaction-btn" data-category="friendly">
<<button "⬅ Back" "enhanced_interaction_system">><</button>>
</div>
</div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<if $player.characterEvents.isEventRegistered($player.info.id, "CanRecruit Hookers") == false>>
<<run $player.characterEvents.registerEvent($player.info.id, "CanRecruit Hookers", 1)>>
<</if>>
<<Chat $interactionNpc "If you're looking to make some extra cash, bring girls to me. I'll pay for each one. The prettier the girls are, the more I will pay.">>
<div class="padding-top">
<div class="interaction-btn" data-category="friendly">
<<button "⬅ Back" "AskQuestions_Pimp">><</button>>
</div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<ChatMessage 'He looks at you with an evaluating gaze.'>>
<<if $player.body.face.value < 2 || $player.gender() == "Male">>
<<Chat $interactionNpc "You lack femininity.">>
<<else>>
<<if $player.characterEvents.isEventRegistered($player.info.id, "Can Work As Hooker") == false>>
<<run $player.characterEvents.registerEvent($player.info.id, "Can Work As Hooker", 1)>>
<<Chat $interactionNpc "Alright, now you're working for me. When you decide to earn, just tell me, and I'll find clients for you. I'll take 40% of your earnings.">>
<<else>>
<<Chat $interactionNpc "You're already working for me, after all. When you decide to earn, just tell me, and I'll find clients for you. I'll take 40% of your earnings.">>
<</if>>
<<Chat $interactionNpc "I'll give you one piece of advice: the more attractive you are, the more money clients might offer. So, don't neglect plastic surgery.">>
<</if>>
<div class="padding-top">
<div class="interaction-btn" data-category="friendly">
<<button "⬅ Back" "AskQuestions_Pimp">><</button>>
</div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<switch $askType>>
<<case "Work For Faction">>
<<Chat $interactionNpc "Of course. In this city, you can't just work for yourself. Factions will either make you pay a percentage or kill you if you refuse. I work for \"Snake Eyes\", they deal in drug trafficking and prostitution.">>
<<case "Become Pimp">>
<<Chat $interactionNpc "\"Snake Eyes\" usually only conduct business with one pimp in the area. Having multiple pimps at once can lead to numerous conflicts between them, affecting the stability of the income stream. So, if you want to become a pimp, you'll have to eliminate me, otherwise, \"Snake Eyes\" will eliminate you.">>
<</switch>>
<div class="padding-top">
<div class="interaction-btn" data-category="friendly">
<<button "⬅ Back" "AskQuestions_Pimp">><<unset $askType>><</button>>
</div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<if $LoseBattle == true && $gameSettings.contentFilter.PlayerFeminization == true>>
<<run $player.characterEvents.registerEvent($player.info.id, "Loose To Pimp", 1)>>
<<run $player.characterEvents.registerEvent($player.info.id, "Is a pimp's whore", 1)>>
<<Chat $interactionNpc "Nice try, but you've lost. Now you will pay for your foolishness. I will change you and you will earn a lot of money for me. I will arrange with your college to grant you a deferral from classes while you work off the debt">>
<<ChatMessage 'The pimp\'s people take you to a clinic, where you undergo multiple surgeries. After that, you are taken to a room where you will work off the debt'>>
<<ChatMessage 'Every day your debt will increase by 1%. You can pay it off by working as a whore for the pimp.'>>
<<if $player.genitalia() == "Penis">>
<<ChatMessage 'A chastity cage has been put on your penis. If you want to remove the chastity cage for one day, then you must pay the pimp.'>>
<</if>>
<<ChatMessage 'You have become a pimp\'s whore. Your debt is now: $10000'>>
<div style="margin-top: 10px;">
<div class="btn"><<button "Continue" "PimpRoom">>
<<set $playerFollowers = []>>
<<run $playerDebt = 10000>>
<<run $player.money = 0>>
<<include "CharactersData">>
/*Create Whores */
<<set $pimp_Whores = []>>
<<for _i = 0; _i < 5; _i++>>
<<run _createChar = CreateCharacter({
isPlayer: false,
characterWork: "Pimp's whore",
sexualPreference: "Bi",
clothesPreference: "women",
age: Random(18,30),
}, true)>>
<<run _createChar.characterEvents.registerEvent(_createChar.info.id, "Is a pimp's whore", 1)>>
<<set $pimp_Whores.push(_createChar.info.id)>>
<</for>>
/*Create Guards */
<<set $pimp_Guards = []>>
<<for _i = 0; _i < 3; _i++>>
<<run _createChar = CreateCharacter({
isPlayer: false,
characterWork: "Brothel Security",
battleSkill: 80,
SexRole: "Active",
gender: "Male",
sexualPreference: "Bi",
clothesPreference: "men",
strength: Random(85,90),
defense: Random(85,90),
vitality: Random(85,90),
dexterity: Random(85,90),
age: Random(18,30),
}, true)>>
<<run _createChar.characterEvents.registerEvent(_createChar.info.id, "Is a pimp's whore", 1)>>
<<set $pimp_Guards.push(_createChar.info.id)>>
<</for>>
<<unset $maleNames $femaleNames $surnames $LoseBattle>>
<<SetSaveBtn true>>
<</button>></div>
</div>
<<elseif $LoseBattle == true && $gameSettings.contentFilter.PlayerFeminization == false>>
<<run $player.characterEvents.registerEvent($player.info.id, "Loose To Pimp", 1)>>
<<Chat $interactionNpc "Nice try, but you lost. Now you'll pay for your foolishness. You owe me 10,000.">>
<<ChatMessage 'The player feminization content is blocked, as the \'Forced Player Feminization\' option is disabled in the content filter'>>
<div style="margin-top: 10px;">
<div class="btn"><<button "Continue" "RedLightDistrict">>
<<run $player.money -= 10000>>
<<set $canShowStatsBtn = true>>
<<set $gameSettings.allowSaves = true>>
<<unset $LoseBattle>>
<</button>></div>
</div>
<<else>>
<<run $player.characterEvents.registerEvent($player.info.id, "Became A Pimp", 1)>>
<<set $pimpEarnings = 0>>
<<ChatMessage 'After that, a person from the faction approached you and explained your obligations. Now, the faction will take 50% of your earnings'>>
<<ChatMessage 'You have become a pimp. You can appoint one of your girls as the \'Madame\', and then you can collect your share from her weekly'>>
<<ChatMessage 'What do you want to do with him?'>>
<div style="margin-top: 10px;">
<div class="btn-container">
<div class="btn"><<button "Feminize him (Trans)" "Ending_Pimp">>
<<run $interactionNpc.body.face.increase(6)>>
<<run $interactionNpc.body.breastSize.increase(5)>>
<<run $interactionNpc.body.buttSize.increase(5)>>
<<run SetNpcScriptedRole($interactionNpc, "Hooker")>>
<<run $interactionNpc.info.clothesPreference = "women">>
<<run $interactionNpc.AddCloth(true)>>
<<set $PimpDest = "Feminize">>
<<unset $LoseBattle>>
<<run RandomRelocateCharacter($indexNPC, "RedLightDistrict")>>
<</button>></div>
<div class="btn"><<button "Feminize him (Fem)" "Ending_Pimp">>
<<run $interactionNpc.body.face.increase(6)>>
<<run $interactionNpc.body.breastSize.increase(5)>>
<<run $interactionNpc.body.buttSize.increase(5)>>
<<run $interactionNpc.body.penisSize.decrease(60)>>
<<run $interactionNpc.body.vaginaSize.increase(1)>>
<<run SetNpcScriptedRole($interactionNpc, "Hooker")>>
<<run $interactionNpc.info.clothesPreference = "women">>
<<run $interactionNpc.AddCloth(true)>>
<<set $PimpDest = "Feminize">>
<<unset $LoseBattle>>
<<run RandomRelocateCharacter($indexNPC, "RedLightDistrict")>>
<</button>></div>
<div class="btn"><<button "Let him go" "Ending_Pimp">><<set $PimpDest = "LetGo">><<run SetNpcScriptedRole($interactionNpc, "None")>><<unset $LoseBattle>><</button>></div>
</div>
</div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<switch $PimpDest>>
<<case "Feminize">>
<<ShowNpcIcon $interactionNpc>>
<<Chat $interactionNpc "You bastard, what have you done to me? I will never forgive you for this.">>
<<ChatMessage 'He is furious, but he knows that he can\'t do anything against you, as the faction\'s people will find him and he will regret it even more.'>>
<<case "LetGo">>
<<ShowNpcIcon $interactionNpc>>
<<Chat $interactionNpc "Are you just letting me go like that? Well, I didn't expect such generosity from you.">>
<<ChatMessage 'You let him go and he leaves.'>>
<</switch>>
<div class="padding-top">
<<BackButton "<<set $canShowStatsBtn = true>> <<unset $interactionNpc $PimpDest>> <<set $gameSettings.allowSaves = true>>">>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<run $surgeryChar = $player>>
<div class="centre-text">Paid Feminization</div>
<div class="padding-top">
<div class="btn-container">
<<if $player.money >= 250 && $player.body.face.value < $player.body.face.max>>
<div class="btn"><<button "Femininity (+1) ($250)" "PimpBrothelFeminization">><<include "PimpBrothelIncreaseFemininity">><</button>></div>
<<elseif $player.body.face.value >= $player.body.face.max>>
<div class="btn non-interacting"><<button "Femininity (MAX)">><</button>></div>
<<else>>
<div class="btn non-interacting"><<button "Femininity (+1) ($250)">><</button>></div>
<</if>>
<<if $player.money >= 250 && $player.body.breastSize.value < $player.body.breastSize.max>>
<div class="btn"><<button "Breast (+1) ($250)" "PimpBrothelFeminization">><<include "PimpBrothelIncreaseBreast">><</button>></div>
<<elseif $player.body.breastSize.value >= $player.body.breastSize.max>>
<div class="btn non-interacting"><<button "Breast (MAX)">><</button>></div>
<<else>>
<div class="btn non-interacting"><<button "Breast (+1) ($250)">><</button>></div>
<</if>>
<<if $player.money >= 250 && $player.body.buttSize.value < $player.body.buttSize.max>>
<div class="btn"><<button "Butt (+1) ($250)" "PimpBrothelFeminization">><<include "PimpBrothelIncreaseButt">><</button>></div>
<<elseif $player.body.buttSize.value >= $player.body.buttSize.max>>
<div class="btn non-interacting"><<button "Butt (MAX)">><</button>></div>
<<else>>
<div class="btn non-interacting"><<button "Butt (+1) ($250)">><</button>></div>
<</if>>
<<if $player.genitalia() == "Vagina">>
<div class="btn non-interacting"><<button "Vagina (Current)">><</button>></div>
<<elseif $player.money >= 1000>>
<div class="btn"><<button "Vagina ($1000)" "PimpBrothelFeminization">><<include "PimpBrothelSetVagina">><</button>></div>
<<else>>
<div class="btn non-interacting"><<button "Vagina ($1000)">><</button>></div>
<</if>>
</div>
</div>
<div class="padding-top">
<div class="btn"><<button "Back" "FeminizationRoom_Pimp">><<unset $surgeryChar>><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "IncreaseFemininity_Surgery">>
<<set $player.money += 250>>
<</nobr>><<nobr>>
<<include "IncreaseBreast_Surgery">>
<<set $player.money += 250>>
<</nobr>><<nobr>>
<<include "IncreaseButt_Surgery">>
<<set $player.money += 250>>
<</nobr>><<nobr>>
<<include "SetVagina_Surgery">>
<<set $player.money += 1000>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<div class="padding-top">
<div class="btn"><<button "Talk" "PimpSecurityTalk_Pimp">><</button>></div>
</div>
<div class="padding-top">
<div class="btn"><<button "Offer yourself" "OfferYourselfToSecurity_Pimp">><</button>></div>
</div>
<div class="padding-top">
<div class="btn"><<button "Leave" $player.info.currentLocation>><<unset $interactionNpc $indexNPC>> <<set $gameSettings.allowSaves = true>><<set $canShowStatsBtn = true>><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<Chat $player 'Mr. Security, I want to offer myself to you, if you\'ll have me.'>>
<<Chat $interactionNpc 'Come here, whore, and let me see what you have to offer.'>>
<div class="padding-top">
<div class="btn"><<button "Continue" "PassiveSex">><<set $sexType = "hookerWork">><<set $aggressiveFuck = true>><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<Chat $interactionNpc 'Get back to work, whore.'>>
<div class="padding-top">
<div class="btn"><<button "Leave" $player.info.currentLocation>><<unset $interactionNpc $indexNPC>> <<set $gameSettings.allowSaves = true>><<set $canShowStatsBtn = true>><</button>></div>
</div>
<</nobr>><<nobr>>
<div class="btn"><<button "Talk" "PimpSecurityTalk_Pimp">><</button>></div>
<<if $player.genitalia() == "Penis">>
<<if $player.money >= 500 && $player.dailyEvents.isEventRegistered($player.info.id, "RemoveChastityCage") == false>>
<div class="btn"><<button "Remove the chastity cage for 1 day (500$)" "RemoveSecurityCage_Pimp">><</button>></div>
<<else>>
<div class="btn non-interacting"><<button "Remove the chastity cage for 1 day (500$)">><</button>></div>
<</if>>
<</if>>
<div class="btn"><<button "Debt" "PayOffDebt_Pimp">><</button>></div>
<div class="btn"><<button "Leave" $player.info.currentLocation>><<unset $interactionNpc $indexNPC>> <<set $gameSettings.allowSaves = true>><<set $canShowStatsBtn = true>><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<run $player.money -= 500>>
<<if $player.dailyEvents.isEventRegistered($player.info.id, "RemoveChastityCage") == false>>
<<run $player.dailyEvents.registerEvent($player.info.id, "RemoveChastityCage", 1)>>
<</if>>
<<Chat $interactionNpc 'Okay, I\'ll take off your chastity cage, but only for today. Have a good time whore.'>>
<div class="padding-top">
<div class="btn"><<button "Continue" "CharacterInteractions">><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<set _msgDebt = "Your debt: $" + $playerDebt>>
<<ChatMessage _msgDebt>>
<div class="grid-row-twice">
<fieldset>
<legend>Pay Off</legend>
<div class="btn-container">
<<if $player.money >= 100>>
<div class="btn"><<button "$100" "PayOffDebt_Pimp">><<run _debtSum = Math.min(100, $playerDebt)>><<set _debtType = "PayOff">><<include "PimpDebtCalculate_Pimp">><</button>></div>
<<else>>
<div class="btn non-interacting"><<button "$100">><</button>></div>
<</if>>
<<if $player.money >= 1000>>
<div class="btn"><<button "$1000" "PayOffDebt_Pimp">><<run _debtSum = Math.min(1000, $playerDebt)>><<set _debtType = "PayOff">><<include "PimpDebtCalculate_Pimp">><</button>></div>
<<else>>
<div class="btn non-interacting"><<button "$1000">><</button>></div>
<</if>>
<<if $player.money > 0>>
<div class="btn"><<button "All" "PayOffDebt_Pimp">><<run _debtSum = Math.min($player.money, $playerDebt)>><<set _debtType = "PayOff">><<include "PimpDebtCalculate_Pimp">><</button>></div>
<<else>>
<div class="btn non-interacting"><<button "All">><</button>></div>
<</if>>
</div>
</fieldset>
<fieldset>
<legend>Loan</legend>
<div class="btn-container">
<div class="btn"><<button "$100" "PayOffDebt_Pimp">><<set _debtSum = 100>><<set _debtType = "Loan">><<include "PimpDebtCalculate_Pimp">><</button>></div>
<div class="btn"><<button "$1000" "PayOffDebt_Pimp">><<set _debtSum = 1000>><<set _debtType = "Loan">><<include "PimpDebtCalculate_Pimp">><</button>></div>
</div>
</fieldset>
</div>
<div class="padding-top">
<div class="btn"><<button "Back" "CharacterInteractions">><</button>></div>
</div>
<</nobr>><<nobr>>
<<if _debtType == "PayOff">>
<<set $playerDebt -= _debtSum>>
<<set $player.money -= _debtSum>>
<<if $playerDebt > 0>>
<<set _msg = "You paid off " + "$" + "_debtSum of the" + "$" + "$playerDebt debt">>
<<ChatMessage 'You paid off _debtSum of the $playerDebt debt.'>>
<div class="padding-top">
<div class="btn"><<button "Back" "PayOffDebt_Pimp">><</button>></div>
</div>
<<else>>
<<goto "PlayerRelease_Pimp">>
<</if>>
<<else>>
<<set $playerDebt += _debtSum>>
<<set $player.money += _debtSum>>
<<ChatMessage 'You borrowed _debtSum'>>
<div class="padding-top">
<div class="btn"><<button "Back" "PayOffDebt_Pimp">><</button>></div>
</div>
<</if>>
<</nobr>><<nobr>>
<<EachLoc>>
<<SaveLocation>>
<<SetBackground "Media/Locations/City/RedLightDistrict/Basement.jpg">>
<<ChatMessage 'You have settled your debt, and you have been released.'>>
<<run $player.characterEvents.unregisterEvent($player.info.id, "Is a pimp's whore")>>
<<Chat $interactionNpc 'Good whore. You have paid off your debt. You can leave now.'>>
<<run $indexesToRemove = []>>
<<run $Characters.forEach((item, index) => {
if ($pimp_Whores.includes(item.info.id) || $pimp_Guards.includes(item.info.id)){
$indexesToRemove.push(index);
}
})>>
<<run _lengt = $indexesToRemove.length - 1>>
<<for _i = _lengt; _i >= 0; _i-->>
<<run $Characters.splice($indexesToRemove[_i], 1);>>
<</for>>
<div class="padding-top">
<div class="btn"><<button "Continue" "RedLightDistrict">><<run $player.info.characterWork = "Student">><<unset $interactionNpc $indexNPC>><<set $gameSettings.allowSaves = true>><<set $canShowStatsBtn = true>><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<div class="btn padding-top"><<button "Stats">>
<<run Dialog.create("Info")>>
<<run Dialog.wiki('<<CharacterStatsView $interactionNpc true>>')>>
<<run Dialog.open();>>
<</button>></div>
<<if ($player.dailyEvents.isEventRegistered($player.info.id, "RemoveChastityCage") && $player.money >= 500) || $player.genitalia() == "Vagina">>
<div class="padding-top">
<div class="btn"><<button "Sex (500)" "Sex">><<set $sexType = "hooker">><<set $player.money -= 500>><</button>></div>
</div>
<<elseif $player.money >= 500 && $player.dailyEvents.isEventRegistered($player.info.id, "RemoveChastityCage") == false>>
<div class="padding-top">
<div class="btn"><<button "Sex (500)" "ChastityCageLock_Pimp">><</button>></div>
</div>
<<else>>
<div class="padding-top">
<div class="btn non-interacting"><<button "Sex (500)">><</button>></div>
</div>
<</if>>
<div class="padding-top">
<div class="btn"><<button "Leave" $player.info.currentLocation>><<unset $interactionNpc $indexNPC>> <<set $gameSettings.allowSaves = true>><<set $canShowStatsBtn = true>><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<Chat $interactionNpc 'Sorry, but first, you need to remove the chastity cage. Visit a pimp.'>>
<div class="padding-top">
<div class="btn"><<button "Back" "Whore_Of_Pimp">><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "SetSurgeChar">>
<<ShowNpcIcon $changeChar>>
<div class="padding-top">
<div class="btn-container">
<div class="btn"><<button "Breast ($500)" "PlasticSurgery_Change">><<set $surgery = "Breast">> <<set $cost = 500>><</button>></div>
<div class="btn"><<button "Ass ($500)" "PlasticSurgery_Change">><<set $surgery = "Ass">> <<set $cost = 500>><</button>></div>
<div class="btn"><<button "Femininity ($500)" "PlasticSurgery_Change">><<set $surgery = "Femininity">> <<set $cost = 500>><</button>></div>
<div class="btn"><<button "Face ($500)" "FaceSurgery">><<set $cost = 500>><<set $currentFace = $changeChar.body.faceType.value>><</button>></div>
<div class="btn"><<button "Genitals ($2000)" "PlasticSurgery_Genitals">><<set $cost = 2000>><</button>></div>
</div>
</div>
<div class="padding-top">
<div class="btn"><<button "Back" "CharacterInteractions">><<unset $surgery $cost $changeChar>><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "SetSurgeChar">>
<<ShowNpcIcon $changeChar>>
<p>Current: <<print $changeChar.genitalia()>></p>
<div class="padding-top">
<div class="btn-container">
<<if $changeChar.genitalia() != "Penis">>
<div class="btn"><<button "Penis" "PlasticSurgery_Genitals">>
<<if $cost > $player.money>>
<<unset $cost>>
<<goto "SurgeryNoMoney">>
<<else>>
<<run $changeChar.body.penisSize.value = 8>>
<<run $changeChar.body.vaginaSize.value = 0>>
<<if $changeChar.info.isPlayer>><<run onGenderChanged()>><</if>>
<<run $player.money -= $cost>>
<<unset $cost>>
<</if>>
<</button>></div>
<<else>>
<div class="btn"><<button "Change penis size" "PlasticSurgery_ChangePenisSize">><</button>></div>
<</if>>
<<if $changeChar.genitalia() != "Vagina">>
<div class="btn"><<button "Vagina" "PlasticSurgery_Genitals">>
<<if $cost > $player.money>>
<<unset $cost>>
<<goto "SurgeryNoMoney">>
<<else>>
<<run $changeChar.body.penisSize.value = 0>>
<<run $changeChar.body.vaginaSize.value = 1>>
<<if $changeChar.info.isPlayer>><<run onGenderChanged()>><</if>>
<<run $player.money -= $cost>>
<<unset $cost>>
<</if>>
<</button>></div>
<</if>>
<div class="btn"><<button "Back" "PlasticSurgery">><</button>></div>
</div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "SetSurgeChar">>
<<run _msg = "Current: " + (Math.floor($changeChar.body.penisSize.value * 100) / 100)>>
<<print _msg>>
<div class="padding-top">
<div class="btn-container">
<<if $changeChar.body.penisSize.value < $changeChar.body.penisSize.max>>
<div class="btn"><<button "Increase penis size (50$)" "PlasticSurgery_ChangePenisSize">>
<<set $cost = 50>>
<<if $cost > $player.money>>
<<unset $cost>>
<<goto "SurgeryNoMoney">>
<<else>>
<<run $changeChar.body.penisSize.increase(0.25)>>
<<run $player.money -= $cost>>
<<unset $cost>>
<</if>>
<</button>></div>
<</if>>
<<if $changeChar.body.penisSize.value > 1>>
<div class="btn"><<button "Reduce penis size (50$)" "PlasticSurgery_ChangePenisSize">>
<<set $cost = 50>>
<<if $cost > $player.money>>
<<unset $cost>>
<<goto "SurgeryNoMoney">>
<<else>>
<<run $changeChar.body.penisSize.decrease(0.25)>>
<<if $changeChar.body.penisSize.value < 1>>
<<set $changeChar.body.penisSize.value = 1>>
<</if>>
<<run $player.money -= $cost>>
<<unset $cost>>
<</if>>
<</button>></div>
<</if>>
</div>
</div>
<div class="padding-top">
<div class="btn"><<button "Back" "PlasticSurgery_Genitals">><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "SetSurgeChar">>
<<switch $surgery>>
<<case "Breast">>
<<run _breastImg = $changeChar.getBreastImage()>>
_breastImg
<<set _changes = $changeChar.body.breastSize>>
<<case "Ass">>
<<run _assImg = $changeChar.getAssImage()>>
_assImg
<<set _changes = $changeChar.body.buttSize>>
<<case "Femininity">>
<<ShowNpcIcon $changeChar>>
<<set _changes = $changeChar.body.face>>
<</switch>>
<<if $changeChar.dailyEvents.getOrRegisterEvent($changeChar.info.id, "Surgery", 0) < 1>>
<div class="padding-top">
<div class="btn-container">
<<if _changes.value != _changes.max>>
<div class="btn"><<button "Increase" "PlasticSurgery_Change">>
<<if $cost > $player.money>>
<<unset $cost>>
<<goto "SurgeryNoMoney">>
<<else>>
<<run $changeChar.dailyEvents.registerEvent($changeChar.info.id, "Surgery", 1)>>
<<run _changes.increase(1)>>
<<run $player.money -= $cost>>
<<unset $cost>>
<</if>>
<</button>></div>
<</if>>
<<if _changes.value != _changes.min>>
<div class="btn"><<button "Reduce" "PlasticSurgery_Change">>
<<if $cost > $player.money>>
<<unset $cost>>
<<goto "SurgeryNoMoney">>
<<else>>
<<run $changeChar.dailyEvents.registerEvent($changeChar.info.id, "Surgery", 1)>>
<<run _changes.decrease(1)>>
<<run $player.money -= $cost>>
<<unset $cost>>
<</if>>
<</button>></div>
<</if>>
<div class="btn"><<button "Back" "PlasticSurgery">><<unset $cost>><</button>></div>
</div>
</div>
<<else>>
<<if $isPlayer == true>>
<<ChatMessage "You've already undergone a surgery today. It's essential to take at least one full day for recovery.">>
<<else>>
<<set _msg = $changeChar.info.firstName + " has already undergone surgery today. It's essential to take at least one full day for recovery">>
<<ChatMessage _msg>>
<</if>>
<div class="padding-top">
<div class="btn"><<button "Back" "PlasticSurgery">><<unset $cost>><</button>></div>
</div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "SetSurgeChar">>
<<ShowNpcIcon $changeChar>>
<<set _selectText = "Select $" + $cost>>
<div class="padding-top">
<div class="btn-container">
<<if $changeChar.body.faceType.value != $changeChar.body.faceType.max>>
<div class="btn"><<button "Next" "FaceSurgery">> <<run $changeChar.body.faceType.increase(1)>><</button>></div>
<</if>>
<<if $changeChar.body.faceType.value != $changeChar.body.faceType.min>>
<div class="btn"><<button "Previous" "FaceSurgery">><<run $changeChar.body.faceType.decrease(1)>><</button>></div>
<</if>>
<div class="btn"><<button _selectText "PlasticSurgery">>
<<if $cost > $player.money>>
<<run $changeChar.body.faceType.value = $currentFace>>
<<unset $cost $currentFace>>
<<goto "SurgeryNoMoney">>
<<else>>
<<run $changeChar.dailyEvents.registerEvent($changeChar.info.id, "Surgery", 1)>>
<<run $player.money -= $cost>>
<<unset $cost>>
<</if>>
<</button>></div>
</div>
</div>
<div class="padding-top">
<div class="btn"><<button "Back" "PlasticSurgery">>
<<run $changeChar.body.faceType.value = $currentFace>>
<<unset $currentFace>>
<</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "SetSurgeChar">>
<<ChatMessage "Not enough money.">>
<div class="padding-top">
<div class="btn"><<button "Back" "PlasticSurgery">><</button>></div>
</div>
<</nobr>>
/* :: SetSurgeChar
<<nobr>>
<<if $isPlayer == true>>
<<run $changeChar = $player>>
<<else>>
<<run $changeChar = $interactionNpc>>
<</if>>
<</nobr>> */<<nobr>>
<<include "UpdateAll">>
<<if $player.dailyEvents.isEventRegistered($player.info.id, "DrugTesting") == true>>
<<Chat $interactionNpc 'You have already participated in the drug testing today. We need more precise data, so please come back tomorrow.'>>
<div class="padding-top">
<div class="btn"><<button "Back" "CharacterInteractions">><</button>></div>
</div>
<<else>>
<<Chat $interactionNpc 'We need to test a new medication. If you agree to participate as a subject, the clinic will pay you $200.'>>
<div class="padding-top">
<div class="btn-container">
<div class="btn"><<button "Agree" "DrugTest_RandomEvent">><</button>></div>
<div class="btn"><<button "Refuse" "CharacterInteractions">><</button>></div>
</div>
</div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if Random(0, 100) < 60>>
<<goto "AgreeDrugTest">>
<<else>>
<<goto "DrugTest_BimboTransformation">>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<Chat $interactionNpc 'Thank you for your participation. Please, follow me.'>>
<<ChatMessage 'You are taken to a special room and given a pill.'>>
<<ChatMessage 'You feel dizzy and fall asleep.'>>
<<ChatMessage 'When you wake up, you are given $200.'>>
<<set _randEffect = Random(0,5)>>
<<switch _randEffect>>
<<case 0>>
<<run $player.body.penisSize.decrease(Random(0.1, 0.5, true))>>
<<case 1>>
<<run $player.body.face.increase(Random(0.2, 0.8, true))>>
<<case 2>>
<<run $player.body.face.decrease(Random(0.1, 0.5, true))>>
<<case 3>>
<<run $player.body.buttSize.increase(Random(0.2, 0.5, true))>>
<<case 4>>
<<run $player.body.breastSize.increase(Random(0.2, 0.5, true))>>
<</switch>>
<<if $player.dailyEvents.isEventRegistered($player.info.id, "DrugTesting") == false>>
<<run $player.dailyEvents.registerEvent($player.info.id, "DrugTesting", 1)>>
<</if>>
<<set $player.money += 200>>
<div class="padding-top">
<div class="btn"><<button "Back" "CharacterInteractions">><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<LockSettings>>
<<run _changePill = GetNewItem("gender_change_pills_female", 1)>>
<<run $player.useItem(_changePill, $player)>>
<<if $player.dailyEvents.isEventRegistered($player.info.id, "DrugTesting") == false>>
<<run $player.dailyEvents.registerEvent($player.info.id, "DrugTesting", 1)>>
<</if>>
<<ChatMessage 'You find yourself standing in a sterile, white hospital room, the smell of disinfectant hanging heavy in the air. The doctor, a middle-aged man with a kind smile, gestures to a small table where a single pill rests.'>>
<<Chat $interactionNpc 'This is the experimental drug we\'d like you to test *he explains, his voice calm and reassuring* It\'s supposed to enhance cognitive function, but we\'ve had some… interesting side effects in the past.'>>
<<ChatMessage 'As you pick up the pill, you can\'t help but wonder what those side effects might be. The doctor hands you a glass of water, and you swallow the pill, feeling it slide down your throat. At first, nothing seems to happen. But then, a strange, tingling sensation begins to spread through your body.'>>
<<ChatMessage 'Your mind starts to feel foggy, your thoughts growing less clear. You look down and notice that your hands are changing, becoming smaller and more delicate. Your body begins to shift, your muscles softening, your skin becoming smoother. You feel a sudden surge of arousal, your genitals changing, becoming a vulva.'>>
<<Chat $interactionNpc 'Fascinating *he mutters, his voice dripping with excitement* You\'re becoming a bimbo girl, just as we predicted.'>>
<<ChatMessage 'As you stumble forward, your newfound arousal taking control, the doctor guides you to stand between his legs. He unzips his pants, revealing his erect penis, and you feel an overwhelming urge to take it in your mouth. You start to suck him off, your mind clouded by your newfound horniness.'>>
<<run _pic = "Media\\Events\\Clinic\\BimboTransformation\\BimboTransformation_Blowjob.mp4">>
<<Video _pic>>
<<ChatMessage 'The doctor\'s eyes close in ecstasy as you continue to blow him. After a few moments, he pulls you away, turning you to face the wall. He lifts your skirt, exposing your new vulva, and enters you from behind. You feel a wave of pleasure wash over you as he begins to thrust, your mind lost in the sensation.'>>
<<ChatMessage 'As the doctor continues to fuck you, you can\'t help but wonder what other effects this drug might have. Will you remain in this state forever, or is there a way to reverse the transformation? And what other surprises might this experimental drug have in store for you?'>>
<<run _pic = "Media\\Events\\Clinic\\BimboTransformation\\BimboTransformation_Fuck.mp4">>
<<Video _pic>>
<div class="btn padding-top"><<button "Continue" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "SetSurgeChar">>
<<include "GetCurrentCharacterValue">>
<<done>>
<<include "SetAvailableBtn_Surgery">>
<</done>>
<div class="grid-row-twice" style = "grid-template-columns: 1fr 1fr 1fr; grid-template-rows: 1fr;">
<div class="container-stat-visual" style="height: 380px;">
<p style="text-align: center;">Face ($1500)</p>
<div class="row-stat-visual">
<div class="stat-card-stat-visual">
<div class="surgery-container">
<div class="surgery-item"><div class="btn"><<button " <<< ">><<set $imgNumIncrease = false>><<replace "#surgery-icon">><<include "UpdateSurgeryImage">><</replace>><</button>></div> </div>
<div class="surgery-item" id="surgery-icon"><img style="width: 200px; height: 200px; border-radius: 25px;" @src="_characterIcon" alt="Avatar"></div>
<div class="surgery-item"><div class="btn"><<button " >>> ">><<set $imgNumIncrease = true>><<replace "#surgery-icon">><<include "UpdateSurgeryImage">><</replace>><</button>></div> </div>
</div>
<div class="surgery-item" id="select-new-charface"><div class="btn"><<button "Select" "PlasticSurgery_Job">><</button>></div> </div>
</div>
</div>
</div>
<div class="container-stat-visual" style="height: 380px;">
<p style="text-align: center;">Body ($500)</p>
<div class="row-stat-visual">
<div class="stat-card-stat-visual">
<div class="stat-title-stat-visual">Femininity</div>
<div class="surgery-container">
<div class="surgery-item" id="surgery-femininity-decrease-btn"></div>
<div class="stat-visual-stat-visual"><<print Math.trunc(_characterFemininity.value)>>/_characterFemininity.max</div>
<div class="surgery-item" id="surgery-femininity-increase-btn"></div>
</div>
</div>
</div>
<div class="row-stat-visual">
<div class="stat-card-stat-visual">
<div class="stat-title-stat-visual">Breast</div>
<div class="surgery-container">
<div class="surgery-item" id="surgery-breast-decrease-btn"></div>
<div class="stat-visual-stat-visual"><<print Math.trunc(_characterBreastSize.value)>>/_characterBreastSize.max</div>
<div class="surgery-item" id="surgery-breast-increase-btn"></div>
</div>
</div>
</div>
<div class="row-stat-visual">
<div class="stat-card-stat-visual">
<div class="stat-title-stat-visual">Butt</div>
<div class="surgery-container">
<div class="surgery-item" id="surgery-butt-decrease-btn"></div>
<div class="stat-visual-stat-visual"><<print Math.trunc(_characterButtSize.value)>>/_characterButtSize.max</div>
<div class="surgery-item" id="surgery-butt-increase-btn"></div>
</div>
</div>
</div>
</div>
<div class="container-stat-visual" style="height: 380px;">
<p style="text-align: center;">Genitals</p>
<div class="stat-card-stat-visual">
<div class="stat-title-stat-visual">Genital type ($2000)</div>
<div class="row-stat-visual" style="flex-direction: column;">
<div class="stat-card-stat-visual">
<div class="surgery-item"><div class="btn" id="surgery-vagina-btn"><<button "Penis" "PlasticSurgery_Job">><</button>></div> </div>
<div class="padding-top">
<div class="surgery-item"><div class="btn" id="surgery-penis-btn"><<button "Vagina" "PlasticSurgery_Job">><</button>></div> </div>
</div>
</div>
</div>
</div>
<div class="row-stat-visual">
<div class="stat-card-stat-visual">
<div class="stat-title-stat-visual">Penis size ($250)</div>
<div class="surgery-container">
<div class="surgery-item" id="surgery-penis-decrease-btn"></div>
<div class="stat-visual-stat-visual"><<print Math.trunc(_characterPenisSize.value)>>/_characterPenisSize.max</div>
<div class="surgery-item" id="surgery-penis-increase-btn"></div>
</div>
</div>
</div>
</div>
</div>
<div class="padding-top">
<div class="btn"><<button "Back" "CharacterInteractions">><<unset $surgeryChar $imgNumIncrease>><</button>></div>
</div>
<</nobr>><<nobr>>
<<set _characterIcon = "Media\\Characters\\" + $surgeryChar.info.skin + "\\Face\\" + $characterFaceType.value + "\\" + Math.trunc($surgeryChar.body.face.value) + ".jpeg">>
<<set _characterFemininity = $surgeryChar.body.face>>
<<set _characterBreastSize = $surgeryChar.body.breastSize>>
<<set _characterButtSize = $surgeryChar.body.buttSize>>
<<set _characterPenisSize = $surgeryChar.body.penisSize>>
<<set _characterGenitals = $surgeryChar.genitalia()>>
<</nobr>><<nobr>>
/* Wrap-around must not also step: "wrap to min, then increase" landed on
min+1 and the boundary faces could never be selected. */
<<if $imgNumIncrease == true>>
<<if $characterFaceType.value == $characterFaceType.max>>
<<set $characterFaceType.value = $characterFaceType.min>>
<<else>>
<<set $characterFaceType.increase(1)>>
<</if>>
<<else>>
<<if $characterFaceType.value == $characterFaceType.min>>
<<set $characterFaceType.value = $characterFaceType.max>>
<<else>>
<<set $characterFaceType.decrease(1)>>
<</if>>
<</if>>
<<set _characterIcon = "Media\\Characters\\" + $surgeryChar.info.skin + "\\Face\\" + $characterFaceType.value + "\\" + Math.trunc($surgeryChar.body.face.value) + ".jpeg">>
<img style="width: 200px; height: 200px; border-radius: 25px;" @src="_characterIcon" alt="Avatar">
<<include "SetAvailableBtn_Surgery">>
<</nobr>><<nobr>>
/* Face */
<<if $characterFaceType.value != $surgeryChar.body.faceType.value && $player.money >= 1500>>
<<replace "#select-new-charface">><div class="btn"><<button "Select" "PlasticSurgery_Job">><<include "SelectNewFace_Surgery">><</button>></div><</replace>>
<<else>>
<<replace "#select-new-charface">><div class="btn non-interacting"><<button "Select">><</button>></div><</replace>>
<</if>>
/* Femininity */
<<if Math.trunc(_characterFemininity.value) != _characterFemininity.max && $player.money >= 500>>
<<replace "#surgery-femininity-increase-btn">><div class="btn"><<button " >>> " "PlasticSurgery_Job">><<include "IncreaseFemininity_Surgery">><</button>></div><</replace>>
<<else>>
<<replace "#surgery-femininity-increase-btn">><div class="btn non-interacting"><<button " >>> ">><</button>></div><</replace>>
<</if>>
<<if Math.trunc(_characterFemininity.value) != _characterFemininity.min && $player.money >= 500>>
<<replace "#surgery-femininity-decrease-btn">><div class="btn"><<button " <<< " "PlasticSurgery_Job">><<include "DecreaseFemininity_Surgery">><</button>></div><</replace>>
<<else>>
<<replace "#surgery-femininity-decrease-btn">><div class="btn non-interacting"><<button " <<< ">><</button>></div><</replace>>
<</if>>
/* ------------------------ */
/* Breast */
<<if Math.trunc(_characterBreastSize.value) != _characterBreastSize.max && $player.money >= 500>>
<<replace "#surgery-breast-increase-btn">><div class="btn"><<button " >>> " "PlasticSurgery_Job">><<include "IncreaseBreast_Surgery">><</button>></div><</replace>>
<<else>>
<<replace "#surgery-breast-increase-btn">><div class="btn non-interacting"><<button " >>> ">><</button>></div><</replace>>
<</if>>
<<if Math.trunc(_characterBreastSize.value) != _characterBreastSize.min && $player.money >= 500>>
<<replace "#surgery-breast-decrease-btn">><div class="btn"><<button " <<< " "PlasticSurgery_Job">><<include "DecreaseBreast_Surgery">><</button>></div><</replace>>
<<else>>
<<replace "#surgery-breast-decrease-btn">><div class="btn non-interacting"><<button " <<< ">><</button>></div><</replace>>
<</if>>
/* ------------------------ */
/* Butt */
<<if Math.trunc(_characterButtSize.value) != _characterButtSize.max && $player.money >= 500>>
<<replace "#surgery-butt-increase-btn">><div class="btn"><<button " >>> " "PlasticSurgery_Job">><<include "IncreaseButt_Surgery">><</button>></div><</replace>>
<<else>>
<<replace "#surgery-butt-increase-btn">><div class="btn non-interacting"><<button " >>> ">><</button>></div><</replace>>
<</if>>
<<if Math.trunc(_characterButtSize.value) != _characterButtSize.min && $player.money >= 500>>
<<replace "#surgery-butt-decrease-btn">><div class="btn"><<button " <<< " "PlasticSurgery_Job">><<include "DecreaseButt_Surgery">><</button>></div><</replace>>
<<else>>
<<replace "#surgery-butt-decrease-btn">><div class="btn non-interacting"><<button " <<< ">><</button>></div><</replace>>
<</if>>
/* ------------------------ */
/* Genitals */
<<if _characterGenitals != "Vagina" && $player.money >= 2000>>
<<replace "#surgery-vagina-btn">><div class="btn"><<button "Vagina" "PlasticSurgery_Job">><<include "SetVagina_Surgery">><</button>></div><</replace>>
<<else>>
<<replace "#surgery-vagina-btn">><div class="btn non-interacting"><<button "Vagina">><</button>></div><</replace>>
<</if>>
<<if _characterGenitals != "Penis" && $player.money >= 2000>>
<<replace "#surgery-penis-btn">><div class="btn"><<button "Penis" "PlasticSurgery_Job">><<include "SetPenis_Surgery">><</button>></div><</replace>>
<<else>>
<<replace "#surgery-penis-btn">><div class="btn non-interacting"><<button "Penis">><</button>></div><</replace>>
<</if>>
/* Penis Size */
<<if _characterGenitals == "Penis" && $player.money >= 250 && _characterPenisSize.value < _characterPenisSize.max>>
<<replace "#surgery-penis-increase-btn">><div class="btn"><<button " >>> " "PlasticSurgery_Job">><<include "Increase_Penis_Size_Surgery">><</button>></div><</replace>>
<<else>>
<<replace "#surgery-penis-increase-btn">><div class="btn non-interacting"><<button " >>> ">><</button>></div><</replace>>
<</if>>
<<if _characterGenitals == "Penis" && $player.money >= 250 && _characterPenisSize.value > 1>>
<<replace "#surgery-penis-decrease-btn">><div class="btn"><<button " <<< " "PlasticSurgery_Job">><<include "Decrease_Penis_Size_Surgery">><</button>></div><</replace>>
<<else>>
<<replace "#surgery-penis-decrease-btn">><div class="btn non-interacting"><<button " <<< ">><</button>></div><</replace>>
<</if>>
/* ------------------------ */
<</nobr>><<nobr>>
<<set $surgeryChar.body.faceType.value = $characterFaceType.value>>
<<set $player.money -= 1500>>
<</nobr>><<nobr>>
<<run $surgeryChar.body.face.increase(1)>>
<<set $player.money -= 500>>
<</nobr>><<nobr>>
<<run $surgeryChar.body.face.decrease(1)>>
<<set $player.money -= 500>>
<</nobr>><<nobr>>
<<run $surgeryChar.body.breastSize.increase(1)>>
<<set $player.money -= 500>>
<</nobr>><<nobr>>
<<run $surgeryChar.body.breastSize.decrease(1)>>
<<set $player.money -= 500>>
<</nobr>><<nobr>>
<<run $surgeryChar.body.buttSize.increase(1)>>
<<set $player.money -= 500>>
<</nobr>><<nobr>>
<<run $surgeryChar.body.buttSize.decrease(1)>>
<<set $player.money -= 500>>
<</nobr>><<nobr>>
<<run $surgeryChar.body.penisSize.value = 8>>
<<run $surgeryChar.body.vaginaSize.value = 0>>
<<set $player.money -= 2000>>
<</nobr>><<nobr>>
<<run $surgeryChar.body.penisSize.value = 0>>
<<run $surgeryChar.body.vaginaSize.value = 1>>
<<set $player.money -= 2000>>
<</nobr>><<nobr>>
<<run $surgeryChar.body.penisSize.increase(1)>>
<<set $player.money -= 250>>
<</nobr>><<nobr>>
<<run $surgeryChar.body.penisSize.decrease(1)>>
<<set $player.money -= 250>>
<</nobr>><<nobr>>
<<if $surgeryChar.info.isPlayer == true>>
<<run $surgeryChar = $player>>
<<else>>
<<run $surgeryChar = $interactionNpc>>
<</if>>
<</nobr>><<nobr>>
<<if $player.characterEvents.isEventRegistered($player.info.id, "GetDamianContract") == false>>
<div class="btn padding-top"><<button "Take a contract" "Damian_GetContract">><</button>></div>
<<else>>
<div class="btn padding-top"><<button "Abandon contract" "AbandonContract_Damian">><</button>></div>
<</if>>
<<if $player.characterEvents.isEventRegistered($player.info.id, "InfectedByEfirium") == true>>
<<if $player.money >= 1200>>
<div class="btn padding-top"><<button "Cure Etherium" "CureEtherium_Damian">><</button>></div>
<<else>>
<div class="btn non-interacting padding-top" id="cure-etherium-btn"><<button "Cure Etherium" "CureEtherium_Damian">><</button>></div>
<<run addHoverTooltip('cure-etherium-btn', 'Not enough money')>>
<</if>>
<</if>>
<<if $playerlock == true>>
<<if $player.money >= 2000>>
<div class="btn padding-top"><<button "Remove the chastity cage ($2000)" "RemoveChastityCage_Damian">><</button>></div>
<<else>>
<div class="btn non-interacting padding-top" id="remove-cage-btn"><<button "Remove the chastity cage ($2000)">><</button>></div>
<<run addHoverTooltip('remove-cage-btn', 'Not enough money')>>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set $player.money -= 1200>>
<<run $player.characterEvents.unregisterEvent($player.info.id, "InfectedByEfirium")>>
<<run $player.characterEvents.unregisterEvent($player.info.id, "DayInfectedByEfirium")>>
<<Chat $interactionNpc 'Well, look at you. Seems like you got yourself into some trouble. Let me guess - an Etheriant put you through the wringer.'>>
<<Chat $player 'I need the treatment. Now.'>>
<<ChatMessage 'Damian leans back, exhaling a cloud of smoke before smirking.'>>
<<Chat $interactionNpc 'Of course you do. But you know how this works - nothing comes free.'>>
<<ChatMessage 'He reaches into a drawer and pulls out a sleek black case, flipping it open to reveal a single vial of dark liquid.'>>
<<ChatMessage 'Damian takes the money with a knowing smirk, sliding the vial across the table.'>>
<<Chat $interactionNpc 'Pleasure doing business. Drink up before you start glowing in the dark. And next time… try not to lose.'>>
<div class="padding-top">
<div class="btn"><<button "continue" "QuestCharInteraction">><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set $player.money -= 2000>>
<<set $playerlock = false>>
<<Chat $interactionNpc 'That little lock doesn\'t open for free. Two grand.'>>
<<Chat $player 'Fine. Take it off.'>>
<<ChatMessage 'Damian smirks as he pockets your cash, producing a tiny key. With a quick click, the chastity cage opens.'>>
<<Chat $interactionNpc 'There. Try not to end up back in one.'>>
<div class="padding-top">
<div class="btn"><<button "continue" "QuestCharInteraction">><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if $player.attributes.speech.value > $interactionNpc.attributes.speech.value>>
<div class="btn padding-top"><<button "Offer to pay the debt" "NPC_DebtorDeal_PayDebt">><</button>></div>
<<else>>
<div class="btn non-interacting padding-top" id="offer-pay-btn"><<button "Offer to pay the debt">><</button>></div>
<<done>>
<<run addHoverTooltip('offer-pay-btn', 'Your speech level is insufficient')>>
<</done>>
<</if>>
<div class="btn padding-top"><<button "Extract the debt by force">><<include "NPC_DebtorDeal_DebtByForce">><</button>></div>
<div class="btn padding-top"><<button "Leave" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ResolveMadDogDebtTaskName>>
<<if getTaskState("mad_dog_quest1", "Return to Mad Dog") == "not found">>
<<run addTaskToQuest("mad_dog_quest1", { description: "Return to Mad Dog", completed: false })>>
<</if>>
<<Chat $interactionNpc 'Alright, I\'ll pay back the debt, just don\'t hurt me'>>
<<ChatMessage 'You have taken the debt from the debtor, now you need to return to Mad Dog'>>
<<run completeTaskByQuestID("mad_dog_quest1", _madDogDebtTaskName)>>
<<if $interactionNpc.saveData instanceof Map>>
<<run $interactionNpc.saveData.delete("madDogDebtor")>>
<<run $interactionNpc.saveData.delete("madDogDebtTaskName")>>
<</if>>
/* The debtor pays out of their own wallet, once (a refresh does not collect twice). */
<<set $debtAmount = setup.npcMoney.collectFrom($interactionNpc, $debtAmount, "maddog-debt:" + $interactionNpc.info.id + ":" + $madDogDebtDueDay)>>
<div class="btn padding-top"><<button "Continue" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
<</nobr>><<nobr>>
<<if $playerInitFight == undefined>>
<<set $playerInitFight = 0>>
<</if>>
<<set $dayFight = getCurrentAbsoluteDay()>>
<<set $playerInitFight += 1>>
<<set _decreaseRelations = Random (-8, -25)>>
<<IncreaseFriendship $player $interactionNpc _decreaseRelations>>
<<set _battleSetControls = {attack: true, seduce: true, items: true, actions: true}>>
<<StartFight $player $interactionNpc _battleSetControls "NPC_DebtorDeal_PayDebt" undefined>>
<</nobr>><<nobr>>
<<switch $interactionNpc.info.questInfo.questCharID >>
<<case 4>>
<<include "Damian_Interactions">>
<</switch>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<run $player.getRelationship($interactionNpc.info.id)>>
<<run $interactionNpc.getRelationship($player.info.id)>>
<<set _questGotoPassage = "">>
<<include "CheckCharacterQuests">>
<<if _questGotoPassage != "">>
<<goto _questGotoPassage>>
<</if>>
<<set $canShowStatsBtn = false>>
<<set $gameSettings.allowSaves = false>>
<<ShowNpcIcon $interactionNpc>>
<<include "NPC_Quest_Stats_Visualize">>
<<include "NPC_Quest_Interactions">>
/* AI talk (story characters with a dossier only; Options → AI turns it on). */
<<if typeof aiQuestChatAvailable === "function" && aiQuestChatAvailable($interactionNpc)>>
<div class="padding-top">
<div class="btn"><<button "💬 Talk" "AiQuestChat">><</button>></div>
</div>
<</if>>
/* <div class="padding-top">
<div class="btn"><<button "Cheats">><<ShowCheats $interactionNpc>><</button>></div>
</div> */
<div class="padding-top">
<div class="btn"><<button "Leave" "NudeCheck">>
<<set $canShowStatsBtn = true>>
<<set $gameSettings.allowSaves = true>>
<</button>></div>
</div>
<</nobr>><<nobr>>
<<run _metrics = $player.getRelationship($interactionNpc.info.id, false)?.metrics ?? { friendship: 0, love: 0, fear: 0 }>>
<<run _Friendship = Math.trunc(_metrics.friendship)>>
<<run _Love = Math.trunc(_metrics.love)>>
<<run _Fear = Math.trunc(_metrics.fear)>>
<<run _Mood = Math.trunc($interactionNpc.behavior.mood.value)>>
<div class="padding-top">
<div class="container-stat-visual">
<div class="row-stat-visual">
<div class="stat-card-stat-visual">
<div class="stat-title-stat-visual">Friendship</div>
<div class="stat-visual-stat-visual">_Friendship/100</div>
</div>
<div class="stat-card-stat-visual">
<div class="stat-title-stat-visual">Love</div>
<div class="stat-visual-stat-visual">_Love/100</div>
</div>
<div class="stat-card-stat-visual">
<div class="stat-title-stat-visual">Fear</div>
<div class="stat-visual-stat-visual">_Fear/100</div>
</div>
<div class="stat-card-stat-visual">
<div class="stat-title-stat-visual">Mood</div>
<div class="stat-visual-stat-visual">_Mood/100</div>
</div>
</div>
</div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
/* Safety: bail out to the classic flow if state was lost */
<<if $sexPhaseState == undefined>>
<<goto "Sex">>
<</if>>
/* Mirror phase state into the legacy vars used by UpdateDomSub/Chat/Cum */
<<set $Pose = $sexPhaseState.pose>>
<<set $playerDom = $sexPhaseState.playerDom>>
<<set $cuni = $sexPhaseState.cuni>>
<<include "UpdateDomSub">>
/* Pick the video pool matching the current pose */
<<switch $sexPhaseState.pose>>
<<case "Vag">>
<<SetVagPick _dom.gender() _sub.gender()>>
<<case "Anal">>
<<SetAnalPick _dom.gender() _sub.gender()>>
<<case "Oral">>
<<SetOralPick _dom.gender() _sub.gender()>>
<<case "Oral(Strap-on)">>
<<SetStrapFacePick _dom.gender() _sub.gender()>>
<<case "Titfuck">>
<<SetTitfuckPic _dom.gender() _sub.gender()>>
<<case "Facefuck">>
<<SetFacefuckPick _dom.gender() _sub.gender()>>
<</switch>>
<<Video _pick>>
/* A5 upgrade: named-stage phase indicator with color-shift + optional pace pulse */
<<set _transitions = { paceChanged: ($sexPhaseLastPace != undefined && $sexPhaseLastPace != $sexPhaseState.pace) }>>
<<= getInteractiveSceneHeaderHtml($sexPhaseState, $interactionNpc, _transitions)>>
<<unset $sexPhaseLastPace>>
/* Render output stashed by SexPhaseApply (SugarCube goto discards the source
passage's DOM, so all narrative from the last action is rendered here). */
<<if $sexPhaseLastApply != undefined>>
<<set _la = $sexPhaseLastApply>>
<<if _la.phaseChanged>>
<div class="scene-transition scene-transition--phase">
Stage: <strong><<print _la.newStage>></strong>
<<if _la.advanceLine != "">>
<br/><span style="font-weight: normal; opacity: 0.9;"><<= _la.advanceLine>></span>
<</if>>
</div>
<</if>>
<<if _la.poseChanged && _la.poseLine != "">>
<div class="scene-transition scene-transition--pose"><<= _la.poseLine>></div>
<</if>>
<<if _la.paceChanged && _la.paceLine != "">>
<div class="scene-transition scene-transition--pace"><<= _la.paceLine>></div>
<</if>>
<<if Array.isArray(_la.discoveries) && _la.discoveries.length > 0>>
<<for _kink range _la.discoveries>>
<div class="scene-transition scene-transition--discovery"><<= getDiscoveryLine($interactionNpc, _kink)>></div>
<</for>>
<</if>>
<<if _la.spankClip>>
<<Video _la.spankClip>>
<</if>>
<<if _la.playerLine != "">>
<<ChatMessage _la.playerLine>>
<<elseif _la.effectMessage != "">>
<<ChatMessage _la.effectMessage>>
<</if>>
<<if _la.npcReply != "" && $interactionNpc != undefined>>
<<Chat $interactionNpc _la.npcReply>>
<</if>>
<<unset $sexPhaseLastApply>>
<</if>>
/* Pose-appropriate rotating narrative line (stage-aware, phase-seeded) */
<<set _poseMsg = getPoseNarrativeLine($sexPhaseState, _dom, _sub)>>
<<if _poseMsg != "">>
<<ChatMessage _poseMsg>>
<</if>>
/* Kink-flavored NPC dialog (only for poses where sexNarration has pools) */
<<if $sexPhaseState.pose == "Vag" || $sexPhaseState.pose == "Anal" || $sexPhaseState.pose == "Oral" || $sexPhaseState.pose == "Oral(Strap-on)">>
<<set _dialogPose = ($sexPhaseState.pose == "Oral(Strap-on)" ? "Oral" : $sexPhaseState.pose)>>
/* A leader without a cock fucks with a strap-on: the stock line must not talk about a cock or cum. */
<<set _dialogExtra = ($cuni ? "Lick" : ($sexPhaseState.pose == "Oral(Strap-on)" ? "Oral(Strap-on)" : ((($sexPhaseState.pose == "Vag" || $sexPhaseState.pose == "Anal") && _dom.genitalia() != "Penis") ? "Strap-on" : "")))>>
<<set _textDialog = getPersonalizedSexDialog($interactionNpc, (_dom.info.isPlayer == false), _dialogPose, "Like", _dialogExtra)>>
/* AI line (aiSexTalk.ts): replaces the stock line if it arrives in time. */
<<set _aiSexInput = {pose: $sexPhaseState.pose, npcLeads: (_dom.info.isPlayer == false), feeling: "Like", extra: _dialogExtra, sexType: $sexType, moment: "turn", stockLine: _textDialog}>>
<div class="ai-sex-line"><<Chat $interactionNpc _textDialog>></div>
<<done>><<run typeof aiSexTalk === "function" && aiSexTalk(_aiSexInput)>><</done>>
<</if>>
/* Actions picked by the state machine. Blocked actions render greyed-out
with a refusal message on click (no passage change); reluctant actions
render with a warning border and still fire the state transition. */
<<set _actions = getAvailableActions($interactionNpc, $player, $sexPhaseState, $sexType)>>
<fieldset>
<legend>Your move</legend>
<div class="btn-container-row">
<<for _action range _actions>>
<<capture _action>>
<<set _btnStyle = "">>
<<if _action.blocked>>
<<set _btnStyle = "opacity: 0.5;">>
<<elseif _action.reluctant>>
<<set _btnStyle = "opacity: 0.85; border-color: #d89b9b;">>
<</if>>
<<set _btnTitle = (_action.reason != undefined && _action.reason != "") ? _action.reason : _action.label>>
<div class="btn btn--small" @style="_btnStyle" @title="_btnTitle">
<<button _action.label>>
<<if _action.blocked && _action.reason>>
/* Refused - show the reason on the next SexPhase render */
<<set _refuseLead = ($interactionNpc != undefined && typeof $interactionNpc.pronoun === 'function') ? ($interactionNpc.pronoun() + " refuses: ") : "They refuse: ">>
<<set $sexPhaseLastApply = {
phaseChanged: false, newStage: "", advanceLine: "",
poseChanged: false, poseLine: "",
paceChanged: false, paceLine: "",
discoveries: [],
effectMessage: _refuseLead + _action.reason,
playerLine: "", npcReply: ""
}>>
<<goto "SexPhase">>
<<else>>
<<set $sexPhaseAction = clone(_action)>>
<<goto "SexPhaseApply">>
<</if>>
<</button>>
</div>
<</capture>>
<</for>>
</div>
</fieldset>
/* Escape hatch */
<<if $sexType != "brothelClientService">>
<div class="padding-top">
<div class="btn">
<<button "Leave" $player.info.currentLocation>>
<<include "SexSystem_CheckSexType">>
<<set $canShowStatsBtn = true>>
<<set $gameSettings.allowSaves = true>>
<<unset $sexType $interactionNpc $passiveSex $playerDom $partnerCum $cumIn $roundCount $maxSexEnd $Pose $cuni $sexPhaseState $sexPhaseAction $sexEntryShown $sexPhaseLastPace $sexPhaseLastApply $sexPhaseFinishLine>>
<</button>>
</div>
</div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "UpdateDomSub">>
/* Bail if either piece of state got dropped */
<<if $sexPhaseState == undefined || $sexPhaseAction == undefined>>
<<goto "Sex">>
<</if>>
<<set _actionId = $sexPhaseAction.id>>
/* Capture prior state for transition detection */
<<set _prev = { phase: $sexPhaseState.currentPhase, pose: $sexPhaseState.pose, pace: $sexPhaseState.pace }>>
<<set _result = applyPhaseAction($sexPhaseState, $sexPhaseAction, $interactionNpc, $player)>>
<<set $sexPhaseState = _result.next>>
/* Roles switched this turn: arousal goes by the new roles, so a partner who
just put on a strap-on gets none of the leader's share. */
<<if $sexPhaseState.playerDom != undefined && $sexPhaseState.playerDom != $playerDom>>
<<set $playerDom = $sexPhaseState.playerDom>>
<<include "UpdateDomSub">>
<</if>>
<<set _effect = _result.effect>>
<<set _discoveries = _result.discoveries>>
<<set _flavor = getPhaseActionFlavor($interactionNpc, $player, _actionId, $sexPhaseState)>>
/* Persist pace-change flag so next SexPhase render can pulse the bar */
<<if $sexPhaseState.pace != _prev.pace>>
<<set $sexPhaseLastPace = _prev.pace>>
<</if>>
/* Stash all the output for rendering in the next passage.
SugarCube <<goto>> discards the source passage's DOM - so we can't render
here; SexPhase picks up $sexPhaseLastApply and renders it. */
<<set $sexPhaseLastApply = {
phaseChanged: $sexPhaseState.currentPhase != _prev.phase,
newStage: "",
advanceLine: "",
poseChanged: $sexPhaseState.pose != _prev.pose,
poseLine: "",
paceChanged: $sexPhaseState.pace != _prev.pace,
paceLine: "",
discoveries: (Array.isArray(_discoveries) ? _discoveries : []),
effectMessage: (_effect.message != undefined ? _effect.message : ""),
playerLine: _flavor.playerLine,
npcReply: _flavor.npcReply
}>>
<<if $sexPhaseLastApply.phaseChanged>>
<<set _stageInfo = getInteractiveStage($sexPhaseState)>>
<<set $sexPhaseLastApply.newStage = _stageInfo.stage>>
<<set $sexPhaseLastApply.advanceLine = getAdvanceLine($sexPhaseState, $interactionNpc)>>
<</if>>
<<if $sexPhaseLastApply.poseChanged>>
<<set $sexPhaseLastApply.poseLine = getPoseTransitionLine(_prev.pose, $sexPhaseState.pose, $interactionNpc, $sexPhaseState)>>
<</if>>
<<if $sexPhaseLastApply.paceChanged>>
<<set $sexPhaseLastApply.paceLine = getPaceChangeLine(_prev.pace, $sexPhaseState.pace, $sexPhaseState, $interactionNpc)>>
<</if>>
/* Spanking a woman gets a clip matched to her skin and breasts (EventMedia.pickSpankClip).
The clips show a woman's bare ass and pussy, so a shemale or a man being spanked gets none. */
<<if _actionId is "spank" and $interactionNpc and $interactionNpc.gender() is "Female">>
<<set $sexPhaseLastApply.spankClip = EventMedia.pickSpankClip($player.gender(), { skin: $interactionNpc.info.skin, breastSize: $interactionNpc.body.breastSize.value })>>
<</if>>
/* Horny delta - sub/dom based on current scene roles */
<<if _effect.hornyGain.sub > 0>>
<<run safeIncreaseHorny(_sub.status.horny, _effect.hornyGain.sub)>>
<</if>>
/* The leader only heats up with a cock, or a pussy being licked: a strap-on
gives its wearer nothing (same rule as _domGetsHorny in the classic flow). */
<<if _effect.hornyGain.dom > 0 && (_dom.genitalia() == "Penis" || ($sexPhaseState.pose == "Oral" && $sexPhaseState.cuni == true))>>
<<run safeIncreaseHorny(_dom.status.horny, _effect.hornyGain.dom)>>
<</if>>
/* Relationship metrics (only versus the actual NPC, not player-self) */
<<if (_effect.loveGain != 0 || _effect.sexGain != 0) && $interactionNpc != undefined && $interactionNpc.info.isPlayer == false>>
<<set _rel = $player.getRelationship($interactionNpc.info.id, true)>>
<<if _rel != undefined && _rel.metrics != undefined>>
<<if _effect.loveGain != 0>>
<<run _rel.metrics.increaseLove(_effect.loveGain)>>
<</if>>
<<if _effect.sexGain != 0>>
<<run _rel.metrics.increaseSex(_effect.sexGain)>>
<</if>>
<</if>>
<</if>>
/* Player lust */
<<if _effect.lustGain != 0>>
<<SetCharProgression $player 'lust' _effect.lustGain true>>
<</if>>
/* Skill gains routed through existing helper */
<<for _gain range _effect.skillGains>>
<<run gainSexExp($player, _gain.skill, _gain.amount)>>
<</for>>
<<unset $sexPhaseAction>>
/* Finish → hand off to the existing climax passage. Store a finish line so
:: Cum can render it at the top. */
<<if shouldEndScene($sexPhaseState)>>
/* The finish lines are the player coming ("You come, breath ragged."): shown
only on the path where the player does, never at a strap-on end. */
<<set _finishLine = getFinishLine($sexPhaseState, $interactionNpc)>>
<<unset $sexPhaseFinishLine>>
<<set $Pose = $sexPhaseState.pose>>
<<set $playerDom = $sexPhaseState.playerDom>>
<<set $cuni = $sexPhaseState.cuni>>
<<unset $sexPhaseState $sexPhaseLastPace $sexPhaseLastApply>>
/* A strap-on gives its wearer no arousal and no orgasm (plan 10.3), the same
rule the classic flow keeps with _domGetsHorny: only a cock, or a pussy
being licked, lets the leading partner come. With a strap-on the one
being fucked comes if they are at their peak; otherwise the scene ends
without anyone's climax effects. */
<<set _leaderClimaxes = _dom.genitalia() == "Penis" || ($Pose == "Oral" && $cuni == true)>>
<<if _leaderClimaxes>>
<<if $playerDom == true>><<set $sexPhaseFinishLine = _finishLine>><</if>>
<<goto "Cum">>
<<elseif ($Pose == "Anal" || $Pose == "Vag") && getHornyVal(_sub.status.horny) >= getHornyMax(_sub.status.horny)>>
<<set $partnerCum = true>>
<<if $playerDom != true>><<set $sexPhaseFinishLine = _finishLine>><</if>>
<<goto "Cum">>
<<else>>
<<goto "SexStrapOnEnd">>
<</if>>
<<else>>
<<goto "SexPhase">>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "UpdateDomSub">>
/* The interactive scene finished with a strap-on and nobody at their peak:
no climax effects for anyone, the wearer included. */
<<if $interactionNpc>><<run onSexWithPartner($interactionNpc.info.id)>><</if>>
<<if $sexPhaseFinishLine != undefined && $sexPhaseFinishLine != "">>
<div class="scene-transition scene-transition--phase"><<= $sexPhaseFinishLine>></div>
<<unset $sexPhaseFinishLine>>
<</if>>
<<if $playerDom == true>>
<<set _poseMsg = "You slide the strap-on free and let " + _sub.info.firstName + " catch " + possessivePronouns(_sub) + " breath.">>
<<else>>
<<set _poseMsg = _dom.info.firstName + " slides the strap-on free and lets you catch your breath.">>
<</if>>
<<ChatMessage _poseMsg>>
/* AI line as the scene ends (aiSexTalk.ts): hidden unless the AI answers in time. */
<<if $interactionNpc != undefined && $interactionNpc.info.isPlayer != true>>
<<set _aiSexInput = {pose: $Pose, npcLeads: (_dom.info.isPlayer == false), sexType: $sexType, moment: "finish"}>>
<div class="ai-sex-line" hidden><<Chat $interactionNpc "...">></div>
<<done>><<run typeof aiSexTalk === "function" && aiSexTalk(_aiSexInput)>><</done>>
<</if>>
<<if $interactionNpc != undefined>>
<<set _b3 = recordSexEncounter($player, $interactionNpc, $sexType)>>
<<if _b3 && _b3.messages && _b3.messages.length > 0>>
<<for _msg range _b3.messages>>
<<ChatMessage _msg>>
<</for>>
<</if>>
<</if>>
<<run $player.dailyEvents.registerEvent($player.info.id, "SexualActivityToday", 1)>>
<div class="padding-top">
<div class="btn">
<<button "Leave" $player.info.currentLocation>>
<<include "SexSystem_CheckSexType">>
<<set $canShowStatsBtn = true>>
<<set $gameSettings.allowSaves = true>>
<<unset $sexType $interactionNpc $passiveSex $playerDom $partnerCum $cumIn $roundCount $maxSexEnd $Pose $cuni $sexPhaseState $sexPhaseAction $sexEntryShown $sexPhaseLastPace $sexPhaseLastApply $sexPhaseFinishLine>>
<</button>>
</div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _charLust = $interactionNpc.attributes.lust.value>>
<<if _charLust <= 1>>
<<set _maxSexCount = 1>>
<<elseif _charLust > 1 && _charLust <= 2>>
<<set _maxSexCount = 2>>
<<elseif _charLust > 2 && _charLust <= 3>>
<<set _maxSexCount = 3>>
<<elseif _charLust > 3 && _charLust <= 5>>
<<set _maxSexCount = 4>>
<<elseif _charLust > 5 && _charLust <= 7>>
<<set _maxSexCount = 5>>
<<elseif _charLust > 7 && _charLust <= 9>>
<<set _maxSexCount = 5>>
<<elseif _charLust > 9>>
<<set _maxSexCount = 6>>
<</if>>
<<if $sexType == "hooker" || $sexType == "Rape">>
<<if $playerlock == true>>
<<goto "PassiveSex">>
<<else>>
<<goto "Sex">>
<</if>>
<<elseif $sexType == "hookerWork">>
<<set $roundCount = 1>>
<<goto "PassiveSex">>
<<elseif $interactionNpc.dailyEvents.getOrRegisterEvent($interactionNpc.info.id, "Sex", 0) < _maxSexCount>>
<<run $interactionNpc.dailyEvents.registerEvent($interactionNpc.info.id, "Sex", 1)>>
<<if $player.attributes.dominance.value < $interactionNpc.attributes.dominance.value || $playerlock == true>>
<<run $roundCount = Random(1,3)>>
<<goto "PassiveSex">>
<<else>>
<<goto "Sex">>
<</if>>
<<else>>
<<set $maxSexEnd = true>>
<<SpendEnergy $player 20>>
<<SpendEnergy $interactionNpc 20>>
<<goto "TrySex">>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set $passiveSex = true>>
<<set $cuni = false>>
<<if $roundCount <= 0 && $sexType != "hooker" && $sexType != "hookerWork">>
<<set $endSexByRoundCount = true>>
<<goto "TrySex">>
<</if>>
<fieldset>
<legend>Sex(Passive)</legend>
<div class="btn-container-row">
<div class="btn btn--small">
<<button "Sex" "TrySex">><<include "SetPassiveSexPose">>
<</button>></div>
</div>
</fieldset>
<<if $sexType != "hookerWork" && $sexType != "Porn Shoot" && $sexType != "Porn Shoot (PlayerTransform)" && $sexType != "brothelClientService" && $sexType != "dinerHookup">>
<div class="padding-top">
<div class="btn"><<button "Back" $player.info.currentLocation>>
<<if $sexType == "OneSex (Destroy)">>
<<run $Characters.splice($indexNPC, 1)>>
<</if>>
<<SetSaveBtn true>>
<<set $passiveSex = false>>
<<unset $sexType $interactionNpc $passiveSex $playerDom $partnerCum $cumIn $roundCount $maxSexEnd $Pose $cuni>>
<</button>></div>
</div>
<<elseif $sexType == "brothelClientService">>
<div class="padding-top">
<p style="color: #e91e63; font-style: italic; text-align: center;">💋 You must satisfy the client before leaving.</p>
</div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set $cuni = false>>
<<set $passiveSex = false>>
/* Consent gating: brothel limits take priority; otherwise derive from preferences/kinks/relationship.
Skipped for non-consensual sextypes (hooker/rape/brothelClient/porn). */
/* Active = player dominates, NPC is receiver for most poses (Oral is reversed
inside getNpcSexConsent via role). Passive = NPC dominates - NPC is now the
giver for vag/anal/titfuck and the receiver for oral. */
<<set _vagBlocked = false>><<set _vagReason = "">><<set _vagReluctant = false>><<set _vagHint = "">>
<<set _analBlocked = false>><<set _analReason = "">><<set _analReluctant = false>><<set _analHint = "">>
<<set _oralBlocked = false>><<set _oralReason = "">><<set _oralReluctant = false>><<set _oralHint = "">>
<<set _vagBlockedP = false>><<set _vagReasonP = "">><<set _vagReluctantP = false>><<set _vagHintP = "">>
<<set _analBlockedP = false>><<set _analReasonP = "">><<set _analReluctantP = false>><<set _analHintP = "">>
<<set _oralBlockedP = false>><<set _oralReasonP = "">><<set _oralReluctantP = false>><<set _oralHintP = "">>
<<if shouldApplyConsentChecks($sexType)>>
/* Active role (player dom): NPC is receiver for Vag/Anal/Titfuck, giver for Oral */
<<set _vagConsent = getNpcSexConsent($interactionNpc, $player, "vaginal", "receive")>>
<<if _vagConsent && _vagConsent.allowed === false>>
<<set _vagBlocked = true>>
<<set _vagReason = _vagConsent.reason || "Not allowed">>
<<set _vagHint = _vagConsent.hint || "">>
<<elseif _vagConsent && _vagConsent.reluctant === true>>
<<set _vagReluctant = true>>
<<set _vagReason = _vagConsent.reason || "They agree, but reluctantly.">>
<</if>>
<<set _analConsent = getNpcSexConsent($interactionNpc, $player, "anal", "receive")>>
<<if _analConsent && _analConsent.allowed === false>>
<<set _analBlocked = true>>
<<set _analReason = _analConsent.reason || "Not allowed">>
<<set _analHint = _analConsent.hint || "">>
<<elseif _analConsent && _analConsent.reluctant === true>>
<<set _analReluctant = true>>
<<set _analReason = _analConsent.reason || "They agree, but reluctantly.">>
<</if>>
<<set _oralConsent = getNpcSexConsent($interactionNpc, $player, "oral", "give")>>
<<if _oralConsent && _oralConsent.allowed === false>>
<<set _oralBlocked = true>>
<<set _oralReason = _oralConsent.reason || "Not allowed">>
<<set _oralHint = _oralConsent.hint || "">>
<<elseif _oralConsent && _oralConsent.reluctant === true>>
<<set _oralReluctant = true>>
<<set _oralReason = _oralConsent.reason || "They agree, but reluctantly.">>
<</if>>
/* Passive role (NPC dom): NPC is giver for Vag/Anal, receiver for Oral */
<<set _vagConsentP = getNpcSexConsent($interactionNpc, $player, "vaginal", "give")>>
<<if _vagConsentP && _vagConsentP.allowed === false>>
<<set _vagBlockedP = true>>
<<set _vagReasonP = _vagConsentP.reason || "Not allowed">>
<<set _vagHintP = _vagConsentP.hint || "">>
<<elseif _vagConsentP && _vagConsentP.reluctant === true>>
<<set _vagReluctantP = true>>
<<set _vagReasonP = _vagConsentP.reason || "They agree, but reluctantly.">>
<</if>>
<<set _analConsentP = getNpcSexConsent($interactionNpc, $player, "anal", "give")>>
<<if _analConsentP && _analConsentP.allowed === false>>
<<set _analBlockedP = true>>
<<set _analReasonP = _analConsentP.reason || "Not allowed">>
<<set _analHintP = _analConsentP.hint || "">>
<<elseif _analConsentP && _analConsentP.reluctant === true>>
<<set _analReluctantP = true>>
<<set _analReasonP = _analConsentP.reason || "They agree, but reluctantly.">>
<</if>>
<<set _oralConsentP = getNpcSexConsent($interactionNpc, $player, "oral", "receive")>>
<<if _oralConsentP && _oralConsentP.allowed === false>>
<<set _oralBlockedP = true>>
<<set _oralReasonP = _oralConsentP.reason || "Not allowed">>
<<set _oralHintP = _oralConsentP.hint || "">>
<<elseif _oralConsentP && _oralConsentP.reluctant === true>>
<<set _oralReluctantP = true>>
<<set _oralReasonP = _oralConsentP.reason || "They agree, but reluctantly.">>
<</if>>
<</if>>
/* Tooltip helpers: include hint in parentheses when present. */
<<set _vagTooltip = _vagReason + (_vagHint ? " (" + _vagHint + ")" : "")>>
<<set _analTooltip = _analReason + (_analHint ? " (" + _analHint + ")" : "")>>
<<set _oralTooltip = _oralReason + (_oralHint ? " (" + _oralHint + ")" : "")>>
<<set _vagTooltipP = _vagReasonP + (_vagHintP ? " (" + _vagHintP + ")" : "")>>
<<set _analTooltipP = _analReasonP + (_analHintP ? " (" + _analHintP + ")" : "")>>
<<set _oralTooltipP = _oralReasonP + (_oralHintP ? " (" + _oralHintP + ")" : "")>>
/* Pre-compute refusal messages */
<<set _refuseVerb = ($interactionNpc != undefined && typeof $interactionNpc.pronoun === 'function') ? ($interactionNpc.pronoun() + " refuses: ") : "They refuse: ">>
<<set _vagRefuseMsg = _refuseVerb + _vagReason>>
<<set _analRefuseMsg = _refuseVerb + _analReason>>
<<set _oralRefuseMsg = _refuseVerb + _oralReason>>
<<set _vagRefuseMsgP = _refuseVerb + _vagReasonP>>
<<set _analRefuseMsgP = _refuseVerb + _analReasonP>>
<<set _oralRefuseMsgP = _refuseVerb + _oralReasonP>>
/* A refusal/reluctant reaction reveals the matching role-specific dislike. */
<<if shouldApplyConsentChecks($sexType)>>
<<if (_vagBlocked || _vagReluctant) && hasKinkDislike($interactionNpc, "VaginalReceive")>>
<<run confirmKinkPreference($player, $interactionNpc.info.id, "VaginalReceive")>>
<</if>>
<<if (_vagBlockedP || _vagReluctantP) && hasKinkDislike($interactionNpc, "VaginalGive")>>
<<run confirmKinkPreference($player, $interactionNpc.info.id, "VaginalGive")>>
<</if>>
<<if (_analBlocked || _analReluctant) && hasKinkDislike($interactionNpc, "AnalReceive")>>
<<run confirmKinkPreference($player, $interactionNpc.info.id, "AnalReceive")>>
<</if>>
<<if (_analBlockedP || _analReluctantP) && hasKinkDislike($interactionNpc, "AnalGive")>>
<<run confirmKinkPreference($player, $interactionNpc.info.id, "AnalGive")>>
<</if>>
<<if (_oralBlocked || _oralReluctant) && hasKinkDislike($interactionNpc, "OralGive")>>
<<run confirmKinkPreference($player, $interactionNpc.info.id, "OralGive")>>
<</if>>
<<if (_oralBlockedP || _oralReluctantP) && hasKinkDislike($interactionNpc, "OralReceive")>>
<<run confirmKinkPreference($player, $interactionNpc.info.id, "OralReceive")>>
<</if>>
<</if>>
/* A1: One-time entry narration per scene, only for consensual sextypes */
<<if shouldApplyConsentChecks($sexType) && $sexEntryShown != true>>
<<set _entryLine = getSexEntryNarration($interactionNpc, $player, $sexType)>>
<<if _entryLine != "">>
<<ChatMessage _entryLine>>
<</if>>
<<set $sexEntryShown = true>>
<</if>>
/* A3: scene phase indicator (player-facing pacing cue) */
<<set _scenePhaseHtml = getDualScenePhaseHtml($player, $interactionNpc)>>
<<if _scenePhaseHtml != "">><<= _scenePhaseHtml>><</if>>
/* A5: Interactive scene entry - only for consensual sextypes and only when the
player can take the dom role. Classic flow below is kept intact so nothing
existing breaks if the setting stays off. */
<<if $gameSettings.interactiveScenes === true && shouldApplyConsentChecks($sexType) && $playerlock != true>>
<fieldset style="border: 2px solid #e91e63; border-radius: 8px; margin-bottom: 10px;">
<legend>✨ Interactive Scene</legend>
<p style="font-size: 12px; color: #bbb; margin: 4px 0 8px;">Phase-by-phase with mid-scene choices. Refused poses show 🚫; reluctant poses a warning.</p>
/* Active role (player dom) - NPC is on the receiving end */
<div style="font-size: 11px; color: #ffbe45; margin: 6px 0 4px;">Active - you lead</div>
<div class="btn-container-row">
<<if $interactionNpc.genitalia() == "Vagina">>
<<if _vagBlocked>>
<div class="btn btn--small" style="opacity: 0.5;" @title="_vagTooltip"><<button "Start - Vaginal 🚫">><<ChatMessage _vagRefuseMsg>><</button>></div>
<<elseif _vagReluctant>>
<div class="btn btn--small" style="opacity: 0.75; border-color: #d89b9b;" @title="_vagTooltip">
<<button "Start - Vaginal (reluctant)">>
<<set $playerDom = true>>
<<set $Pose = "Vag">>
<<set $cuni = false>>
<<set $sexPhaseState = createSexPhaseState({ npc: $interactionNpc, pose: "Vag", playerDom: true, cuni: false })>>
<<ChatMessage _vagReason>>
<<goto "SexPhase">>
<</button>>
</div>
<<else>>
<div class="btn btn--small" @title="_vagTooltip">
<<button "Start - Vaginal">>
<<set $playerDom = true>>
<<set $Pose = "Vag">>
<<set $cuni = false>>
<<set $sexPhaseState = createSexPhaseState({ npc: $interactionNpc, pose: "Vag", playerDom: true, cuni: false })>>
<<goto "SexPhase">>
<</button>>
</div>
<</if>>
<</if>>
<<if _analBlocked>>
<div class="btn btn--small" style="opacity: 0.5;" @title="_analTooltip"><<button "Start - Anal 🚫">><<ChatMessage _analRefuseMsg>><</button>></div>
<<elseif _analReluctant>>
<div class="btn btn--small" style="opacity: 0.75; border-color: #d89b9b;" @title="_analTooltip">
<<button "Start - Anal (reluctant)">>
<<set $playerDom = true>>
<<set $Pose = "Anal">>
<<set $cuni = false>>
<<set $sexPhaseState = createSexPhaseState({ npc: $interactionNpc, pose: "Anal", playerDom: true, cuni: false })>>
<<ChatMessage _analReason>>
<<goto "SexPhase">>
<</button>>
</div>
<<else>>
<div class="btn btn--small" @title="_analTooltip">
<<button "Start - Anal">>
<<set $playerDom = true>>
<<set $Pose = "Anal">>
<<set $cuni = false>>
<<set $sexPhaseState = createSexPhaseState({ npc: $interactionNpc, pose: "Anal", playerDom: true, cuni: false })>>
<<goto "SexPhase">>
<</button>>
</div>
<</if>>
<<if _oralBlocked>>
<div class="btn btn--small" style="opacity: 0.5;" @title="_oralTooltip"><<button "Start - Oral 🚫">><<ChatMessage _oralRefuseMsg>><</button>></div>
<<elseif _oralReluctant>>
<div class="btn btn--small" style="opacity: 0.75; border-color: #d89b9b;" @title="_oralTooltip">
<<button "Start - Oral (reluctant)">>
<<set $playerDom = true>>
<<set $Pose = "Oral">>
<<set $cuni = ($player.genitalia() == "Vagina")>>
<<set $sexPhaseState = createSexPhaseState({ npc: $interactionNpc, pose: "Oral", playerDom: true, cuni: ($player.genitalia() == "Vagina") })>>
<<ChatMessage _oralReason>>
<<goto "SexPhase">>
<</button>>
</div>
<<else>>
<div class="btn btn--small" @title="_oralTooltip">
<<button "Start - Oral">>
<<set $playerDom = true>>
<<set $Pose = "Oral">>
<<set $cuni = ($player.genitalia() == "Vagina")>>
<<set $sexPhaseState = createSexPhaseState({ npc: $interactionNpc, pose: "Oral", playerDom: true, cuni: ($player.genitalia() == "Vagina") })>>
<<goto "SexPhase">>
<</button>>
</div>
<</if>>
</div>
/* Passive role (NPC dom) - player is on the receiving end */
<<set _passiveLead = "they lead">>
<<if $interactionNpc != undefined && typeof $interactionNpc.pronoun === 'function'>>
<<set _passiveLead = $interactionNpc.pronoun().toLowerCase() + " leads">>
<</if>>
<div style="font-size: 11px; color: #80deea; margin: 10px 0 4px;">Passive - <<print _passiveLead>></div>
<div class="btn-container-row">
<<if $player.genitalia() == "Vagina">>
<<if _vagBlockedP>>
<div class="btn btn--small" style="opacity: 0.5;" @title="_vagTooltipP"><<button "Start - Vaginal (passive) 🚫">><<ChatMessage _vagRefuseMsgP>><</button>></div>
<<elseif _vagReluctantP>>
<div class="btn btn--small" style="opacity: 0.75; border-color: #d89b9b;" @title="_vagTooltipP">
<<button "Start - Vaginal (passive, reluctant)">>
<<set $playerDom = false>>
<<set $Pose = "Vag">>
<<set $cuni = false>>
<<set $sexPhaseState = createSexPhaseState({ npc: $interactionNpc, pose: "Vag", playerDom: false, cuni: false })>>
<<ChatMessage _vagReasonP>>
<<goto "SexPhase">>
<</button>>
</div>
<<else>>
<div class="btn btn--small" @title="_vagTooltipP">
<<button "Start - Vaginal (passive)">>
<<set $playerDom = false>>
<<set $Pose = "Vag">>
<<set $cuni = false>>
<<set $sexPhaseState = createSexPhaseState({ npc: $interactionNpc, pose: "Vag", playerDom: false, cuni: false })>>
<<goto "SexPhase">>
<</button>>
</div>
<</if>>
<</if>>
<<if _analBlockedP>>
<div class="btn btn--small" style="opacity: 0.5;" @title="_analTooltipP"><<button "Start - Anal (passive) 🚫">><<ChatMessage _analRefuseMsgP>><</button>></div>
<<elseif _analReluctantP>>
<div class="btn btn--small" style="opacity: 0.75; border-color: #d89b9b;" @title="_analTooltipP">
<<button "Start - Anal (passive, reluctant)">>
<<set $playerDom = false>>
<<set $Pose = "Anal">>
<<set $cuni = false>>
<<set $sexPhaseState = createSexPhaseState({ npc: $interactionNpc, pose: "Anal", playerDom: false, cuni: false })>>
<<ChatMessage _analReasonP>>
<<goto "SexPhase">>
<</button>>
</div>
<<else>>
<div class="btn btn--small" @title="_analTooltipP">
<<button "Start - Anal (passive)">>
<<set $playerDom = false>>
<<set $Pose = "Anal">>
<<set $cuni = false>>
<<set $sexPhaseState = createSexPhaseState({ npc: $interactionNpc, pose: "Anal", playerDom: false, cuni: false })>>
<<goto "SexPhase">>
<</button>>
</div>
<</if>>
<<if _oralBlockedP>>
<div class="btn btn--small" style="opacity: 0.5;" @title="_oralTooltipP"><<button "Start - Oral (passive) 🚫">><<ChatMessage _oralRefuseMsgP>><</button>></div>
<<elseif _oralReluctantP>>
<div class="btn btn--small" style="opacity: 0.75; border-color: #d89b9b;" @title="_oralTooltipP">
<<button "Start - Oral (passive, reluctant)">>
<<set $playerDom = false>>
<<set $Pose = "Oral">>
<<set $cuni = ($interactionNpc.genitalia() == "Vagina")>>
<<set $sexPhaseState = createSexPhaseState({ npc: $interactionNpc, pose: "Oral", playerDom: false, cuni: ($interactionNpc.genitalia() == "Vagina") })>>
<<ChatMessage _oralReasonP>>
<<goto "SexPhase">>
<</button>>
</div>
<<else>>
<div class="btn btn--small" @title="_oralTooltipP">
<<button "Start - Oral (passive)">>
<<set $playerDom = false>>
<<set $Pose = "Oral">>
<<set $cuni = ($interactionNpc.genitalia() == "Vagina")>>
<<set $sexPhaseState = createSexPhaseState({ npc: $interactionNpc, pose: "Oral", playerDom: false, cuni: ($interactionNpc.genitalia() == "Vagina") })>>
<<goto "SexPhase">>
<</button>>
</div>
<</if>>
</div>
</fieldset>
<</if>>
<div class="grid-row-twice">
<<if $playerlock != true>>
<fieldset>
<legend>Sex(Active)</legend>
<div class="btn-container-row">
<<if $interactionNpc.genitalia() == "Vagina">>
<<if _vagBlocked>>
<div class="btn btn--small" style="opacity: 0.5;" @title="_vagTooltip"><<button "Vaginal (🚫)">><<ChatMessage _vagRefuseMsg>><</button>></div>
<<elseif _vagReluctant>>
<div class="btn btn--small" style="opacity: 0.75; border-color: #d89b9b;" @title="_vagTooltip"><<button "Vaginal (reluctant)" "TrySex">><<set $playerDom = true>><<set $Pose = "Vag">><<ChatMessage _vagReason>><</button>></div>
<<else>>
<div class="btn btn--small"><<button "Vaginal" "TrySex">><<set $playerDom = true>><<set $Pose = "Vag">><</button>></div>
<</if>>
<</if>>
<<if _analBlocked>>
<div class="btn btn--small" style="opacity: 0.5;" @title="_analTooltip"><<button "Anal (🚫)">><<ChatMessage _analRefuseMsg>><</button>></div>
<<elseif _analReluctant>>
<div class="btn btn--small" style="opacity: 0.75; border-color: #d89b9b;" @title="_analTooltip"><<button "Anal (reluctant)" "TrySex">><<set $playerDom = true>><<set $Pose = "Anal">><<ChatMessage _analReason>><</button>></div>
<<else>>
<div class="btn btn--small"><<button "Anal" "TrySex">><<set $playerDom = true>><<set $Pose = "Anal">><</button>></div>
<</if>>
<<if _oralBlocked>>
<div class="btn btn--small" style="opacity: 0.5;" @title="_oralTooltip"><<button "Oral (🚫)">><<ChatMessage _oralRefuseMsg>><</button>></div>
<<elseif _oralReluctant>>
<div class="btn btn--small" style="opacity: 0.75; border-color: #d89b9b;" @title="_oralTooltip"><<button "Oral (reluctant)" "TrySex">><<set $playerDom = true>><<set $Pose = "Oral">><<set $cuni = $player.genitalia() == "Vagina">><<ChatMessage _oralReason>><</button>></div>
<<else>>
<div class="btn btn--small"><<button "Oral" "TrySex">><<set $playerDom = true>><<set $Pose = "Oral">><<set $cuni = $player.genitalia() == "Vagina">><</button>></div>
<</if>>
<<if $player.genitalia() == "Vagina">>
<div class="btn btn--small"><<button "Oral(Strap-on)" "TrySex">><<set $playerDom = true>><<set $Pose = "Oral(Strap-on)">><</button>></div>
<</if>>
<<if $player.genitalia() == "Penis" && $interactionNpc.body.breastSize.value >= 3>>
<div class="btn btn--small"><<button "Titfuck" "TrySex">><<set $playerDom = true>><<set $Pose = "Titfuck">><</button>></div>
<</if>>
</div>
</fieldset>
<<else>>
<<ChatMessage "You're locked in a chastity cage and can't take an active role.">>
<</if>>
<fieldset>
<legend>Sex(Passive)</legend>
<div class="btn-container-row">
<<set _refuseVerbP = ($interactionNpc != undefined && typeof $interactionNpc.pronoun === 'function') ? ($interactionNpc.pronoun() + " refuses: ") : "They refuse: ">>
<<set _vagRefuseMsgP = _refuseVerbP + _vagReasonP>>
<<set _analRefuseMsgP = _refuseVerbP + _analReasonP>>
<<set _oralRefuseMsgP = _refuseVerbP + _oralReasonP>>
<<if $player.genitalia() == "Vagina">>
<<if _vagBlockedP>>
<div class="btn btn--small" style="opacity: 0.5;" @title="_vagTooltipP"><<button "Vaginal (🚫)">><<ChatMessage _vagRefuseMsgP>><</button>></div>
<<elseif _vagReluctantP>>
<div class="btn btn--small" style="opacity: 0.75; border-color: #d89b9b;" @title="_vagTooltipP"><<button "Vaginal (reluctant)" "TrySex">><<set $playerDom = false>><<set $Pose = "Vag">><<ChatMessage _vagReasonP>><</button>></div>
<<else>>
<div class="btn btn--small"><<button "Vaginal" "TrySex">><<set $playerDom = false>><<set $Pose = "Vag">><</button>></div>
<</if>>
<</if>>
<<if _analBlockedP>>
<div class="btn btn--small" style="opacity: 0.5;" @title="_analTooltipP"><<button "Anal (🚫)">><<ChatMessage _analRefuseMsgP>><</button>></div>
<<elseif _analReluctantP>>
<div class="btn btn--small" style="opacity: 0.75; border-color: #d89b9b;" @title="_analTooltipP"><<button "Anal (reluctant)" "TrySex">><<set $playerDom = false>><<set $Pose = "Anal">><<ChatMessage _analReasonP>><</button>></div>
<<else>>
<div class="btn btn--small"><<button "Anal" "TrySex">><<set $playerDom = false>><<set $Pose = "Anal">><</button>></div>
<</if>>
<<if _oralBlockedP>>
<div class="btn btn--small" style="opacity: 0.5;" @title="_oralTooltipP"><<button "Oral (🚫)">><<ChatMessage _oralRefuseMsgP>><</button>></div>
<<elseif _oralReluctantP>>
<div class="btn btn--small" style="opacity: 0.75; border-color: #d89b9b;" @title="_oralTooltipP"><<button "Oral (reluctant)" "TrySex">><<set $playerDom = false>><<set $Pose = "Oral">><<set $cuni = $interactionNpc.genitalia() == "Vagina">><<ChatMessage _oralReasonP>><</button>></div>
<<else>>
<div class="btn btn--small"><<button "Oral" "TrySex">><<set $playerDom = false>><<set $Pose = "Oral">><<set $cuni = $interactionNpc.genitalia() == "Vagina">><</button>></div>
<</if>>
<<if $interactionNpc.genitalia() == "Vagina">>
<<if _oralBlockedP>>
<div class="btn btn--small" style="opacity: 0.5;" @title="_oralTooltipP"><<button "Oral(Strap-on) (🚫)">><<ChatMessage _oralRefuseMsgP>><</button>></div>
<<else>>
<div class="btn btn--small"><<button "Oral(Strap-on)" "TrySex">><<set $playerDom = false>><<set $Pose = "Oral(Strap-on)">><</button>></div>
<</if>>
<</if>>
<<if $interactionNpc.genitalia() == "Penis" && $player.body.breastSize.value >= 3>>
<div class="btn btn--small"><<button "Titfuck" "TrySex">><<set $playerDom = false>><<set $Pose = "Titfuck">><</button>></div>
<</if>>
</div>
</fieldset>
</div>
<<if $sexType != "brothelClientService">>
<<SexSceneAfterglow>>
<div class="btn padding-top"><<button "Leave" $player.info.currentLocation>>
<<include "SexSystem_CheckSexType">>
<<set $canShowStatsBtn = true>> <<set $gameSettings.allowSaves = true>>
<<unset $sexType $interactionNpc $passiveSex $playerDom $partnerCum $cumIn $roundCount $maxSexEnd $Pose $cuni>>
<</button>></div>
<<else>>
<div class="padding-top">
<p style="color: #e91e63; font-style: italic; text-align: center;">💋 You must satisfy the client before leaving.</p>
</div>
<</if>>
<</nobr>><<nobr>>
<<if $sexType == "nightclub_sex">>
<<DeleteCharacter $interactionNpc>>
<<elseif $sexType == "dinerHookup">>
/* Feature 11 - the diner back-room client is a disposable NPC; remove it once the scene ends. */
<<DeleteCharacter $interactionNpc>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
/* Check if player ran out of energy during brothel client service */
<<if $sexType == "brothelClientService" && $player.status.energy.value <= 0>>
/* Player is out of energy - client leaves angry without paying */
<<ChatMessage "You're too exhausted to continue... your body gives out.">>
<div class="btn padding-top" style="background: linear-gradient(135deg, #f44336 0%, #d32f2f 100%); border-radius: 10px;">
<<button "😠 Client leaves angry..." "BrothelMasterRoom_ClientAngry">>
<<unset $sexType $interactionNpc $passiveSex $playerDom $partnerCum $cumIn $roundCount $maxSexEnd $Pose $cuni>>
<</button>>
</div>
<<elseif $playerDom == true && $player.genitalia() == "Penis" && $player.status.potency.value == 0 && $sexType != "hooker" && $sexType != "hookerWork" && $sexType != "brothelClientService">>
<<ChatMessage "I need a break.">>
<<SexSceneAfterglow>>
<div class="btn padding-top"><<button "Leave" $player.info.currentLocation>>
<<include "SexSystem_CheckSexType">>
<<set $canShowStatsBtn = true>> <<set $gameSettings.allowSaves = true>>
<<unset $sexType $interactionNpc $passiveSex $playerDom $partnerCum $cumIn $roundCount $maxSexEnd $Pose $cuni>>
<</button>></div>
<<elseif $playerDom == true && $player.genitalia() == "Penis" && $player.status.potency.value == 0 && $sexType == "brothelClientService">>
/* Player is out of potency - client leaves angry without paying */
<<ChatMessage "You're completely exhausted and can't continue...">>
<div class="btn padding-top" style="background: linear-gradient(135deg, #f44336 0%, #d32f2f 100%);">
<<button "😠 Client leaves angry..." "BrothelMasterRoom_ClientAngry">>
<<unset $sexType $interactionNpc $passiveSex $playerDom $partnerCum $cumIn $roundCount $maxSexEnd $Pose $cuni>>
<</button>>
</div>
<<elseif $playerDom == false && $interactionNpc.genitalia() == "Penis" && $interactionNpc.status.potency.value == 0 && $sexType != "hooker" && $sexType != "hookerWork" && $sexType != "Rape" && $sexType != "brothelClientService">>
<<Chat $interactionNpc "Sorry, babe, I need a break.">>
<<SexSceneAfterglow>>
<div class="btn padding-top"><<button "Leave" $player.info.currentLocation>>
<<include "SexSystem_CheckSexType">>
<<set $canShowStatsBtn = true>> <<set $gameSettings.allowSaves = true>>
<<unset $sexType $interactionNpc $passiveSex $playerDom $partnerCum $cumIn $roundCount $maxSexEnd $Pose $cuni>>
<</button>></div>
<<elseif $playerDom == false && $interactionNpc.genitalia() == "Penis" && $interactionNpc.status.potency.value == 0 && $sexType == "brothelClientService">>
/* Client (NPC) is out of potency - they came, service complete! */
<<ChatMessage "The client is completely satisfied!">>
<div class="btn" style="background: linear-gradient(135deg, #4CAF50 0%, #8BC34A 100%); margin-top: 10px;">
<<button "💰 Collect Payment" "BrothelMasterRoom_ClientFinished">>
<<unset $sexType $interactionNpc $passiveSex $playerDom $partnerCum $cumIn $roundCount $maxSexEnd $Pose $cuni>>
<</button>>
</div>
<<elseif $endSexByRoundCount == true && $sexType != "Rape" && $sexType != "brothelClientService">>
<<unset $endSexByRoundCount>>
<<Chat $interactionNpc "It was fun, I'll see you around.">>
<<SexSceneAfterglow>>
<div class="btn padding-top"><<button "Leave" $player.info.currentLocation>>
<<include "SexSystem_CheckSexType">>
<<set $canShowStatsBtn = true>> <<set $gameSettings.allowSaves = true>>
<<unset $sexType $interactionNpc $passiveSex $playerDom $partnerCum $cumIn $roundCount $maxSexEnd $Pose $cuni>>
<</button>></div>
<<elseif $endSexByRoundCount == true && $sexType == "brothelClientService">>
/* Brothel client service - ignore round count, continue until client cums */
<<unset $endSexByRoundCount>>
<<goto "SexPose">>
<<elseif $maxSexEnd == true && $sexType != "Rape" && $sexType != "brothelClientService">>
<<unset $maxSexEnd>>
<<Chat $interactionNpc "I'm sorry, baby, I don't want to do this anymore tonight. How about tomorrow?">>
<<SexSceneAfterglow>>
<div class="btn padding-top"><<button "Leave" $player.info.currentLocation>>
<<include "SexSystem_CheckSexType">>
<<set $canShowStatsBtn = true>> <<set $gameSettings.allowSaves = true>>
<<unset $sexType $interactionNpc $passiveSex $playerDom $partnerCum $cumIn $roundCount $maxSexEnd $Pose $cuni>>
<</button>></div>
<<elseif $maxSexEnd == true && $sexType == "brothelClientService">>
/* Brothel client service - ignore max sex, continue until client cums */
<<unset $maxSexEnd>>
<<goto "SexPose">>
<<elseif $Pose == "Anal" && $sexType != "Rape" && $sexType != "hooker" && $sexType != "hookerWork" && $playerDom == true && $interactionNpc.attributes.lust.value < -7>>
<<goto "NotReady">>
<<else>>
<<goto "SexPose">>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if $Pose == "Anal">>
<<ChatMessage 'Lust level is below 70.'>>
<<elseif $Pose == "Facefuck">>
<<ChatMessage 'Lust level is below 50.'>>
<</if>>
<<Chat $interactionNpc "I'm not ready for this yet.">>
<div style="margin-top: 10px;">
<div class="btn"><<button "Continue" "Sex">><<unset $Pose>><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "UpdateDomSub">>
<<include "StretcHole">>
<<switch $Pose>>
<<case "Anal">>
<<set _hole = _sub.body.anusSize.value>>
<<SetAnalPick _dom.gender() _sub.gender()>>
<<if $playerDom == true>>
<<set _poseMsg = "You're fucking " + _sub.info.firstName + " in the ass.">>
<<else>>
<<set _poseMsg = _dom.info.firstName + " is fucking your ass.">>
<</if>>
<<case "Oral">>
<<SetOralPick _dom.gender() _sub.gender()>>
<<if $cuni == true>>
<<if $playerDom == true>>
<<set _poseMsg = _sub.info.firstName + " licks your pussy.">>
<<else>>
<<set _poseMsg = "You're licking " + _dom.info.firstName + "\'s pussy.">>
<</if>>
<<else>>
<<if $playerDom == true>>
<<if _dom.genitalia() == "Penis">>
<<set _poseMsg = _sub.info.firstName + " sucks your cock.">>
<<else>>
<<set _poseMsg = _sub.info.firstName + " pleasures you with " + possessivePronouns(_sub) + " mouth.">>
<</if>>
<<else>>
<<if _dom.genitalia() == "Penis">>
<<set _poseMsg = "You're sucking " + _dom.info.firstName + "\'s cock.">>
<<else>>
<<set _poseMsg = "You're pleasuring " + _dom.info.firstName + " with your mouth.">>
<</if>>
<</if>>
<</if>>
<<if _dom.gender() != "Female">>
<<set _canFacefuck = true>>
<</if>>
<<run _addInfo = ($cuni == true ? "Lick" : "")>>
<<case "Oral(Strap-on)">>
<<SetStrapFacePick _dom.gender() _sub.gender()>>
<<set _canFacefuck = true>>
<<if $playerDom == true>>
<<set _poseMsg = _sub.info.firstName + " sucks your Strap-on.">>
<<else>>
<<set _poseMsg = "You're sucking " + _dom.info.firstName + "\'s Strap-on.">>
<</if>>
<<run _addInfo = "Oral(Strap-on)">>
<<case "Facefuck">>
<<SetFacefuckPick _dom.gender() _sub.gender()>>
<<if $playerDom == true>>
<<set _poseMsg = "You're fucking " + _sub.info.firstName + " in the throat.">>
<<else>>
<<set _poseMsg = _dom.info.firstName + " is fucking your throat.">>
<</if>>
<<case "Vag">>
<<set _hole = _sub.body.vaginaSize.value>>
<<SetVagPick _dom.gender() _sub.gender()>>
<<if $playerDom == true>>
<<set _poseMsg = "You're fucking " + _sub.info.firstName + " in the pussy.">>
<<else>>
<<set _poseMsg = _dom.info.firstName + " is fucking your pussy.">>
<</if>>
<<case "Titfuck">>
<<SetTitfuckPic _dom.gender() _sub.gender()>>
<<if $playerDom == true>>
<<set _poseMsg = "You're fucking " + _sub.info.firstName + "'s tits.">>
<<else>>
<<set _poseMsg = _dom.info.firstName + " is fucking your tits.">>
<</if>>
<</switch>>
/* Sexual experience per round */
<<switch $Pose>>
<<case "Anal">>
<<run gainSexExp($player, "analSkill", Random(2,4))>>
<<run gainSexExp($player, "sexualKnowledge", 1)>>
<<if $playerDom>><<run gainSexExp($player, "assertiveness", Random(1,2))>><<else>><<run gainSexExp($player, "compliance", Random(1,2))>><</if>>
<<case "Oral" "Facefuck">>
<<run gainSexExp($player, "oralSkill", Random(2,4))>>
<<run gainSexExp($player, "sexualKnowledge", 1)>>
<<if $playerDom>><<run gainSexExp($player, "assertiveness", Random(1,2))>><<else>><<run gainSexExp($player, "compliance", Random(1,2))>><</if>>
<<case "Oral(Strap-on)">>
<<run gainSexExp($player, "oralSkill", Random(2,4))>>
<<run gainSexExp($player, "sexualKnowledge", 1)>>
<<if $playerDom>><<run gainSexExp($player, "assertiveness", Random(1,2))>><<else>><<run gainSexExp($player, "compliance", Random(1,2))>><</if>>
<<case "Vag">>
<<run gainSexExp($player, "vaginalSkill", Random(2,4))>>
<<run gainSexExp($player, "sexualKnowledge", 1)>>
<<if $playerDom>><<run gainSexExp($player, "assertiveness", Random(1,2))>><<else>><<run gainSexExp($player, "compliance", Random(1,2))>><</if>>
<<case "Titfuck">>
<<run gainSexExp($player, "handSkill", Random(2,3))>>
<<run gainSexExp($player, "disinhibition", Random(1,2))>>
<<run gainSexExp($player, "sexualKnowledge", 1)>>
<</switch>>
<<if $Pose != "Anal" && $Pose != "Vag">>
<<set _msgType = "Like">>
<<else>>
<<if _dom.genitalia() == "Vagina">>
<<if (15 - _hole) <= 5>>
<<set _msgType = "Like">>
<<else>>
<<set _msgType = "Pain">>
<</if>>
<<else>>
<<if (_dom.body.penisSize.value - _hole) <= 5>>
<<set _msgType = "Like">>
<<else>>
<<set _msgType = "Pain">>
<</if>>
<</if>>
<</if>>
<<Video _pick>>
<<if _dom.info.isPlayer == true>>
<<set $playerDom = true>>
<<else>>
<<set $playerDom = false>>
<</if>>
<<if $Pose != "Facefuck" && $sexType != "Rape" && $Pose != "Titfuck">>
/* A leader without a cock fucks with a strap-on: the stock line must not talk about a cock or cum. */
<<set _stockInfo = ((($Pose == "Vag" || $Pose == "Anal") && _dom.genitalia() != "Penis") ? "Strap-on" : _addInfo)>>
<<run _textDialog = getPersonalizedSexDialog($interactionNpc, (_dom.info.isPlayer == false), ($Pose == "Oral(Strap-on)" ? "Oral" : $Pose), _msgType, _stockInfo)>>
/* AI line (aiSexTalk.ts): replaces the stock line if it arrives in time. */
<<set _aiSexInput = {pose: $Pose, npcLeads: (_dom.info.isPlayer == false), feeling: _msgType, extra: (_addInfo ?? ""), sexType: $sexType, moment: "turn", stockLine: _textDialog}>>
<div class="ai-sex-line"><<Chat $interactionNpc _textDialog>></div>
<<done>><<run typeof aiSexTalk === "function" && aiSexTalk(_aiSexInput)>><</done>>
<</if>>
<<set _rejectBtn = false>>
<<if $Pose == "Anal">>
<<run safeIncreaseHorny(_sub.status.horny, Random(10, 25))>>
<<if _dom.genitalia() != "Vagina" && (_dom.body.penisSize.value - _hole) > 5 && _sub.gender() != "Female" && _sub.info.isPlayer == true>>
<<ChatMessage "Your anus is not yet sufficiently trained, so penetration causes you pain.">>
<</if>>
<<elseif $Pose == "Vag">>
<<run safeIncreaseHorny(_sub.status.horny, Random(10, 25))>>
<<elseif $Pose == "Oral" || $Pose == "Oral(Strap-on)" || $Pose == "Facefuck" || $Pose == "Titfuck">>
/* Giving oral/titfuck is less intense for the sub but still arousing. */
<<run safeIncreaseHorny(_sub.status.horny, Random(5, 12))>>
<</if>>
<<set _domGetsHorny = false>>
<<if _dom.genitalia() == "Penis">>
<<if $Pose == "Anal" || $Pose == "Vag" || $Pose == "Oral" || $Pose == "Facefuck" || $Pose == "Titfuck">>
<<set _domGetsHorny = true>>
<</if>>
<<elseif _dom.genitalia() == "Vagina">>
<<if $Pose == "Oral" && $cuni == true>>
<<set _domGetsHorny = true>>
<</if>>
<</if>>
<<if _domGetsHorny>>
<<run safeIncreaseHorny(_dom.status.horny, Random(10, 25))>>
<</if>>
/* Render phase bar AFTER horny increments so the player sees this round's
progress, not last round's state. Dual bar (You + NPC) so the player can
follow either role - sub vs dom arousal tracks are both surfaced. */
<<set _scenePoseHtml = getDualScenePhaseHtml($player, $interactionNpc)>>
<<if _scenePoseHtml != "">>_scenePoseHtml<</if>>
<<ChatMessage _poseMsg>>
<<if getHornyVal(_sub.status.horny) >= getHornyMax(_sub.status.horny) && ($Pose == "Anal" || $Pose == "Vag")>>
<fieldset>
<legend><<print (_sub.info.isPlayer == true ? "Cum(You)" : "Cum(Partner)")>></legend>
<<set _rejectBtn = true>>
<div class="btn-container-row">
<div class="btn"><<button "Cum" "Cum">><<set $partnerCum = true>><</button>></div>
</div>
</fieldset>
<</if>>
<<if _domGetsHorny>>
<<if getHornyVal(_dom.status.horny) >= getHornyMax(_dom.status.horny) && _rejectBtn == false>>
<fieldset>
<<set _rejectBtn = true>>
<legend><<print (_dom.info.isPlayer == true ? "Cum(You)" : "Cum(Partner)")>></legend>
<div class="btn-container-row">
<<if _dom.gender() == "Female">>
<div class="btn"><<button "Cum" "Cum">><<set $cumIn = true>><</button>></div>
<<else>>
<<if $passiveSex == true>>
<<if Random(0,100) > 50>>
<div class="btn"><<button "Cum" "Cum">><<set $cumIn = true>><</button>></div>
<<else>>
<div class="btn"><<button "Cum" "Cum">><<set $cumIn = false>><</button>></div>
<</if>>
<<else>>
<<if $Pose == "Titfuck">>
<div class="btn"><<button "Cum" "Cum">><</button>></div>
<<else>>
/* Check if NPC has creampie limit */
<<set _npcLimits = ($interactionNpc.saveData instanceof Map) ? $interactionNpc.saveData.get("limits") : undefined>>
<<set _creampieBlocked = false>>
<<set _creampieReason = "">>
<<if _npcLimits && _npcLimits.creampie>>
<<if _npcLimits.creampie.status == "no">>
<<set _creampieBlocked = true>>
<<set _creampieReason = _npcLimits.creampie.reason || "Not allowed">>
<</if>>
<</if>>
<<if _creampieBlocked>>
<<set _blockedCreampieLabel = "In (Unavailable: " + _creampieReason + ")">>
<div class="btn" style="opacity: 0.5;" @title="_creampieReason"><<button _blockedCreampieLabel>><</button>></div>
<<else>>
<div class="btn"><<button "In" "Cum">><<set $cumIn = true>><</button>></div>
<</if>>
<div class="btn"><<button "Out" "Cum">><<set $cumIn = false>><</button>></div>
<</if>>
<</if>>
<</if>>
</div>
</fieldset>
<</if>>
<</if>>
<<if _rejectBtn == false>>
<<if _canFacefuck == true && $passiveSex == false>>
<div style="margin-top: 10px;">
<<if $playerDom == true && $interactionNpc.attributes.lust.value < 5 && $sexType != "Rape" && $sexType != "hooker" && $sexType != "hookerWork">>
<div class="btn"><<button "Facefuck" "NotReady">><<set $Pose = "Facefuck">><</button>></div>
<<else>>
<div class="btn"><<button "Facefuck" "SexPose">><<set $Pose = "Facefuck">><</button>></div>
<</if>>
</div>
<</if>>
<<if $passiveSex == true>>
<<set _posePassage = "PassiveSex">>
<<else>>
<<set _posePassage = "Sex">>
<</if>>
<<if $passiveSex == false>>
<div style="margin-top: 10px;">
<div class="btn"><<button "Continue" "SexPose">><</button>></div>
</div>
<div style="margin-top: 10px;">
<div class="btn"><<button "Change" _posePassage>><</button>></div>
</div>
<<else>>
<div style="margin-top: 10px;">
<div class="btn"><<button "Continue" "SexPose">><<include "SetPassiveSexPose">><</button>></div>
</div>
<<if $sexType != "Rape" && $sexType != "hookerWork" && $sexType != "Porn Shoot (PlayerTransform)" && $sexType != "brothelClientService">>
<div style="margin-top: 10px;">
<div class="btn"><<button "Back" _posePassage>><</button>></div>
</div>
<</if>>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "UpdateDomSub">>
/* Achievement stat: unique partners (rel_casanova / rel_lover tier). */
<<if $interactionNpc>><<run onSexWithPartner($interactionNpc.info.id)>><</if>>
/* A5 upgrade: render climax line from the interactive scene, if any */
<<if $sexPhaseFinishLine != undefined && $sexPhaseFinishLine != "">>
<div class="scene-transition scene-transition--phase"><<= $sexPhaseFinishLine>></div>
<<unset $sexPhaseFinishLine>>
<</if>>
/* Save who came before the variable is reset */
<<set _wasPartnerCum = $partnerCum>>
/* For brothelClientService, determine if the CLIENT came */
<<if $sexType == "brothelClientService">>
<<if $playerDom == true>>
/* Player is DOM, client is SUB - client cums when partnerCum is true */
<<set _clientCame = _wasPartnerCum>>
<<else>>
/* Player is SUB, client is DOM - client cums when partnerCum is false (dom cumming) */
<<set _clientCame = !_wasPartnerCum>>
<</if>>
<</if>>
/* <<SetCharProgression $player "sexStamina" _randomValueChange true>> */
<<if $Pose == "Facefuck">>
<<set $Pose = "Oral">>
<</if>>
<<if $passiveSex == true && $partnerCum != true && $sexType != "hooker" && $sexType != "hookerWork" &&
$sexType != "Porn Shoot" && $sexType != "Porn Shoot (PlayerTransform)" && $sexType != "OneSex" && $sexType != "OneSex (Destroy)">>
<<set $roundCount -= 1>>
<</if>>
<<switch $Pose>>
<<case "Anal">>
<<if $partnerCum == true>>
<<SetAnalPartnerCumPick _dom.gender() _sub.gender()>>
<<if $playerDom == true>>
<<set _poseMsg = _sub.info.firstName + " is having an anal orgasm.">>
<<else>>
<<set _poseMsg = "You're having an anal orgasm.">>
<</if>>
<<else>>
<<if $cumIn == true>>
<<SetAnalCumInPick _dom.gender() _sub.gender()>>
<<if $playerDom == true>>
<<set _poseMsg = "You're cumming in " + _sub.info.firstName + "\'s ass.">>
<<else>>
<<set _poseMsg = _dom.info.firstName + " is cumming in your ass.">>
<</if>>
<<else>>
<<SetAnalCumOutPick _dom.gender() _sub.gender()>>
<<if $playerDom == true>>
<<if _dom.genitalia() == "Penis">>
<<set _poseMsg = "You pull your cock out of " + _sub.info.firstName + "\'s ass and cum all over " + possessivePronouns(_sub) + " body.">>
<<else>>
<<set _poseMsg = "You pull your strap-on out of " + _sub.info.firstName + "\'s ass.">>
<</if>>
<<else>>
<<if _dom.genitalia() == "Penis">>
<<set _poseMsg = _dom.info.firstName + " pulls " + possessivePronouns(_dom) + " cock out of your ass and cum on you.">>
<<else>>
<<set _poseMsg = _dom.info.firstName + " pulls " + possessivePronouns(_dom) + " strap-on out of your ass.">>
<</if>>
<</if>>
<</if>>
<</if>>
<<case "Oral">>
<<if $cuni == true>>
<<SetOralCumInPick _dom.gender() _sub.gender()>>
<<if $playerDom == true>>
<<set _poseMsg = "You're having an orgasm.">>
<<else>>
<<set _poseMsg = _dom.info.firstName + " is having an orgasm.">>
<</if>>
<<else>>
<<if $cumIn == true>>
<<SetOralCumInPick _dom.gender() _sub.gender()>>
<<if $playerDom == true>>
<<set _poseMsg = "You're cumming in " + _sub.info.firstName + "\'s mouth.">>
<<else>>
<<set _poseMsg = _dom.info.firstName + " is cumming in your mouth.">>
<</if>>
<<else>>
<<SetOralCumOutPick _dom.gender() _sub.gender()>>
<<if $playerDom == true>>
<<set _poseMsg = "You're cumming on " + _sub.info.firstName + "\'s face.">>
<<else>>
<<set _poseMsg = _dom.info.firstName + " is cumming on your face.">>
<</if>>
<</if>>
<</if>>
<<case "Vag">>
<<if $partnerCum == true>>
<<SetVagPartnerCumPick _dom.gender() _sub.gender()>>
<<if $playerDom == true>>
<<set _poseMsg = _sub.info.firstName + " is having an orgasm.">>
<<else>>
<<set _poseMsg = "You're having an orgasm.">>
<</if>>
<<else>>
<<if $cumIn == true>>
<<SetVagCumInPick _dom.gender() _sub.gender()>>
<<if $playerDom == true>>
<<set _poseMsg = "You're cumming in " + _sub.info.firstName + "\'s pussy.">>
<<else>>
<<set _poseMsg = _dom.info.firstName + " is cumming in your pussy.">>
<</if>>
<<else>>
<<SetVagCumOutPick _dom.gender() _sub.gender()>>
<<if $playerDom == true>>
<<if _dom.genitalia() == "Penis">>
<<set _poseMsg = "You pull your cock out of " + _sub.info.firstName + "\'s pussy and cum all over " + possessivePronouns(_sub) + " body.">>
<<else>>
<<set _poseMsg = "You pull your strap-on out of " + _sub.info.firstName + "\'s pussy.">>
<</if>>
<<else>>
<<if _dom.genitalia() == "Penis">>
<<set _poseMsg = _dom.info.firstName + " pulls " + possessivePronouns(_dom) + " cock out of your pussy and cum on you.">>
<<else>>
<<set _poseMsg = _dom.info.firstName + " pulls " + possessivePronouns(_dom) + " strap-on out of your pussy.">>
<</if>>
<</if>>
<</if>>
<</if>>
<<case "Titfuck">>
<<SetTitfuckCumPic _dom.gender() _sub.gender()>>
<<if $playerDom == true>>
<<set _poseMsg = "You're cumming.">>
<<else>>
<<set _poseMsg = _dom.info.firstName + " is cumming.">>
<</if>>
<</switch>>
/* Orgasm bonus sexual experience */
<<switch $Pose>>
<<case "Anal">>
<<run gainSexExp($player, "analSkill", Random(3,5))>>
<<case "Oral">>
<<run gainSexExp($player, "oralSkill", Random(3,5))>>
<<case "Vag">>
<<run gainSexExp($player, "vaginalSkill", Random(3,5))>>
<<case "Titfuck">>
<<run gainSexExp($player, "handSkill", Random(3,5))>>
<</switch>>
<<run gainSexExp($player, "disinhibition", Random(1,2))>>
/* B3: long-term progression - counters, kink unlocks, attractiveness boosts */
<<if $interactionNpc != undefined>>
<<set _b3 = recordSexEncounter($player, $interactionNpc, $sexType)>>
<<if _b3 && _b3.messages && _b3.messages.length > 0>>
<<for _msg range _b3.messages>>
<<ChatMessage _msg>>
<</for>>
<</if>>
<</if>>
<<if $partnerCum == true>>
<<run _sub.status.horny._value = _sub.status.horny._min ?? 1>>
<<run (typeof _sub.status.potency.decrease === 'function') ? _sub.status.potency.decrease(1) : (_sub.status.potency._value = Math.max((_sub.status.potency._value ?? 0) - 1, _sub.status.potency._min ?? 0))>>
<<set $partnerCum = false>>
<<else>>
<<run _dom.status.horny._value = _dom.status.horny._min ?? 1>>
<<run (typeof _dom.status.potency.decrease === 'function') ? _dom.status.potency.decrease(1) : (_dom.status.potency._value = Math.max((_dom.status.potency._value ?? 0) - 1, _dom.status.potency._min ?? 0))>>
<<if ($sexType != "Porn Shoot" && $sexType != "Porn Shoot (PlayerTransform)"
&& $sexType != "OneSex (Destroy)") || _dom.info.isPlayer == true>>
<<run _dom.characterEvents.registerEvent(_dom.info.id, "IsCum", 1)>>
<<include "CheckSexStaminaUpgrade">>
<</if>>
<</if>>
<<Video _pick>>
<<ChatMessage _poseMsg>>
/* AI line for the climax (aiSexTalk.ts): hidden unless the AI answers in time. */
<<if $interactionNpc != undefined && $interactionNpc.info.isPlayer != true>>
<<set _aiNpcCame = (_wasPartnerCum == true) ? (_sub.info.isPlayer != true) : (_dom.info.isPlayer != true)>>
<<set _aiSexInput = {pose: $Pose, npcLeads: (_dom.info.isPlayer == false), extra: ($cuni ? "Lick" : ""), sexType: $sexType, moment: (_aiNpcCame ? "npcClimax" : "playerClimax")}>>
<div class="ai-sex-line" hidden><<Chat $interactionNpc "...">></div>
<<done>><<run typeof aiSexTalk === "function" && aiSexTalk(_aiSexInput)>><</done>>
<</if>>
<<if $playerDom == true>>
<<run _gainExp = Random(10,25)>>
<<SetCharProgression $player 'lust' _gainExp true>>
<<set _xp = Random(3, 8)>>
<<SetCharProgression $player 'dominance' _xp true>>
<<else>>
<<run _gainExp = Random(10,25)>>
<<SetCharProgression $player 'lust' _gainExp true>>
<<set _xp = Random(3, 8)>>
<<SetCharProgression $player 'submission' _xp true>>
<</if>>
<<run $player.dailyEvents.registerEvent($player.info.id, "SexualActivityToday", 1)>>
<<if $sexType == "hooker" && $partnerCum != true>>
<div style="margin-top: 10px;">
<div class="btn padding-top"><<button "Leave" $player.info.currentLocation>>
<<include "SexSystem_CheckSexType">>
<<set $canShowStatsBtn = true>> <<set $gameSettings.allowSaves = true>>
<<unset $sexType $interactionNpc $passiveSex $playerDom $partnerCum $cumIn $roundCount $maxSexEnd $Pose $cuni>>
<</button>></div>
</div>
<<elseif $sexType == "brothelClientService">>
/* Brothel client service - finish when client (NPC) cums */
<<if _clientCame == true>>
/* Client came - service complete! */
<div style="margin-top: 10px;">
<div class="btn" style="background: linear-gradient(135deg, #4CAF50 0%, #8BC34A 100%);">
<<button "💰 Collect Payment" "BrothelMasterRoom_ClientFinished">>
<<unset $sexType $interactionNpc $passiveSex $playerDom $partnerCum $cumIn $roundCount $maxSexEnd $Pose $cuni>>
<</button>>
</div>
</div>
<<else>>
/* Player came first - continue until client is satisfied */
<<ChatMessage "The client isn't finished yet... keep going!">>
<div style="margin-top: 10px;">
<<if $passiveSex == true>>
<div class="btn"><<button "Continue" "PassiveSex">><</button>></div>
<<else>>
<div class="btn"><<button "Continue" "Sex">><</button>></div>
<</if>>
</div>
<</if>>
<<elseif $sexType == "hookerWork" && $partnerCum != true>>
<div style="margin-top: 10px;">
<<if $aggressiveFuck == true>>
<div class="btn padding-top"><<button "Leave" $player.info.currentLocation>>
<<include "SexSystem_CheckSexType">>
<<set $canShowStatsBtn = true>> <<set $gameSettings.allowSaves = true>>
<<unset $sexType $interactionNpc $passiveSex $playerDom $partnerCum $cumIn $roundCount $maxSexEnd $Pose $cuni>>
<</button>></div>
<<elseif $isPimpSex != true>>
<div class="btn"><<button "Continue" "HookerWork">><<unset $sexType $interactionNpc $passiveSex $playerDom $partnerCum $cumIn $roundCount $maxSexEnd $Pose $cuni>><<unset $indexNPC $interaction $interactType>><<SpendTime 60>><</button>></div>
<<else>>
<div class="btn"><<button "Continue" "PimpRoom">><<SetSaveBtn true>><<unset $isPimpSex $sexType $interactionNpc $passiveSex $playerDom $partnerCum $cumIn $roundCount $maxSexEnd $Pose $cuni>><<unset $indexNPC $interaction $interactType>><<SpendTime 60>><</button>></div>
<</if>>
</div>
<<elseif $sexType == "Porn Shoot">>
<<set $player.status.potency._value = Math.max($player.status.potency.value - 3, $player.status.potency._min ?? 0)>>
<<run gainSexExp($player, "exhibitionism", Random(3,5))>>
<<run gainSexExp($player, "sexualKnowledge", Random(2,3))>>
<<run gainSexExp($player, "disinhibition", Random(2,3))>>
<div class="padding-top">
<div class="btn"><<button "Continue" $player.info.currentLocation>>
<<run $Characters.splice($indexNPC, 1)>>
<<set $player.money += Random(250, 1000)>>
<<run $player.info.reputation.pornActer.increase(Random(2, 8, true))>>
<<unset $sexType $interactionNpc $indexNPC>>
<<SetSaveBtn true>>
<</button>></div>
</div>
<<elseif $sexType == "Porn Shoot (PlayerTransform)">>
<<set $player.status.potency._value = Math.max($player.status.potency.value - 3, $player.status.potency._min ?? 0)>>
<<run gainSexExp($player, "exhibitionism", Random(3,5))>>
<<run gainSexExp($player, "sexualKnowledge", Random(2,3))>>
<<run gainSexExp($player, "disinhibition", Random(2,3))>>
<div class="padding-top">
<div class="btn"><<button "Continue" $player.info.currentLocation>>
<<run $player.body.face.value = $savePlayerBody.face>>
<<run $player.body.breastSize.value = $savePlayerBody.breastSize>>
<<run $player.body.buttSize.value = $savePlayerBody.buttSize>>
<<run $player.body.penisSize.value = $savePlayerBody.penisSize>>
<<run $player.body.vaginaSize.value = $savePlayerBody.vaginaSize>>
<<run $player.invalidateCache()>>
<<run $Characters.splice($indexNPC, 1)>>
<<set $player.money += Random(250, 1000)>>
<<run $player.info.reputation.pornActer.increase(Random(2, 8, true))>>
<<unset $sexType $interactionNpc $indexNPC>>
<<SetSaveBtn true>>
<</button>></div>
</div>
<<elseif $sexType == "Porn Shoot (PlayerCasting)">>
<div class="padding-top">
<div class="btn"><<button "Continue" "PornCasting_FemalePlayer_Finish">><<unset $sexType>><</button>></div>
</div>
<<elseif $sexType == "OneSex">>
<div class="padding-top">
<div class="btn"><<button "Continue" $player.info.currentLocation>>
<<SetSaveBtn true>>
<<unset $sexType $interactionNpc $indexNPC>>
<</button>></div>
</div>
<<elseif $sexType == "OneSex (Destroy)">>
<div class="padding-top">
<div class="btn"><<button "Continue" $player.info.currentLocation>>
<<run $Characters.splice($indexNPC, 1)>>
<<unset $sexType $interactionNpc $indexNPC>>
<<SetSaveBtn true>>
<</button>></div>
</div>
<<elseif getHornyVal(_dom.status.horny) >= getHornyMax(_dom.status.horny) || $sexType == "Rape">>
<div style="margin-top: 10px;">
<div class="btn"><<button "Continue" "Sex">><</button>></div>
</div>
<<else>>
<<if $passiveSex == true>>
<<set _posePassage = "PassiveSex">>
<<else>>
<<set _posePassage = "Sex">>
<</if>>
<div style="margin-top: 10px;">
<div class="btn"><<button "Continue" _posePassage>><</button>></div>
</div>
<</if>>
<</nobr>><<nobr>>
<<switch $Pose>>
<<case "Anal">>
<<if _sub.body.anusSize.value < _dom.body.penisSize.value || _dom.genitalia() == "Vagina">>
<<run _sub.body.anusSize.increase(Random(0.3, 0.8, true))>>
<</if>>
<<case "Vag">>
<<if _sub.body.vaginaSize.value < _dom.body.penisSize.value || _dom.genitalia() == "Vagina">>
<<run _sub.body.vaginaSize.increase(Random(0.3, 0.8, true))>>
<</if>>
<<case "Oral">>
<<if _sub.body.throatSize.value < _dom.body.penisSize.value || _dom.genitalia() == "Vagina">>
<<run _sub.body.throatSize.increase(Random(0.3, 0.8, true))>>
<</if>>
<<case "Oral(Strap-on)">>
<<if _sub.body.throatSize.value < 15>>
<<run _sub.body.throatSize.increase(Random(0.3, 0.8, true))>>
<</if>>
<<case "Facefuck">>
<<if _sub.body.throatSize.value < _dom.body.penisSize.value || _dom.genitalia() == "Vagina">>
<<run _sub.body.throatSize.increase(Random(0.3, 0.8, true))>>
<</if>>
<</switch>>
<</nobr>><<nobr>>
<<if ($playerDom == true && $sexType != "hookerWork")>>
<<set _dom = $player>>
<<set _sub = $interactionNpc>>
<<else>>
<<set _dom = $interactionNpc>>
<<set _sub = $player>>
<</if>>
<</nobr>><<nobr>>
<<set _randGain = Random(5, 20)>>
<<SetCharProgression _dom 'sexStamina' _randGain true>>
<</nobr>><<nobr>>
<<if $interactionNpc.info.SexRole == "Active">>
<<set $playerDom = false>>
<<elseif $interactionNpc.info.SexRole == "Versatile">>
<<set $playerDom = [true, false].random()>>
<<elseif $interactionNpc.info.SexRole == "Passive">>
<<set $playerDom = true>>
<</if>>
<<set $Pose = ["Anal", "Oral", "Facefuck"]>>
<<if $playerDom == true>>
<<if $interactionNpc.genitalia() == "Vagina">>
<<run $Pose.push("Vag")>>
<<else>>
<<run $Pose.push("Anal")>>
<</if>>
<<if $player.genitalia() == "Penis" && $interactionNpc.body.breastSize.value >= 3>>
<<run $Pose.push("Titfuck")>>
<</if>>
<<run $Pose = $Pose[Math.floor(Math.random() * $Pose.length)]>>
<<if $Pose == "Oral" && $player.genitalia() == "Vagina">>
<<set $cuni = true>>
<</if>>
<<else>>
<<if $player.genitalia() == "Vagina">>
<<run $Pose.push("Vag")>>
<<else>>
<<run $Pose.push("Anal")>>
<</if>>
<<if $interactionNpc.genitalia() == "Penis" && $player.body.breastSize.value >= 3>>
<<run $Pose.push("Titfuck")>>
<</if>>
<<run $Pose = $Pose[Math.floor(Math.random() * $Pose.length)]>>
<<if $Pose == "Oral" && $interactionNpc.genitalia() == "Vagina">>
<<set $cuni = true>>
<</if>>
<</if>>
<<if $playerDom == true>>
<<if $interactionNpc.attributes.lust.value < 5 && $Pose == "Facefuck">>
<<set $Pose = ["Oral"]>>
<<if $interactionNpc.genitalia() == "Vagina">>
<<run $Pose.push("Vag")>>
<</if>>
<<if $player.genitalia() == "Penis" && $interactionNpc.body.breastSize.value >= 3>>
<<run $Pose.push("Titfuck")>>
<</if>>
<<run $Pose = $Pose[Math.floor(Math.random() * $Pose.length)]>>
<<elseif $interactionNpc.attributes.lust.value < -7 && $Pose == "Anal">>
<<set $Pose = ["Oral"]>>
<<if $interactionNpc.genitalia() == "Vagina">>
<<run $Pose.push("Vag")>>
<</if>>
<<if $player.genitalia() == "Penis" && $interactionNpc.body.breastSize.value >= 3>>
<<run $Pose.push("Titfuck")>>
<</if>>
<<if $interactionNpc.attributes.lust.value >= 5>>
<<run $Pose.push("Facefuck")>>
<</if>>
<<run $Pose = $Pose[Math.floor(Math.random() * $Pose.length)]>>
<</if>>
<<else>>
<<if $interactionNpc.attributes.lust.value < 5 && $Pose == "Facefuck">>
<<set $Pose = ["Oral"]>>
<<if $player.genitalia() == "Vagina">>
<<run $Pose.push("Vag")>>
<</if>>
<<if $interactionNpc.genitalia() == "Penis" && $player.body.breastSize.value >= 3>>
<<run $Pose.push("Titfuck")>>
<</if>>
<<run $Pose = $Pose[Math.floor(Math.random() * $Pose.length)]>>
<<elseif $interactionNpc.attributes.lust.value < -7 && $Pose == "Anal">>
<<set $Pose = ["Oral"]>>
<<if $player.genitalia() == "Vagina">>
<<run $Pose.push("Vag")>>
<</if>>
<<if $interactionNpc.genitalia() == "Penis" && $player.body.breastSize.value >= 3>>
<<run $Pose.push("Titfuck")>>
<</if>>
<<if $interactionNpc.attributes.lust.value >= 5>>
<<run $Pose.push("Facefuck")>>
<</if>>
<<run $Pose = $Pose[Math.floor(Math.random() * $Pose.length)]>>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<if $interactionNpc.info.characterWork == "Pimp" && $player.characterEvents.isEventRegistered($player.info.id, "Can Work As Hooker") == true>>
<div class="btn"><<button "Start Work" "WorkAsHooker">>
<<include "HookerWordCalculateEarnings">>
<</button>></div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if $player.status.energy.value < 35>>
<<goto "NotEnoughEnergy">>
<<else>>
<<set _earning = Random(100, 250, false)>>
<<include "WorkDone">>
<</if>>
<<BackButton "<<set $canShowStatsBtn = true>> <<unset $interactionNpc>> <<set $gameSettings.allowSaves = true>>">>
<</nobr>><<nobr>>
<<run $player.dailyEvents.registerEvent($interactionNpc.info.id, "Worked", 1)>>
/* SpendTime, not `$dateTime.hours += 6`: the raw hours setter crossing
midnight fires the day setter's full refresh at a half-updated timestamp
and then relocates the whole city a second time - one shift ticked the
world twice. SpendTime runs the day-crossing pipeline once, correctly. */
<<SpendTime 360>>
<<SpendEnergy $player 35>>
<<set _msg = "You've done an excellent job and rightfully earned $" + _earning>>
<<ChatMessage _msg>>
<<run $player.money += _earning>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ChatMessage "Not enough energy.">>
<<BackButton "<<set $canShowStatsBtn = true>> <<unset $interactionNpc>> <<set $gameSettings.allowSaves = true>>">>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ChatMessage "Not enough sexual stamina.">>
<<BackButton "<<set $canShowStatsBtn = true>> <<unset $interactionNpc>> <<set $gameSettings.allowSaves = true>>">>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set $canShowStatsBtn = false>>
<<set $gameSettings.allowSaves = false>>
<<set _allow = true>>
<<if $player.status.energy.value < 35>>
<<set _allow = false>>
<<goto "NotEnoughEnergy">>
<</if>>
<<if $player.status.potency.value == 0>>
<<set _allow = false>>
<<goto "NotEnoughSexStamina">>
<</if>>
<<if ($player.body.face.value < 2 || $player.gender() == "Male") && $player.characterEvents.isEventRegistered($player.info.id, "Is a pimp's whore") == false>>
<<ShowNpcIcon $interactionNpc>>
<<Chat $interactionNpc "You lack femininity.">>
<<set _allow = false>>
<div class="padding-top">
<<BackButton "<<set $canShowStatsBtn = true>> <<unset $interactionNpc $clients $clientsCount $maxEarnings $sexType>> <<set $gameSettings.allowSaves = true>> <<set $canShowStatsBtn = true>>">>
</div>
<</if>>
<<if _allow == true>>
<<SpendEnergy $player 35>>
<<goto "HookerWork">>
<</if>>
<</nobr>><<nobr>>
<<if !$clients || $clients.length == 0>>
<<ChatMessage "There are no clients today.">>
<<BackButton "<<set $canShowStatsBtn = true>> <<unset $interactionNpc $clients $clientsCount $maxEarnings $sexType>> <<set $gameSettings.allowSaves = true>> <<set $canShowStatsBtn = true>>">>
<<else>>
<<set _client = $clients[Math.floor(Math.random() * $clients.length)]>>
<<for _i = 0; _i < $Characters.length; _i++>>
<<if $Characters[_i].info.id == _client.info.id>>
<<set _character = $Characters[_i]>>
<<set $interactionNpc = $Characters[_i]>>
<<set $indexNPC = $Characters.indexOf(_character)>>
<</if>>
<</for>>
<<include "UpdateAll">>
<<if $clients.length == 0>>
<<ChatMessage "There are no clients today.">>
<<elseif $clientsCount <= 0>>
<<ChatMessage "The clients are finished for today.">>
<<elseif $player.status.potency.value == 0>>
<<ChatMessage "You do not have enough sexual stamina.">>
<<else>>
<<ShowNpcIcon $interactionNpc>>
<<run _earning = Random(20, $maxEarnings)>>
<<set _msg = "Hey baby, I'll pay " + _earning + "$.">>
<<Chat $interactionNpc _msg>>
<</if>>
<div class="padding-top">
/* `_allow` never survives the <<goto>> into this passage (temporaries
reset on navigation) - the guard was always true, so it's removed
rather than pretending to gate anything. */
<<if $clientsCount > 0 && $clients.length > 0>>
<div class="btn-container">
<div class="btn"><<button "Sex" "PassiveSex">><<set $roundCount = 100>><<set $sexType = "hookerWork">><<set $player.money += _earning>><<set $clientsCount -= 1>><<set $interactionNpc.status.horny.value = 95>><</button>></div>
<<if $player.characterEvents.isEventRegistered($player.info.id, "Loose To Pimp") == false>>
<div class="btn"><<button "Refuse" "WorkAsHooker">><<set $clientsCount -= 1>><</button>></div>
<</if>>
</div>
<<else>>
<<BackButton "<<set $canShowStatsBtn = true>> <<unset $interactionNpc $clients $clientsCount $maxEarnings $sexType>> <<set $gameSettings.allowSaves = true>> <<set $canShowStatsBtn = true>>">>
<</if>>
</div>
<</if>>
<</nobr>><<nobr>>
<<run $clients = $Characters.filter(character =>
character.genitalia() == "Penis" && character.info.sexualPreference != "Manly"
&& character.info.SexRole == "Active"
&& character.info.characterWork != "Pimp"
&& character.info.characterWork != "external"
&& character.info.characterWork != "Pimp's whore"
&& character.info.characterWork != "Brothel Security"
&& character.status.potency.value > 0)>>
<<set $clientsCount = Random(2,5)>>
<<set $maxEarnings = 20>>
<<switch Math.trunc($player.body.face.value)>>
<<case 3>>
<<set $maxEarnings += 20>>
<<case 4>>
<<set $maxEarnings += 80>>
<<case 5>>
<<set $maxEarnings += 120>>
<<case 6>>
<<set $maxEarnings += 200>>
<</switch>>
<<switch Math.trunc($player.body.breastSize.value)>>
<<case 1>>
<<set $maxEarnings += 20>>
<<case 2>>
<<set $maxEarnings += 80>>
<<case 3>>
<<set $maxEarnings += 120>>
<<case 4>>
<<set $maxEarnings += 150>>
<<case 5>>
<<set $maxEarnings += 180>>
<<case 6>>
<<set $maxEarnings += 200>>
<</switch>>
<<switch Math.trunc($player.body.buttSize.value)>>
<<case 1>>
<<set $maxEarnings += 20>>
<<case 2>>
<<set $maxEarnings += 80>>
<<case 3>>
<<set $maxEarnings += 120>>
<<case 4>>
<<set $maxEarnings += 150>>
<<case 5>>
<<set $maxEarnings += 180>>
<<case 6>>
<<set $maxEarnings += 200>>
<</switch>>
<<if $player.genitalia() == "Vagina">>
<<set $maxEarnings += 150>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<if $afterBreakupResult>>
<<ChatMessage $afterBreakupResult.reason>>
<<unset $afterBreakupResult>>
<</if>>
<<set _afterBreakup = setup.getPlayerNpcAfterBreakupView($interactionNpc)>>
<<if !_afterBreakup>>
<<ChatMessage "There is no past relationship to discuss.">>
<<else>>
<<ChatMessage _afterBreakup.line>>
<<if _afterBreakup.contactNote>>
<div class="result-description"><<- _afterBreakup.contactNote>></div>
<</if>>
<<if _afterBreakup.reason>>
<div class="result-description">What led to time apart: <<- _afterBreakup.reason>></div>
<</if>>
<<if _afterBreakup.waitDays && !["friends", "reunited", "closed"].includes(_afterBreakup.stage)>>
<div class="result-description">Leave some time before the next conversation: about <<print _afterBreakup.waitDays>> day(s).</div>
<</if>>
<<if _afterBreakup.unavailable>><<ChatMessage _afterBreakup.unavailable>><</if>>
<<for _option range _afterBreakup.options>>
<<capture _option _afterBreakup>>
<div class="btn padding-top"><<button _option.label "enhanced_relationship_after_breakup">>
<<set $afterBreakupResult = setup.performPlayerNpcAfterBreakup($interactionNpc, _option.action, _afterBreakup.cycle)>>
<<if $afterBreakupResult.minutes > 0>><<SpendTime $afterBreakupResult.minutes>><</if>>
<</button>></div>
<</capture>>
<</for>>
<</if>>
<div class="btn padding-top"><<button "Our history" "enhanced_relationship_history">><</button>></div>
<div class="btn padding-top"><<button "Back" "enhanced_interaction_system">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<if $confidenceConversationResult>>
<<ChatMessage $confidenceConversationResult.message>>
<<unset $confidenceConversationResult>>
<</if>>
<<set _confidenceView = GetPlayerConfidenceView($player, $interactionNpc)>>
<<ChatMessage _confidenceView.message>>
<<if _confidenceView.available>>
<div class="btn">
<<button "Share a personal matter in confidence" "NpcConfidenceConversation">>
<<set $confidenceConversationResult = ActOnPlayerConfidence($player, $interactionNpc, {action: "give"})>>
<<if $confidenceConversationResult.minutes > 0>><<SpendTime $confidenceConversationResult.minutes>><</if>>
<</button>>
</div>
<div class="btn">
<<button "Offer to listen in confidence" "NpcConfidenceConversation">>
<<set $confidenceConversationResult = ActOnPlayerConfidence($player, $interactionNpc, {action: "receive"})>>
<<if $confidenceConversationResult.minutes > 0>><<SpendTime $confidenceConversationResult.minutes>><</if>>
<</button>>
</div>
<<for _confidenceStory range _confidenceView.stories>>
<div class="padding-top">
<p><strong><<print _confidenceStory.label>></strong></p>
<p><<print _confidenceStory.status>></p>
<<for _confidenceOption range _confidenceStory.options>>
<<capture _confidenceOption>>
<div class="btn">
<<button _confidenceOption.label "NpcConfidenceConversation">>
<<set $confidenceConversationResult = ActOnPlayerConfidence($player, $interactionNpc, _confidenceOption.request)>>
<<if $confidenceConversationResult.minutes > 0>><<SpendTime $confidenceConversationResult.minutes>><</if>>
<</button>>
</div>
<</capture>>
<</for>>
</div>
<</for>>
<</if>>
<div class="padding-top"><div class="btn"><<button "Back" "enhanced_interaction_system">><<unset $confidenceConversationResult>><</button>></div></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<div class="interaction-choice">
<<InteractionChoiceHeader "Room for each other" "Make time a habit" "Plan two moments together around the life you share." "enhanced_relationship_household" "Back to household">>
<div class="interaction-choice__context">
<<if $sharedTimeResult>>
<<ChatMessage $sharedTimeResult.reason>>
<<unset $sharedTimeResult>>
<</if>>
<<set _sharedTimeView = setup.getPlayerNpcSharedTimeView($interactionNpc)>>
<<if !_sharedTimeView>>
<<ChatMessage "You are not currently sharing a home.">>
<<else>>
<<ChatMessage _sharedTimeView.line>>
<<if _sharedTimeView.routine>>
<div class="result-description">Your familiar routine: <<print _sharedTimeView.routine.label>>. Next dates: <<print _sharedTimeView.routine.when>>.</div>
<</if>>
<<for _slot range _sharedTimeView.slots>>
<div class="result-description"><<print _slot.when>> - <<print _slot.label>>: <<print _slot.status.replaceAll("_", " ")>>. <<print _slot.reason>></div>
<<if _slot.canStart>>
<<capture _slot>>
<div class="btn"><<button "Spend our planned time together" "enhanced_relationship_household_evening">><<set $householdEveningResult = setup.performPlayerNpcSharedTime($interactionNpc, _slot.id)>><</button>></div>
<</capture>>
<</if>>
<</for>>
<<if _sharedTimeView.canDiscuss>>
<<if _sharedTimeView.pending>>
<div class="btn padding-top"><<button "Cancel the remaining dates and rethink the plan" "enhanced_relationship_shared_time">><<set $sharedTimeResult = setup.cancelPlayerNpcSharedTime($interactionNpc)>><</button>></div>
<<else>>
<<if _sharedTimeView.routine>>
<div class="btn"><<button "Repeat our weekly routine" "enhanced_relationship_shared_time">><<set $sharedTimeResult = setup.repeatPlayerNpcSharedTime($interactionNpc)>><</button>></div>
<</if>>
<section class="interaction-choice__section">
<h2>What would you like to share?</h2>
<p>Choose an activity and a time. Fixed evenings fall tomorrow and three days later.</p>
<div class="interaction-choice__routines">
<<for _option range [{id: "talk", title: "A good conversation", detail: "Two conversations · 45 min each", cost: "Free", description: "A little space to talk and listen."}, {id: "dinner", title: "Dinner together", detail: "Two dinners · 60 min each", cost: "$20 per dinner", description: "Sit down to a meal and catch up."}, {id: "quiet_evening", title: "A quiet evening", detail: "Two evenings · 90 min each", cost: "Free", description: "Slow down and enjoy each other’s company."}]>>
<article class="interaction-choice__routine" @data-activity="_option.id">
<h3><<print _option.title>></h3>
<span class="interaction-choice__badge"><<print _option.cost>></span>
<p><<print _option.description>><br><<print _option.detail>></p>
<<capture _option>>
<<button "Find time around our plans" "enhanced_relationship_shared_time">><<set $sharedTimeResult = setup.proposePlayerNpcSharedTime($interactionNpc, _option.id, "adaptive")>><</button>>
<</capture>>
<div class="interaction-choice__routine-times">
<<for _hour range [18, 20]>>
<<capture _option _hour>>
<<set _label = "At " + _hour + ":00">>
<<button _label "enhanced_relationship_shared_time">><<set $sharedTimeResult = setup.proposePlayerNpcSharedTime($interactionNpc, _option.id, _hour)>><</button>>
<</capture>>
<</for>>
</div></article>
<</for>>
</div>
<p class="interaction-choice__note">Flexible planning looks for two dates from today through the next seven days, allowing for travel, work and rest. A change of schedule or health may require a new plan.</p>
</section>
<</if>>
<<else>>
<<ChatMessage "Talk about the plan when you are both free at home.">>
<</if>>
<</if>>
</div></div>
<</nobr>><<nobr>>
<<set _canTakeClothOff = false>>
<<set $gameSettings.allowSaves = false>>
<<include "UpdateAll">>
<<if $player.characterEvents.isEventRegistered($interactionNpc.info.id, "knows you") == false>>
<<run $player.characterEvents.registerEvent($interactionNpc.info.id, "knows you", 1)>>
<<IncreaseFriendship $player $interactionNpc 5>>
<</if>>
<</nobr>><<nobr>>
<div class="chat-container" style="padding-top: 5px; padding-bottom: 5px;">
<p>$interactionNpc.info.firstName $interactionNpc.info.secondName. $interactionNpc.info.age.value-year-old <<print $interactionNpc.gender()>>. With a
<<if $interactionNpc.clothes.hasClothingType(1) == false && $interactionNpc.clothes.hasClothingType(2) == false>>
__<<link $interactionNpc.getBreastText()>>
<<script>>
Dialog.create(SugarCube.State.variables.interactionNpc.getBreastText());
Dialog.wiki(SugarCube.State.variables.interactionNpc.getBreastImage());
Dialog.open();
<</script>>
<</link>>__
<<else>>
<span style="color: #fff;"><<print $interactionNpc.getBreastText()>></span> under clothing
<</if>>
and
<<if $interactionNpc.clothes.hasClothingType(0) == false && $interactionNpc.clothes.hasClothingType(3) == false>>
__<<link $interactionNpc.getButtText()>>
<<script>>
Dialog.create(SugarCube.State.variables.interactionNpc.getButtText());
Dialog.wiki(SugarCube.State.variables.interactionNpc.getAssImage());
Dialog.open();
<</script>>
<</link>>__
<<else>>
<span style="color: #fff;"><<print $interactionNpc.getButtText()>></span> under clothing.
<</if>>
<<if $interactionNpc.clothes.clothingItems.size > 0>>
<<set _isHasCloth = false>>
<br><<print $interactionNpc.pronoun()>> is wearing:
<<for _i = 0; _i <= 8; _i++>>
<<capture _i>>
<<if $interactionNpc.clothes.hasClothingType(_i)>>
<<if (_i == 0 && $interactionNpc.clothes.hasClothingType(3)) || (_i == 1 && $interactionNpc.clothes.hasClothingType(2))>>
<<continue>>
<</if>>
<<if _isHasCloth == true>>
,
<</if>>
<<set _isHasCloth = true>>
__<<link $interactionNpc.clothes.getFirstClothingItemByType(_i).name>>
<<run Dialog.create($interactionNpc.clothes.getFirstClothingItemByType(_i).name)>>
<<run Dialog.wiki($interactionNpc.clothes.getFirstClothingItemByType(_i).getImg())>>
<<run Dialog.open();>>
<</link>>__
<<capture _i>>
<<if _canTakeClothOff == true>>
__<<link " (take off)" "TakeOff_clothes">>
<<set $clothID = _i>>
<</link>>__
<</if>>
<</capture>>
<</if>>
<</capture>>
<</for>>
<</if>>
<<if $interactionNpc.clothes.hasClothingType(0) == false && $interactionNpc.clothes.hasClothingType(3) == false>>
<<if $interactionNpc.genitalia() == "Penis">>
. <<print $interactionNpc.pronoun()>> have a <<print Math.trunc($interactionNpc.body.penisSize.value)>>-centimeter penis.
<<else>>
. <<print $interactionNpc.pronoun()>> have a vagina.
<</if>>
<</if>>
</p>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<Chat $interactionNpc "Sorry, I'm not working at this time. Please come during working hours.">>
<div class="padding-top">
<div class="btn"><<button "Continue" "enhanced_interaction_system">><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<set _jobTitle = ($interactionNpc.info.characterWork) == "None" ? "Citizen" : $interactionNpc.info.characterWork>>
<<set _msg = "Hi. I'm " + $interactionNpc.info.firstName + ".">>
<<Chat $interactionNpc _msg>>
<<run $player.characterEvents.registerEvent($interactionNpc.info.id, "knows you", 1)>>
<<IncreaseFriendship $player $interactionNpc 5>>
<div class="padding-top">
<div class="btn"><<button "Continue" "enhanced_interaction_system">><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _interactionReturnPassage = setup.prepareInteractionReturnPassage()>>
<<set $canShowStatsBtn = true>>
<<set $gameSettings.allowSaves = true>>
<<if $interactionNpc.clothes.isNude(($interactionNpc.info.clothesPreference == "men")) == true>>
<<if $interactionNpc.attributes.lust.value > 7 || $interactionNpc.info.characterWork == "Hooker">>
<<LeaveInteractionSettings>>
<<goto _interactionReturnPassage>>
<<else>>
<<run _pronoun = $interactionNpc.pronounHisHer().toLowerCase()>>
<<run CompleteNpcHomeVisit($indexNPC)>>
<<set _msg = $interactionNpc.info.firstName + " blushes and hurries away to put on " + _pronoun + " clothes.">>
<<ChatMessage _msg>>
<<BackButton "<<run $interactionNpc.wearMaximumClothing()>> <<run $interactionNpc.AddCloth(false, true)>> <<set $canShowStatsBtn = true>> <<unset $interactionNpc $indexNPC>> <<set $gameSettings.allowSaves = true>>">>
<</if>>
<<else>>
<<LeaveInteractionSettings>>
<<goto _interactionReturnPassage>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if $player.characterEvents.isEventRegistered($player.info.id, "Became A Pimp") == true>>
<<if $player.gender() == "Male">>
<<Chat $interactionNpc "Daddy, have you decided to test my skills?">>
<<else>>
<<Chat $interactionNpc "Madam, have you decided to test my skills?">>
<</if>>
<<if $playerlock == true>>
<div class="btn non-interacting"><<button "Sex">><</button>></div>
<<else>>
<div class="btn"><<button "Sex" "Sex">><<set $sexType = "hooker">><</button>></div>
<</if>>
<<elseif $player.money < 500>>
<<ChatMessage "You don't have enough money.">>
<<BackButton "<<set $canShowStatsBtn = true>> <<unset $interactionNpc>> <<set $gameSettings.allowSaves = true>>">>
<<elseif $player.status.energy.value >= 10>>
<<run setup.npcMoney.payTo($interactionNpc, 500)>>
<<if $player.calculateFemininity() > 5>>
<<Chat $interactionNpc "Sure, beauty. Let's find somewhere more secluded.">>
<<else>>
<<Chat $interactionNpc "Sure, handsome. Let's find somewhere more secluded.">>
<</if>>
<div class="padding-top">
<<if $playerlock == true>>
<div class="btn non-interacting"><<button "Sex">><</button>></div>
<<else>>
<div class="btn"><<button "Sex" "Sex">><<set $sexType = "hooker">><</button>></div>
<</if>>
</div>
<<else>>
<<ChatMessage "You're too tired for this.">>
<<BackButton "<<set $canShowStatsBtn = true>> <<unset $interactionNpc>> <<set $gameSettings.allowSaves = true>>">>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<Chat $player "I'd like to get to know you better. What are you into?">>
<<set _knowBetterResult = window.tryKnowNpcBetter($player, $interactionNpc)>>
<<if _knowBetterResult.attempted>>
<<SpendTime 10>>
<<SpendEnergy $player 4>>
<</if>>
<<Chat $interactionNpc _knowBetterResult.npcLine>>
<<if _knowBetterResult.summary>>
<<ChatMessage _knowBetterResult.summary>>
<</if>>
<div class="padding-top">
<div class="btn"><<button "Back" "enhanced_interaction_system">><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _preferenceTopics = setup.getNpcPreferenceConversationTopics($player, $interactionNpc)>>
<<set _preferenceGroups = [
{id: "connection", title: "Affection & chemistry", description: "The little things that bring you closer", icon: "M20.8 4.6a5.5 5.5 0 0 0-7.8 0L12 5.7l-1.1-1.1a5.5 5.5 0 0 0-7.8 7.8L12 21l8.8-8.6a5.5 5.5 0 0 0 0-7.8Z", topics: ["Romantic", "KissLover", "Praise", "Teasing", "Aftercare", "BodyWorship", "Vanilla"]},
{id: "imagination", title: "Play & imagination", description: "Curiosity, creativity and self-expression", icon: "m12 3 2.8 6.2L21 12l-6.2 2.8L12 21l-2.8-6.2L3 12l6.2-2.8L12 3Z", topics: ["Roleplay", "UniformRoleplay", "Lingerie", "Toys", "SensoryPlay", "DirtyTalk"]},
{id: "intensity", title: "Roles & intensity", description: "Taking the lead and finding a balance", icon: "M4 7h16M4 17h16M8 4v6M16 14v6", topics: ["Dominant", "Submissive", "BondageLight", "RoughSex", "Spanking", "Sadism", "Masochism", "Degradation", "OrgasmControl"]},
{id: "intimacy", title: "Intimate preferences", description: "A closer conversation about what feels right", icon: "M9 18H7a5 5 0 0 1 0-10h4M15 6h2a5 5 0 0 1 0 10h-4M8 12h8", topics: ["OralGive", "OralReceive", "VaginalGive", "VaginalReceive", "AnalGive", "AnalReceive", "TitfuckGive", "TitfuckReceive", "MutualMasturbation"]},
{id: "setting", title: "Pace & setting", description: "The moment, the mood and the surroundings", icon: "M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0ZM12 7v5l3 2", topics: ["SlowSex", "Quickies", "Exhibitionist", "Voyeur", "RiskyPublic", "Recording"]},
{id: "dynamics", title: "Relationship dynamics", description: "Different ways of relating to one another", icon: "M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2M13 7a4 4 0 1 1-8 0 4 4 0 0 1 8 0ZM22 21v-2a4 4 0 0 0-3-3.9M16 3.1a4 4 0 0 1 0 7.8", topics: ["Cuckold", "Hotwife", "Cuckquean", "PartnerFeminizer"]}
]>>
<<set _groupedPreferenceIds = _preferenceGroups.flatMap(group => group.topics)>>
<<set _otherPreferenceIds = _preferenceTopics.filter(topic => !_groupedPreferenceIds.includes(topic.id)).map(topic => topic.id)>>
<<if _otherPreferenceIds.length>>
<<run _preferenceGroups.push({id: "other", title: "More to explore", description: "Keep getting to know each other", icon: "M12 5v14M5 12h14", topics: _otherPreferenceIds})>>
<</if>>
<section class="preference-conversation" aria-labelledby="preference-conversation-title">
<header class="preference-conversation__header">
<div class="preference-conversation__heading">
<div class="preference-conversation__portrait"><<ShowNpcIcon $interactionNpc>></div>
<div class="preference-conversation__intro">
<span class="preference-conversation__eyebrow">A more personal conversation</span>
<h1 id="preference-conversation-title">What are you curious about?</h1>
<p>Get to know each other, one topic at a time.</p>
</div>
</div>
<div class="preference-conversation__back"><<button "Back" "enhanced_interaction_system">><</button>></div>
</header>
<<if $npcPreferenceConversationResult>>
<div class="preference-conversation__reply" role="status" aria-live="polite">
<span class="preference-conversation__eyebrow">Their answer<<if $npcPreferenceConversationResult.topic>> · <<= $npcPreferenceConversationResult.topic>><</if>></span>
<<Chat $interactionNpc $npcPreferenceConversationResult.reason>>
<<if $npcPreferenceConversationResult.outcome>>
<<set _preferenceOutcome = $npcPreferenceConversationResult.outcome>>
<<set _preferenceOutcomeTitles = { like: "A little closer", curious: "A spark of curiosity", neutral: "Getting to know each other", dislike: "A sensitive subject", withheld: "Not the right moment", repeat: "Already discussed", unavailable: "Conversation unavailable" }>>
<<set _preferenceMetricLabels = { friendship: "Friendship", love: "Romance", sex: "Attraction", anger: "Tension" }>>
<<set _preferenceChanges = $npcPreferenceConversationResult.relationshipChanges || []>>
<section class="preference-relationship" @data-outcome="_preferenceOutcome" aria-labelledby="preference-relationship-title">
<header class="preference-relationship__header">
<span class="preference-relationship__symbol" aria-hidden="true"><svg viewBox="0 0 24 24"><path d="m12 3 2.5 6.5L21 12l-6.5 2.5L12 21l-2.5-6.5L3 12l6.5-2.5Z"/></svg></span>
<div>
<span class="preference-relationship__eyebrow">Relationship update</span>
<h3 id="preference-relationship-title"><<= _preferenceOutcomeTitles[_preferenceOutcome]>></h3>
</div>
</header>
<<if _preferenceChanges.length>>
<div class="preference-relationship__changes">
<<for _preferenceChange range _preferenceChanges>>
<<set _preferenceImproved = _preferenceChange.metric === "anger" ? _preferenceChange.delta < 0 : _preferenceChange.delta > 0>>
<div class="preference-relationship__change" @data-metric="_preferenceChange.metric" @data-direction="_preferenceImproved ? 'positive' : 'negative'">
<span class="preference-relationship__label"><<= _preferenceMetricLabels[_preferenceChange.metric]>></span>
<strong class="preference-relationship__delta"><<= (_preferenceChange.delta > 0 ? '+' : '−') + Number(Math.abs(_preferenceChange.delta).toFixed(1))>></strong>
<span class="preference-relationship__values"><span class="preference-relationship__sr-only">Before </span><<= Number(_preferenceChange.before.toFixed(1))>><span class="preference-relationship__arrow" aria-hidden="true">→</span><span class="preference-relationship__sr-only">, now </span><strong><<= Number(_preferenceChange.after.toFixed(1))>></strong></span>
</div>
<</for>>
</div>
<<else>>
<p class="preference-relationship__unchanged">No relationship change.<<if _preferenceOutcome === "repeat">> Give this topic some time before bringing it up again.<<elseif _preferenceOutcome !== "unavailable">> These relationship values are already at their limits.<</if>></p>
<</if>>
</section>
<</if>>
</div>
<<unset $npcPreferenceConversationResult>>
<</if>>
<<if _preferenceTopics.length > 0>>
<div class="preference-conversation__toolbar">
<h2>Choose a topic <span class="preference-conversation__total"><<= _preferenceTopics.length>></span></h2>
<span class="preference-conversation__duration"><svg viewBox="0 0 24 24" aria-hidden="true"><circle cx="12" cy="12" r="9"/><path d="M12 7v5l3 2"/></svg>5 min per conversation</span>
</div>
<div class="preference-conversation__groups">
<<for _preferenceGroup range _preferenceGroups>>
<<set _groupTopics = _preferenceGroup.topics.map(id => _preferenceTopics.find(topic => topic.id === id)).filter(Boolean)>>
<<if _groupTopics.length>>
<section class="preference-topic-group" @data-category="_preferenceGroup.id" @aria-labelledby="'preference-group-' + _preferenceGroup.id">
<header class="preference-topic-group__header">
<span class="preference-topic-group__icon"><<print '<svg viewBox="0 0 24 24" aria-hidden="true"><path d="' + _preferenceGroup.icon + '"/></svg>'>></span>
<div>
<h3 @id="'preference-group-' + _preferenceGroup.id"><<= _preferenceGroup.title>></h3>
<p><<= _preferenceGroup.description>></p>
</div>
</header>
<div class="preference-topic-group__topics">
<<for _preferenceTopic range _groupTopics>>
<<capture _preferenceTopic>>
<div class="preference-topic" @data-topic="_preferenceTopic.id"><<button _preferenceTopic.label "NpcPreferenceConversation">>
<<set $npcPreferenceConversationResult = setup.discussNpcPreference($player, $interactionNpc, _preferenceTopic.id)>>
<<if $npcPreferenceConversationResult.minutes > 0>><<SpendTime $npcPreferenceConversationResult.minutes>><</if>>
<</button>></div>
<</capture>>
<</for>>
</div>
</section>
<</if>>
<</for>>
</div>
<footer class="preference-conversation__footer">
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M21 11.5a8.4 8.4 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.4 8.4 0 0 1-3.8-.9L3 21l1.9-5.7a8.4 8.4 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.4 8.4 0 0 1 3.8-.9H13a8.5 8.5 0 0 1 8 8v.5Z"/></svg>
<p>An answer is how they feel now. Any later invitation needs its own agreement.</p>
</footer>
<<else>>
<div class="preference-conversation__empty">
<h2>A better moment will come</h2>
<p>Find a suitable moment to talk in person.</p>
</div>
<</if>>
</section>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<Chat $player "Where are you going?">>
<<if typeof AskNpcDestination === "function">>
<<set _destinationAnswer = AskNpcDestination($player, $interactionNpc)>>
<<Chat $interactionNpc _destinationAnswer.response>>
<<else>>
<<Chat $interactionNpc "I'm staying here for now.">>
<</if>>
<<SpendTime 2>>
<div class="padding-top">
<div class="btn"><<button "Back" "enhanced_interaction_system">><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<set _discussionOptions = window.getNpcKinkDiscussionOptions($player, $interactionNpc)>>
<<if _discussionOptions.length == 0>>
<<ChatMessage "You don't know enough about what they like to bring any of it up.">>
<<else>>
<<ChatMessage "Pick something you've picked up on. Bringing up what they like helps later. Backing off what they don't gets you trusted.">>
<div class="padding-top">
<<for _discussionOption range _discussionOptions>>
<<capture _discussionOption>>
/* Button labels are precomputed: macro arguments split on whitespace,
so an inline "(...)" expression is not evaluated. */
<<set _discussionLabel = _discussionOption.icon + " " + _discussionOption.label>>
<<if _discussionOption.preference == "like">>
<<set _acknowledgeLabel = "Acknowledge " + _discussionLabel>>
<<set _suggestLabel = "Suggest " + _discussionLabel>>
<div class="btn"><<button _acknowledgeLabel "DiscussNpcKinkResult">><<set $discussNpcKink = _discussionOption.kink>><<set $discussNpcKinkMode = "affirm">><</button>></div>
<div class="btn"><<button _suggestLabel "DiscussNpcKinkResult">><<set $discussNpcKink = _discussionOption.kink>><<set $discussNpcKinkMode = "suggest">><</button>></div>
<<else>>
<<set _respectLabel = "Leave it alone: " + _discussionLabel>>
<div class="btn"><<button _respectLabel "DiscussNpcKinkResult">><<set $discussNpcKink = _discussionOption.kink>><<set $discussNpcKinkMode = "respect_boundary">><</button>></div>
<</if>>
<</capture>>
<</for>>
</div>
<</if>>
<div class="padding-top"><div class="btn"><<button "Back" "enhanced_interaction_system">><</button>></div></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<set _discussionResult = window.tryDiscussKnownKink($player, $interactionNpc, $discussNpcKink, $discussNpcKinkMode)>>
<<if _discussionResult.attempted>>
<<SpendTime 5>>
<<SpendEnergy $player 2>>
<</if>>
<<Chat $interactionNpc _discussionResult.npcLine>>
<<if _discussionResult.summary>><<ChatMessage _discussionResult.summary>><</if>>
<<unset $discussNpcKink $discussNpcKinkMode>>
<div class="padding-top">
<div class="btn"><<button "Discuss another preference" "DiscussNpcKinks">><</button>></div>
<div class="btn"><<button "Back" "enhanced_interaction_system">><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<Chat $player "What do you feel like doing right now?">>
<<set _desireAnswer = AskNpcCurrentDesire($player, $interactionNpc)>>
<<Chat $interactionNpc _desireAnswer.response>>
<<SpendTime 3>>
<div class="padding-top"><div class="btn"><<button "Back" "enhanced_interaction_system">><</button>></div></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<Chat $player "How are things in your personal life?">>
<<set _personalAnswer = AskNpcPersonalLife($player, $interactionNpc)>>
<<Chat $interactionNpc _personalAnswer.response>>
<<SpendTime 5>>
<div class="padding-top"><div class="btn"><<button "Back" "enhanced_interaction_system">><</button>></div></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<Chat $player "I've noticed a few changes around you lately. Is something going on?">>
<<if typeof window.AskNpcPartnerFeminization === "function">>
<<set _partnerChangesAnswer = window.AskNpcPartnerFeminization($player, $interactionNpc)>>
<<Chat $interactionNpc _partnerChangesAnswer.response>>
<<else>>
<<Chat $interactionNpc "I'm not sure what you mean.">>
<</if>>
<<SpendTime 5>>
<div class="padding-top"><div class="btn"><<button "Back" "enhanced_interaction_system">><</button>></div></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<Chat $player "Have you heard anything interesting lately?">>
<<set _rumorAnswer = AskNpcAboutRumor($player, $interactionNpc)>>
<<Chat $interactionNpc _rumorAnswer.response>>
<<if _rumorAnswer.success and _rumorAnswer.rumorId and setup.learnPlayerPartnerNightFromRumor>>
<<run setup.learnPlayerPartnerNightFromRumor(_rumorAnswer.rumorId, _rumorAnswer.rumorConfidence ?? 0)>>
<</if>>
<<SpendTime 5>>
<div class="padding-top"><div class="btn"><<button "Back" "enhanced_interaction_system">><</button>></div></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<if $partnerRumorResult>><p><<print $partnerRumorResult.line>></p><</if>>
<<set _concern = GetPlayerPartnerRumorConcern($interactionNpc)>>
<<if _concern>>
<<Chat $interactionNpc _concern.line>>
<<capture _concern>>
<div class="btn"><<button "Deny the story" "DiscussPartnerRumor">>
<<set $partnerRumorResult = RespondToPlayerPartnerRumor($interactionNpc, _concern.rumorId, "deny")>>
<<SpendTime 5>>
<</button>></div>
<div class="btn"><<button "Confirm the story" "DiscussPartnerRumor">>
<<set $partnerRumorResult = RespondToPlayerPartnerRumor($interactionNpc, _concern.rumorId, "confirm")>>
<<SpendTime 5>>
<</button>></div>
<<set _ackLabel = _concern.response == "support" ? "Thank them for their support" : "Give them space">>
<div class="btn"><<button _ackLabel "DiscussPartnerRumor">>
<<set $partnerRumorResult = RespondToPlayerPartnerRumor($interactionNpc, _concern.rumorId, "acknowledge")>>
<<SpendTime 5>>
<</button>></div>
<</capture>>
<<elseif not $partnerRumorResult>><p>There is no new story to discuss right now.</p><</if>>
<div class="padding-top"><div class="btn"><<button "Back" "enhanced_interaction_system">><<unset $partnerRumorResult>><</button>></div></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<if $rumorDiscussionResult>><<Chat $interactionNpc $rumorDiscussionResult.response>><</if>>
<<set _stories = GetPlayerRumorDiscussionOptions($interactionNpc)>>
<<if not _stories.length>><p>There are no stories to discuss with them right now.</p><</if>>
<<for _story range _stories>>
<<capture _story>>
<p><<print _story.label>></p>
<<if _story.canDiscuss>>
<div class="btn"><<button "Ask for their explanation" "DiscussKnownRumor">>
<<set $rumorDiscussionResult = DiscussPlayerKnownRumor($interactionNpc, _story.rumorId)>>
<<SpendTime 5>>
<</button>></div>
<</if>>
<<if _story.canRelay>>
<div class="btn"><<button "Pass on the correction" "DiscussKnownRumor">>
<<set $rumorDiscussionResult = RelayPlayerRumorCorrection($interactionNpc, _story.rumorId)>>
<<SpendTime 5>>
<</button>></div>
<</if>>
<</capture>>
<</for>>
<div class="padding-top"><div class="btn"><<button "Back" "enhanced_interaction_system">><<unset $rumorDiscussionResult>><</button>></div></div>
<</nobr>><<nobr>>
<<set _sexPrefResult = false>>
<<switch $interactionNpc.info.sexualPreference>>
<<case "Feminine">>
<<if $player.calculateFemininity() > 5>>
<<set _sexPrefResult = true>>
<</if>>
<<case "Manly">>
<<if $player.calculateFemininity() <= 5>>
<<set _sexPrefResult = true>>
<</if>>
<<case "Bi">>
<<set _sexPrefResult = true>>
<</switch>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _oldNpcInt = $NpcInteractions>>
<<set $NpcInteractions = []>>
<<set $NpcInteractions = _oldNpcInt>>
<<set _pairChoiceMeta = {
talk: { label: 'Conversation', chip: 'Talk', status: 'They are talking right now.' },
chat: { label: 'Chat', chip: 'Chat', status: 'They are chatting.' },
gossip: { label: 'Gossip', chip: 'Gossip', status: 'They are trading gossip, heads close together.' },
laugh: { label: 'Laughing', chip: 'Laugh', status: 'They are laughing about something.' },
compliment: { label: 'Compliments', chip: 'Kind', status: 'They are being nice to each other.' },
help: { label: 'Helping out', chip: 'Help', status: 'They are helping each other.' },
comfort: { label: 'Comforting', chip: 'Comfort', status: 'One of them is comforting the other.' },
family_talk: { label: 'Family moment', chip: 'Family', status: 'They are discussing family matters.' },
bicker: { label: 'Bickering', chip: 'Bicker', status: 'They are bickering over something petty.' },
scold: { label: 'Scolding', chip: 'Scold', status: 'One is scolding the other.' },
dote: { label: 'Doting', chip: 'Dote', status: 'They are clearly fond of each other.' },
flirt: { label: 'Flirting', chip: 'Flirt', status: 'They are flirting shamelessly.' },
hug: { label: 'Close moment', chip: 'Hug', status: 'They are sharing a quiet moment.' },
kiss: { label: 'Romantic moment', chip: 'Kiss', status: 'They are focused on each other.' },
cuddle: { label: 'Cuddling', chip: 'Cuddle', status: 'They are curled up together.' },
makeout: { label: 'Making out', chip: 'Makeout', status: 'They are all over each other.' },
sex: { label: 'Private moment', chip: 'Intimate', status: 'This is a very private interaction.' },
quickie: { label: 'Quickie', chip: 'Quickie', status: 'A fast, urgent encounter.' },
oral_nn: { label: 'Oral', chip: 'Oral', status: 'They are in the middle of oral sex.' },
vaginal_nn: { label: 'Intimate', chip: 'Intimate', status: 'This is a very private interaction.' },
anal_nn: { label: 'Intimate', chip: 'Rough', status: 'This is rougher - and very private.' },
kinky_nn: { label: 'Kinky scene', chip: 'Kinky', status: 'Whatever they are doing, it is elaborate.' },
argue: { label: 'Argument', chip: 'Tension', status: 'They are in the middle of an argument.' },
fight: { label: 'Conflict', chip: 'Fight', status: 'Things are escalating fast.' },
insult: { label: 'Insults', chip: 'Insult', status: 'They are trading insults.' },
threaten: { label: 'Threats', chip: 'Threat', status: 'One is threatening the other.' },
intimidate: { label: 'Intimidation', chip: 'Intimidate', status: 'One is leaning on the other, hard.' },
drift_apart: { label: 'Drifting apart', chip: 'Distant', status: 'There is a cool distance between them.' },
resent: { label: 'Resentment', chip: 'Resent', status: 'Old grievances are simmering between them.' },
tease: { label: 'Teasing', chip: 'Tease', status: 'They are trading teasing remarks.' },
confide: { label: 'Confidence', chip: 'Confide', status: 'They are sharing something private and quiet.' },
dance: { label: 'Dancing', chip: 'Dance', status: 'They are dancing together.' },
console: { label: 'Consoling', chip: 'Console', status: 'One is comforting the other through something rough.' },
prank: { label: 'Pranking', chip: 'Prank', status: 'They are pulling a prank.' },
boast: { label: 'Bragging', chip: 'Boast', status: 'One of them is loudly showing off.' },
reconcile: { label: 'Reconciling', chip: 'Reconcile', status: 'They are making up after a fight.' },
train_together: { label: 'Training', chip: 'Train', status: 'They are training together.' },
share_drink: { label: 'Drinks', chip: 'Drink', status: 'They are sharing a drink.' }
}>>
<<set _pairChoiceRelations = {
quest: 'Quest target',
lover: 'Devoted',
love: 'Romantic',
close: 'Trusted',
friendly: 'Friendly',
neutral: 'Neutral',
dislike: 'Strained',
enemy: 'Hostile'
}>>
<<set _pairChoiceContext = _pairChoiceMeta[$talkPairInteractionType] ?? { label: 'Encounter', chip: 'Notice', status: 'Choose who to approach.' }>>
<<set _pairNpc1 = $talkPairNPC1>>
<<set _pairNpc1Friendship = $player.getRelationship(_pairNpc1.info.id, false)?.metrics?.friendship ?? 0>>
<<set _pairNpc1Love = $player.getRelationship(_pairNpc1.info.id, false)?.metrics?.love ?? 0>>
<<if _pairNpc1.info.questInfo.isQuestCharacter == true>>
<<set _pairNpc1Relation = 'quest'>>
<<elseif _pairNpc1Love >= 90>>
<<set _pairNpc1Relation = 'lover'>>
<<elseif _pairNpc1Love > 75>>
<<set _pairNpc1Relation = 'love'>>
<<elseif _pairNpc1Friendship >= 75>>
<<set _pairNpc1Relation = 'close'>>
<<elseif _pairNpc1Friendship >= 25>>
<<set _pairNpc1Relation = 'friendly'>>
<<elseif _pairNpc1Friendship >= -25>>
<<set _pairNpc1Relation = 'neutral'>>
<<elseif _pairNpc1Friendship >= -75>>
<<set _pairNpc1Relation = 'dislike'>>
<<else>>
<<set _pairNpc1Relation = 'enemy'>>
<</if>>
<<if _pairNpc1.characterEvents.isEventRegistered(_pairNpc1.info.id, "Is Head Girl") == true>>
<<set _pairNpc1Role = "Head Girl">>
<<else>>
<<set _pairNpc1Role = (_pairNpc1.info.characterWork == "None" ? "Citizen" : _pairNpc1.info.characterWork)>>
<</if>>
<<if _pairNpc1.info.questInfo.isQuestCharacter == true>>
<<set _pairNpc1Role = _pairNpc1.info.questInfo.currentCharState>>
<</if>>
<<set _pairNpc1DescParts = []>>
<<set _pairNpc1DescParts.push(_pairNpc1.getFatText())>>
<<set _pairNpc1DescParts.push(_pairNpc1.info.skin.toLowerCase())>>
<<set _pairNpc1AgeText = _pairNpc1.getAgeText()>>
<<if _pairNpc1AgeText>><<set _pairNpc1DescParts.push(_pairNpc1AgeText.toLowerCase())>><</if>>
<<if _pairNpc1.info.hairColor>><<set _pairNpc1DescParts.push(_pairNpc1.info.hairColor.toLowerCase() + " hair")>><</if>>
<<set _pairNpc1Description = _pairNpc1DescParts.join(", ")>>
<<if _pairNpc1Relation == 'love' || _pairNpc1Relation == 'lover'>>
<<set _pairNpc1MetricLabel = 'Love'>>
<<set _pairNpc1MetricValue = Math.max(0, Math.min(100, _pairNpc1Love))>>
<<set _pairNpc1MetricDisplay = Math.floor(_pairNpc1Love)>>
<<set _pairNpc1MetricClass = ' pair-choice-card__metric-fill--love'>>
<<else>>
<<set _pairNpc1MetricLabel = 'Connection'>>
<<set _pairNpc1MetricValue = Math.max(0, Math.min(100, (_pairNpc1Friendship + 100) / 2))>>
<<set _pairNpc1MetricDisplay = Math.floor(_pairNpc1Friendship)>>
<<set _pairNpc1MetricClass = ''>>
<</if>>
<<set _pairNpc1Card = '<article class="pair-choice-card" data-relation="' + _pairNpc1Relation + '">'>>
<<set _pairNpc1Card += '<div class="pair-choice-card__header"><span class="pair-choice-card__eyebrow">' + _pairChoiceContext.label + '</span><span class="pair-choice-card__action">Talk</span></div>'>>
<<set _pairNpc1Card += '<div class="pair-choice-card__main"><div class="pair-choice-card__avatar-shell"><img class="pair-choice-card__avatar" src="' + _pairNpc1.getPhotoImage() + '" alt=""></div><div class="pair-choice-card__content">'>>
<<set _pairNpc1Card += '<div class="pair-choice-card__role">' + _pairNpc1Role + '</div>'>>
<<set _pairNpc1Card += '<div class="pair-choice-card__name-row"><div class="pair-choice-card__name">' + _pairNpc1.info.firstName + '</div><span class="pair-choice-card__relation-pill">' + (_pairChoiceRelations[_pairNpc1Relation] ?? 'Neutral') + '</span></div>'>>
<<set _pairNpc1Card += '<div class="pair-choice-card__description">' + _pairNpc1Description + '</div>'>>
<<set _pairNpc1Card += '<div class="pair-choice-card__metric-row"><span class="pair-choice-card__metric-label">' + _pairNpc1MetricLabel + '</span><div class="pair-choice-card__metric-bar"><div class="pair-choice-card__metric-fill' + _pairNpc1MetricClass + '" style="width: ' + _pairNpc1MetricValue + '%"></div></div><span class="pair-choice-card__metric-value">' + _pairNpc1MetricDisplay + '</span></div>'>>
<<set _pairNpc1Card += '</div></div></article>'>>
<<set _pairNpc2 = $talkPairNPC2>>
<<set _pairNpc2Friendship = $player.getRelationship(_pairNpc2.info.id, false)?.metrics?.friendship ?? 0>>
<<set _pairNpc2Love = $player.getRelationship(_pairNpc2.info.id, false)?.metrics?.love ?? 0>>
<<if _pairNpc2.info.questInfo.isQuestCharacter == true>>
<<set _pairNpc2Relation = 'quest'>>
<<elseif _pairNpc2Love >= 90>>
<<set _pairNpc2Relation = 'lover'>>
<<elseif _pairNpc2Love > 75>>
<<set _pairNpc2Relation = 'love'>>
<<elseif _pairNpc2Friendship >= 75>>
<<set _pairNpc2Relation = 'close'>>
<<elseif _pairNpc2Friendship >= 25>>
<<set _pairNpc2Relation = 'friendly'>>
<<elseif _pairNpc2Friendship >= -25>>
<<set _pairNpc2Relation = 'neutral'>>
<<elseif _pairNpc2Friendship >= -75>>
<<set _pairNpc2Relation = 'dislike'>>
<<else>>
<<set _pairNpc2Relation = 'enemy'>>
<</if>>
<<if _pairNpc2.characterEvents.isEventRegistered(_pairNpc2.info.id, "Is Head Girl") == true>>
<<set _pairNpc2Role = "Head Girl">>
<<else>>
<<set _pairNpc2Role = (_pairNpc2.info.characterWork == "None" ? "Citizen" : _pairNpc2.info.characterWork)>>
<</if>>
<<if _pairNpc2.info.questInfo.isQuestCharacter == true>>
<<set _pairNpc2Role = _pairNpc2.info.questInfo.currentCharState>>
<</if>>
<<set _pairNpc2DescParts = []>>
<<set _pairNpc2DescParts.push(_pairNpc2.getFatText())>>
<<set _pairNpc2DescParts.push(_pairNpc2.info.skin.toLowerCase())>>
<<set _pairNpc2AgeText = _pairNpc2.getAgeText()>>
<<if _pairNpc2AgeText>><<set _pairNpc2DescParts.push(_pairNpc2AgeText.toLowerCase())>><</if>>
<<if _pairNpc2.info.hairColor>><<set _pairNpc2DescParts.push(_pairNpc2.info.hairColor.toLowerCase() + " hair")>><</if>>
<<set _pairNpc2Description = _pairNpc2DescParts.join(", ")>>
<<if _pairNpc2Relation == 'love' || _pairNpc2Relation == 'lover'>>
<<set _pairNpc2MetricLabel = 'Love'>>
<<set _pairNpc2MetricValue = Math.max(0, Math.min(100, _pairNpc2Love))>>
<<set _pairNpc2MetricDisplay = Math.floor(_pairNpc2Love)>>
<<set _pairNpc2MetricClass = ' pair-choice-card__metric-fill--love'>>
<<else>>
<<set _pairNpc2MetricLabel = 'Connection'>>
<<set _pairNpc2MetricValue = Math.max(0, Math.min(100, (_pairNpc2Friendship + 100) / 2))>>
<<set _pairNpc2MetricDisplay = Math.floor(_pairNpc2Friendship)>>
<<set _pairNpc2MetricClass = ''>>
<</if>>
<<set _pairNpc2Card = '<article class="pair-choice-card" data-relation="' + _pairNpc2Relation + '">'>>
<<set _pairNpc2Card += '<div class="pair-choice-card__header"><span class="pair-choice-card__eyebrow">' + _pairChoiceContext.label + '</span><span class="pair-choice-card__action">Talk</span></div>'>>
<<set _pairNpc2Card += '<div class="pair-choice-card__main"><div class="pair-choice-card__avatar-shell"><img class="pair-choice-card__avatar" src="' + _pairNpc2.getPhotoImage() + '" alt=""></div><div class="pair-choice-card__content">'>>
<<set _pairNpc2Card += '<div class="pair-choice-card__role">' + _pairNpc2Role + '</div>'>>
<<set _pairNpc2Card += '<div class="pair-choice-card__name-row"><div class="pair-choice-card__name">' + _pairNpc2.info.firstName + '</div><span class="pair-choice-card__relation-pill">' + (_pairChoiceRelations[_pairNpc2Relation] ?? 'Neutral') + '</span></div>'>>
<<set _pairNpc2Card += '<div class="pair-choice-card__description">' + _pairNpc2Description + '</div>'>>
<<set _pairNpc2Card += '<div class="pair-choice-card__metric-row"><span class="pair-choice-card__metric-label">' + _pairNpc2MetricLabel + '</span><div class="pair-choice-card__metric-bar"><div class="pair-choice-card__metric-fill' + _pairNpc2MetricClass + '" style="width: ' + _pairNpc2MetricValue + '%"></div></div><span class="pair-choice-card__metric-value">' + _pairNpc2MetricDisplay + '</span></div>'>>
<<set _pairNpc2Card += '</div></div></article>'>>
<div class="pair-choice-screen">
<div class="pair-choice-screen__hero">
<div class="pair-choice-screen__hero-copy">
<div class="pair-choice-screen__eyebrow">Choose who to approach</div>
<div class="pair-choice-screen__title"><<print _pairChoiceContext.label>></div>
<div class="pair-choice-screen__status"><<print _pairChoiceContext.status>></div>
</div>
<div class="pair-choice-screen__chip"><<print _pairChoiceContext.chip>></div>
</div>
<div class="pair-choice-screen__grid">
<<button _pairNpc1Card 'CharacterInteractions'>>
<<set $indexNPC = $talkPairIndexNPC1>>
<<set $interactionNpc = $Characters[$indexNPC]>>
/* Snapshot everyone at the Conversation location before leaving the
pair UI; these are the witnesses if the encounter becomes a fight. */
<<set _conversationLocation = $talkPairLocation ?? $talkPairNPC1.info.currentLocation>>
<<set _conversationWitnessIds = []>>
<<for _pairWitness range $Characters>>
<<if _pairWitness && _pairWitness.info && _pairWitness.info.currentLocation === _conversationLocation>>
<<run _conversationWitnessIds.push(_pairWitness.info.id)>>
<</if>>
<</for>>
<<set $interactionPairWitness = {
targetId: $talkPairNPC1.info.id,
witnessIds: _conversationWitnessIds,
location: _conversationLocation
}>>
<<unset $talkPairNPC1 $talkPairNPC2 $talkPairIndexNPC1 $talkPairIndexNPC2 $talkPairInteractionType $talkPairLocation>>
<</button>>
<<button _pairNpc2Card 'CharacterInteractions'>>
<<set $indexNPC = $talkPairIndexNPC2>>
<<set $interactionNpc = $Characters[$indexNPC]>>
<<set _conversationLocation = $talkPairLocation ?? $talkPairNPC2.info.currentLocation>>
<<set _conversationWitnessIds = []>>
<<for _pairWitness range $Characters>>
<<if _pairWitness && _pairWitness.info && _pairWitness.info.currentLocation === _conversationLocation>>
<<run _conversationWitnessIds.push(_pairWitness.info.id)>>
<</if>>
<</for>>
<<set $interactionPairWitness = {
targetId: $talkPairNPC2.info.id,
witnessIds: _conversationWitnessIds,
location: _conversationLocation
}>>
<<unset $talkPairNPC1 $talkPairNPC2 $talkPairIndexNPC1 $talkPairIndexNPC2 $talkPairInteractionType $talkPairLocation>>
<</button>>
</div>
<<set _pairIsAdultChoice = (typeof window.isAdultInteraction === 'function') ? window.isAdultInteraction($talkPairInteractionType) : false>>
<<set _pairIsConflictChoice = (typeof window.isConflictInteraction === 'function') ? window.isConflictInteraction($talkPairInteractionType) : false>>
<<set _pairIsRomanceChoice = (typeof window.isRomanceInteraction === 'function') ? window.isRomanceInteraction($talkPairInteractionType) : false>>
<<set _pairIsSocialChoice = (typeof window.isSocialInteraction === 'function') ? window.isSocialInteraction($talkPairInteractionType) : false>>
<<if _pairIsAdultChoice>>
<div class="pair-choice-screen__adult-actions">
<div class="btn"><<button "Watch quietly" "ObserveNpcPair">>
<<run window.AwardNpcPairObservation($talkPairNPC1, $talkPairNPC2, $talkPairInteractionType, 1)>>
<<set $observePhase = 1>>
<</button>></div>
<div class="btn"><<button "Interrupt them" "InterruptNpcPair">><</button>></div>
</div>
<<elseif _pairIsConflictChoice>>
<div class="pair-choice-screen__adult-actions">
<div class="btn"><<button "Watch quietly" "ObserveNpcPair">>
<<set $observePhase = 1>>
<</button>></div>
<div class="btn"><<button "Defuse" "InterveneNpcPair">>
<<set $intervenePairAction = "defuse">>
<</button>></div>
<div class="btn"><<button "Cheer them on" "InterveneNpcPair">>
<<set $intervenePairAction = "cheer_on">>
<</button>></div>
<div class="btn"><<button "Side with first" "InterveneNpcPair">>
<<set $intervenePairAction = "side_with_a">>
<</button>></div>
<div class="btn"><<button "Side with second" "InterveneNpcPair">>
<<set $intervenePairAction = "side_with_b">>
<</button>></div>
</div>
<<elseif _pairIsRomanceChoice>>
<div class="pair-choice-screen__adult-actions">
<div class="btn"><<button "Watch quietly" "ObserveNpcPair">>
<<set $observePhase = 1>>
<</button>></div>
<div class="btn"><<button "Join in" "InterveneNpcPair">>
<<set $intervenePairAction = "join_in">>
<</button>></div>
<div class="btn"><<button "Interrupt them" "InterruptNpcPair">><</button>></div>
</div>
<<elseif _pairIsSocialChoice>>
<div class="pair-choice-screen__adult-actions">
<div class="btn"><<button "Watch quietly" "ObserveNpcPair">>
<<set $observePhase = 1>>
<</button>></div>
<div class="btn"><<button "Join in" "InterveneNpcPair">>
<<set $intervenePairAction = "join_in">>
<</button>></div>
</div>
<</if>>
<div class="pair-choice-screen__actions">
<<button "Back to location" $player.info.currentLocation>>
<<unset $talkPairNPC1 $talkPairNPC2 $talkPairIndexNPC1 $talkPairIndexNPC2 $talkPairInteractionType $talkPairLocation>>
<</button>>
</div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<div class="padding-top">
<div class="btn-container">
<div class="btn"><<button "Instruct to remove the clothing" "Type_of_TakeOff_Clothes">><<set $typeRequest = "instruct">><</button>></div>
<div class="btn"><<button "request to remove the clothing" "Type_of_TakeOff_Clothes">><<set $typeRequest = "request">><</button>></div>
<div class="btn"><<button "Back" "enhanced_interaction_system">><</button>></div>
</div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<set _allow = false>>
<<switch $typeRequest>>
<<case "instruct">>
<<if ($interactionNpc.attributes.dominance.value < $player.attributes.dominance.value || $interactionNpc.attributes.dominance.value == $interactionNpc.attributes.dominance.max) || ($player.characterEvents.isEventRegistered($player.info.id, "Became A Pimp") == true && $interactionNpc.info.characterWork == "Hooker")>>
<<set _allow = true>>
<<else>>
<<ChatMessage "Not enough dominance.">>
<</if>>
<<if $interactionNpc.attributes.dominance.value > 4 && (($player.characterEvents.isEventRegistered($player.info.id, "Became A Pimp") == true && $interactionNpc.info.characterWork == "Hooker") == false)>>
<<set _allow = false>>
<<set _msg = $interactionNpc.info.firstName + "'s dominance is too high">>
<<ChatMessage _msg>>
<</if>>
<<case "request">>
<<if ($player.getRelationship($interactionNpc.info.id, false)?.metrics?.love ?? 0) > 80>>
<<set _allow = true>>
<<else>>
<<ChatMessage "Not enough love level.">>
<</if>>
<</switch>>
<<if _allow == true>>
<<Chat $interactionNpc "Okay, I'll take it off.">>
<<run $interactionNpc.takeOffClothing($interactionNpc.clothes.getFirstClothingItemByType($clothID))>>
<<else>>
<<Chat $interactionNpc "I won't do that.">>
<</if>>
<div class="padding-top">
<div class="btn"><<button "Back" "enhanced_interaction_system">><<unset $clothID $typeRequest>><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<if $interactionNpc.inventory.items.size > 0>>
<div class="item-shop-container">
<<for _item range $interactionNpc.inventory.items>>
<<if _item.type != _item.getItemTypeByString("Clothing")>>
<<continue>>
<</if>>
<<capture _item>>
<div class="shop-item">
__<<link '<h3 class="item-title"><<print _item.name>></h3>'>>
<<run Dialog.create(_item.name)>>
<<run Dialog.wiki(_item.getImg())>>
<<run Dialog.open();>>
<</link>>__
<p class="item-quantity">Quantity: <<print _item.quantity>></p>
<p class="item-price">Price: <<print _item.price>>$</p>
<p class="item-price">Weight: <<print _item.weight>></p>
<div class="btn-row">
<div style="flex-grow: 1; flex-basis: 0; margin: 0 5px;" class="btn">
<<if _item.type == _item.getItemTypeByString("Clothing")>>
<<button "Put on" "ChangeNPC_Cloth">>
<<run $interactionNpc.useItem(_item, $interactionNpc)>>
<<run $interactionNpc.inventory.removeItem(_item.name, 1)>>
<</button>>
<</if>>
</div>
<div style="flex-grow: 1; flex-basis: 0; margin: 0 5px;" class="btn">
<<button "Throw it" "ChangeNPC_Cloth">>
<<run $interactionNpc.inventory.removeItem(_item.name, 1)>>
<</button>>
</div>
</div>
</div>
<</capture>>
<</for>>
</div>
<</if>>
<div class="padding-top">
<<BackButton "<<set $canShowStatsBtn = true>>">>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "FightPhrases">>
<<ShowNpcIcon $interactionNpc>>
<div class="padding-top">
<div class="btn-container">
<<set _battleSetControls = {attack: true, seduce: true, items: true, actions: true}>>
<<set _npcGoodRelationToPlayer = npcHasGoodRelationToPlayer($interactionNpc, $player)>>
<div class="btn"><<button "Fight">><<StartFight $player $interactionNpc _battleSetControls undefined undefined>><</button>></div>
<<if $interactionNpc.info.characterWork == "Pimp">>
<div class="btn"><<button "Surrender" "EndOfBattle_Pimp">><<set $LoseBattle = true>><<unset $interactionNpc $fightPhrasesNpcWon $fightPhrasesPlayerWon>> <</button>></div>
<<elseif $interactionNpc.info.characterTraits.includes("Aggressive") && !_npcGoodRelationToPlayer>>
<div class="btn"><<button "Surrender" "AggressiveWin">><<set $surrenderFight = true>><</button>></div>
<<else>>
<div class="btn"><<button "Surrender" "GiveUpFight">><</button>></div>
<</if>>
</div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ChatMessage 'You gave up. Your dominance dropped and you feel more submissive.'>>
<<set _rand = Random(3, 5, true) * -1>>
<<SetCharProgression $player 'dominance' _rand true>>
<<set _xp = Random(1, 3)>>
<<SetCharProgression $player 'submission' _xp true>>
<div style="margin-top: 10px;">
<<BackButton "<<set $canShowStatsBtn = true>> <<unset $interactionNpc $fightPhrasesNpcWon $fightPhrasesPlayerWon>> <<set $gameSettings.allowSaves = true>>">>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<include "CheckSexPref">>
<<set _npcGoodRelationToPlayer = npcHasGoodRelationToPlayer($interactionNpc, $player)>>
<<if _npcGoodRelationToPlayer>>
<<set _msg = $interactionNpc.info.firstName + " backs off instead of taking advantage of you.">>
<<ChatMessage _msg>>
<div style="margin-top: 10px;">
<<BackButton "<<set $canShowStatsBtn = true>> <<unset $interactionNpc $fightPhrasesNpcWon $fightPhrasesPlayerWon>> <<set $gameSettings.allowSaves = true>>">>
</div>
<<elseif _sexPrefResult == true && $interactionNpc.genitalia() == "Penis" && $interactionNpc.status.potency.value != $interactionNpc.status.potency.min>>
<<if $surrenderFight == true>>
<<set _msg = "After you surrendered, " + $interactionNpc.info.firstName + " approaches you with a smirk and begins to strip off your clothes">>
<<else>>
<<set _msg = "After you surrendered, " + $interactionNpc.info.firstName + " approaches you with a smirk and begins to strip off your clothes">>
<</if>>
<<ChatMessage _msg>>
<div style="margin-top: 10px;">
<div class="btn"><<button "Continue" "PassiveSex">><<set $sexType = "hookerWork">><<set $aggressiveFuck = true>><</button>></div>
</div>
<<elseif $gameSettings.contentFilter.PlayerFeminization == true>>
<<run $player.body.face.increase(Random(0.05, 0.5, true))>>
<<run $player.body.breastSize.increase(Random(0.05, 0.5, true))>>
<<run $player.body.buttSize.increase(Random(0.05, 0.5, true))>>
<<set _pron = $interactionNpc.pronoun().toLowerCase()>>
<<if $surrenderFight == true>>
<<set _msg = "After you surrendered, " + _pron + " takes out pink pills from " + $interactionNpc.pronounHisHer() + " pocket and makes you swallow them. Due to these pills, you feel a burning sensation throughout your body.">>
<<else>>
<<set _msg = "After " + $interactionNpc.info.firstName + " defeats you, " + _pron + " takes out pink pills from " + $interactionNpc.pronounHisHer() + " pocket and makes you swallow them. Due to these pills, you feel a burning sensation throughout your body.">>
<</if>>
<<ChatMessage _msg>>
<div style="margin-top: 10px;">
<<BackButton "<<set $canShowStatsBtn = true>> <<unset $interactionNpc $fightPhrasesNpcWon $fightPhrasesPlayerWon>> <<set $gameSettings.allowSaves = true>>">>
</div>
<<else>>
<<ChatMessage 'The player feminization content is blocked, as the \'Forced Player Feminization\' option is disabled in the content filter'>>
<div style="margin-top: 10px;">
<<BackButton "<<set $canShowStatsBtn = true>> <<unset $interactionNpc $fightPhrasesNpcWon $fightPhrasesPlayerWon>> <<set $gameSettings.allowSaves = true>>">>
</div>
<</if>>
<<unset $surrenderFight>>
<</nobr>><<nobr>>
\* B2: the caught partner reacts by kink / dominance instead of always squaring up.
resolveCuckoldReaction returns aroused | confront | negotiable; the
fetish-positive branches are gated behind the Cuckolding content-filter opt-out
(absent on old saves → treated as enabled). Outcomes are separate passages. */
<<include "UpdateAll">>
<<set _partner = $romanticPartnerObject.character>>
<<ShowNpcIcon _partner>>
<<set _cuckReaction = (typeof window.resolveCuckoldReaction === 'function') ? window.resolveCuckoldReaction(_partner) : 'confront'>>
<<set _cuckAllowed = ($gameSettings.contentFilter.Cuckolding !== false)>>
<<if _cuckReaction == 'aroused' && _cuckAllowed>>
<<Chat _partner 'Relax, I\'m not pissed. If they want it, keep going - I want to watch.'>>
<div class="btn padding-top"><<button "Take them up on it" "jealous_partner_share">><</button>></div>
<div class="btn padding-top"><<button "Not like this" "jealous_partner_back">><</button>></div>
<<elseif _cuckReaction == 'negotiable'>>
<<Chat _partner 'Hey - that\'s my partner. Back off, unless you can give me a reason not to make a scene.'>>
<div class="btn padding-top"><<button "Talk them down" "jealous_partner_talk">><</button>></div>
<<if $player.money >= 200>>
<div class="btn padding-top"><<button "Slip them $200" "jealous_partner_bribe">><</button>></div>
<</if>>
<div class="btn padding-top"><<button "Fight">>
<<set $indexNPC = $romanticPartnerObject.index>>
<<set $interactionNpc = $Characters[$indexNPC]>>
<<set _battleSetControls = {attack: true, seduce: false, items: true, actions: true}>>
<<StartFight $player $interactionNpc _battleSetControls undefined undefined>>
<</button>></div>
<div class="btn padding-top"><<button "Back off" "jealous_partner_back">><</button>></div>
<<else>>
<<Chat _partner 'Hey! Stay away from my partner!'>>
<div class="btn padding-top"><<button "Fight">>
<<set $indexNPC = $romanticPartnerObject.index>>
<<set $interactionNpc = $Characters[$indexNPC]>>
<<set _battleSetControls = {attack: true, seduce: false, items: true, actions: true}>>
<<StartFight $player $interactionNpc _battleSetControls undefined undefined>>
<</button>></div>
<div class="btn padding-top"><<button "Back off" "jealous_partner_back">><</button>></div>
<</if>>
<</nobr>><<nobr>>
<<set $indexNPC = $romanticPartnerObject.index>>
<<set $interactionNpc = $Characters[$indexNPC]>>
<<ChatMessage 'You raise your hands and step back.'>>
<<set _d = -15>>
<<IncreaseFriendship $player $interactionNpc _d>>
<<IncreaseLove $player $interactionNpc _d>>
<div class="btn padding-top"><<button "Continue" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
<</nobr>><<nobr>>
<<set $indexNPC = $romanticPartnerObject.index>>
<<set $interactionNpc = $Characters[$indexNPC]>>
<<if random(0,100) < 45>>
<<ChatMessage 'You talk fast and smooth. They grudgingly let it slide - this time.'>>
<<set _d = -4>>
<<IncreaseFriendship $player $interactionNpc _d>>
<<else>>
<<ChatMessage 'They are not buying a word of it. The mood curdles.'>>
<<set _d = -12>>
<<IncreaseFriendship $player $interactionNpc _d>>
<<IncreaseLove $player $interactionNpc _d>>
<</if>>
<div class="btn padding-top"><<button "Continue" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
<</nobr>><<nobr>>
<<set $indexNPC = $romanticPartnerObject.index>>
<<set $interactionNpc = $Characters[$indexNPC]>>
<<if $player.money >= 200>>
<<run setup.npcMoney.payTo($interactionNpc, 200)>>
<<ChatMessage 'You fold some cash into their palm. They pocket it and suddenly find the floor very interesting.'>>
<<else>>
<<ChatMessage 'You reach for your wallet - but you are short.'>>
<</if>>
<div class="btn padding-top"><<button "Continue" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
<</nobr>><<nobr>>
<<set _sharingPartner = $interactionNpc>>
<<set $indexNPC = $romanticPartnerObject.index>>
<<set $interactionNpc = $Characters[$indexNPC]>>
<<ChatMessage 'They give their partner an approving look and settle in close to watch. No sulking, no scene - this is the part they were waiting for.'>>
<<if typeof window.applyConsensualPartnerSharingReaction === 'function'>>
<<run window.applyConsensualPartnerSharingReaction($interactionNpc, _sharingPartner, $player, true)>>
<</if>>
<div class="btn padding-top"><<button "Continue" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<LockSettings>>
<<ShowNpcIcon $playerPartner>>
<<if $playerPartnerConfrontationReason == "npc_cheating">>
\* The player walked in on their OWN partner with someone else (divert set by
getCaughtWithOtherId in NewNPCInteraction). The guilty partner must NOT accuse
the player - this branch previously reused the player-cheating script
("What do you think you're doing?"), which read backwards. No caught_cheating
memory is written here: that type means "this NPC caught the PLAYER cheating"
and feeds gift-dampening / apology / dialogue-hook consumers, so recording it
on the cheating partner would invert all of them. The trace is the relation hit. */
<<set _sharingAllowed = typeof window.IsPlayerNpcPartnerSharingAllowed === 'function' && window.IsPlayerNpcPartnerSharingAllowed($playerPartner)>>
<<if _sharingAllowed>>
<<Chat $playerPartner 'I wasn\'t sneaking around on you. I thought this was covered by what we agreed.'>>
<div class="btn padding-top"><<button 'Continue' $player.info.currentLocation>><<unset $playerPartnerConfrontationReason $playerPartnerConfrontationOtherName>><<LeaveInteractionSettings>><</button>></div>
<<else>>
<<set _guilt = 'This... isn\'t what it looks like. I\'m sorry - I never wanted you to find out like this.'>>
<<Chat $playerPartner _guilt>>
<div class="btn padding-top"><<button 'Make a scene' 'player_caught_partner_scene'>><</button>></div>
<div class="btn padding-top"><<button 'End the relationship' 'player_caught_partner_breakup'>><</button>></div>
<div class="btn padding-top"><<button 'Forgive them' 'player_caught_partner_forgive'>><</button>></div>
<</if>>
<<else>>
\* The player's own partner caught the player with someone else. */
<<set _sharingAllowed = typeof window.IsPlayerNpcPartnerSharingAllowed === 'function' && window.IsPlayerNpcPartnerSharingAllowed($playerPartner)>>
<<if _sharingAllowed>>
<<if typeof window.applyConsensualPartnerSharingReaction === 'function'>>
<<run window.applyConsensualPartnerSharingReaction($playerPartner, $player, $interactionNpc, true)>>
<</if>>
<<Chat $playerPartner 'I\'m not mad. We said this was fine - just don\'t make me hear about it from someone else.'>>
<div class="btn padding-top"><<button 'Continue' $player.info.currentLocation>><<unset $playerPartnerConfrontationReason $playerPartnerConfrontationOtherName>><<LeaveInteractionSettings>><</button>></div>
<<else>>
<<if typeof window.recordNpcMemory === 'function'>>
<<set _caughtWithName = $playerPartnerConfrontationOtherName || "someone else">>
<<run window.recordNpcMemory($playerPartner.info.id, "caught_cheating", { detail: _caughtWithName, intensity: 5 })>>
<</if>>
<<Chat $playerPartner 'What do you think you\'re doing? Explain yourself!'>>
<div class="btn padding-top"><<button 'Try to justify' 'player_partner_try_justify'>><</button>></div>
<div class="btn padding-top"><<button 'Say nothing' 'player_partner_fail'>><</button>></div>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<if random(0,100) > 75>>
<<goto "player_partner_success">>
<<else>>
<<goto "player_partner_fail">>
<</if>>
<</nobr>><<nobr>>
<<ChatMessage 'You manage to calm your partner down.'>>
<div class="btn padding-top"><<button 'Continue' $player.info.currentLocation>><<unset $playerPartnerConfrontationReason $playerPartnerConfrontationOtherName>><<LeaveInteractionSettings>><</button>></div>
<</nobr>><<nobr>>
<<set $indexNPC = $playerPartnerIndex>>
<<set $interactionNpc = $Characters[$indexNPC]>>
<<ChatMessage 'Your partner is furious and cuts ties with you.'>>
<<set _curRel = $player.getRelationship($interactionNpc.info.id, false)>>
<<set _deltaFriendship = 6 - _curRel.metrics.friendship>>
<<set _deltaLove = -_curRel.metrics.love>>
<<set _resetRel = {friendship: _deltaFriendship, love: _deltaLove}>>
<<SetRelations $player $interactionNpc _resetRel>>
<<run setup.setPlayerNpcRelationshipStatus($player, $interactionNpc, "friend", {source: "caught_cheating", breakupReason: "Cheating ended the relationship."})>>
<div class="btn padding-top"><<button 'Continue' $player.info.currentLocation>><<unset $playerPartnerConfrontationReason $playerPartnerConfrontationOtherName>><<LeaveInteractionSettings>><</button>></div>
<</nobr>>
\* ─────────── npc_cheating outcomes - the player caught their OWN partner ───────────
Reached from player_partner_confrontation when reason == "npc_cheating". The
player chooses the reaction; this is the NTR-conflict tone. The fetish-positive
"watch / encourage" path is added in Wave B alongside the Cuckold kink and a
content-filter toggle. */<<nobr>>
<<set $indexNPC = $playerPartnerIndex>>
<<set $interactionNpc = $Characters[$indexNPC]>>
<<ChatMessage 'You let them have it. The fight is loud and bitter - but you stay together, for now.'>>
<<set _delta = {friendship: -12, love: -18}>>
<<SetRelations $player $interactionNpc _delta>>
<div class="btn padding-top"><<button 'Continue' $player.info.currentLocation>><<unset $playerPartnerConfrontationReason $playerPartnerConfrontationOtherName>><<LeaveInteractionSettings>><</button>></div>
<</nobr>><<nobr>>
<<set $indexNPC = $playerPartnerIndex>>
<<set $interactionNpc = $Characters[$indexNPC]>>
<<ChatMessage 'You end it on the spot. Whatever the two of you had is over.'>>
<<set _curRel = $player.getRelationship($interactionNpc.info.id, false)>>
<<set _deltaFriendship = 6 - _curRel.metrics.friendship>>
<<set _deltaLove = -_curRel.metrics.love>>
<<set _resetRel = {friendship: _deltaFriendship, love: _deltaLove}>>
<<SetRelations $player $interactionNpc _resetRel>>
<<run setup.setPlayerNpcRelationshipStatus($player, $interactionNpc, "friend", {source: "caught_partner", breakupReason: "The player ended the relationship after catching their partner."})>>
<div class="btn padding-top"><<button 'Continue' $player.info.currentLocation>><<unset $playerPartnerConfrontationReason $playerPartnerConfrontationOtherName>><<LeaveInteractionSettings>><</button>></div>
<</nobr>><<nobr>>
<<set $indexNPC = $playerPartnerIndex>>
<<set $interactionNpc = $Characters[$indexNPC]>>
<<ChatMessage 'You swallow it and tell them it\'s alright. They look relieved - but something between you has quietly shifted.'>>
<<set _delta = {friendship: -2, love: -8}>>
<<SetRelations $player $interactionNpc _delta>>
<div class="btn padding-top"><<button 'Continue' $player.info.currentLocation>><<unset $playerPartnerConfrontationReason $playerPartnerConfrontationOtherName>><<LeaveInteractionSettings>><</button>></div>
<</nobr>><<nobr>>
<<run CreateCharacters({
isPlayer: false,
characterWork: "Student",
age: 18,
}, $generateNumber.students, $studentGenderArray, $studetsSkinsArray, $studentSexPrefArray)>>
/*Hookers */
<<for _i = 1; _i < 3; _i++>>
<<run CreateCharacter({
isPlayer: false,
characterWork: "Hooker",
age: Random(20,45),
gender: "Female",
SexRole: "Passive",
sexualPreference: "Bi",
throatSize: 30,
anusSize: 30,
vaginaSize: 30,
}, true)>>
<</for>>
/*Citizens (all citizens + family members combined, families are formed from them afterwards) */
<<set _totalCitizens = $generateNumber.citizens + $generateNumber.familyMembers>>
<<for _i = 0; _i < _totalCitizens; _i++>>
<<run _currentGender = removeRandomElement($citizensGenderArray)>>
<<run _currentSkin = removeRandomElement($citizensSkinArray)>>
<<run _currentSexPref = removeRandomElement($citizensSexPrefArray)>>
<<if _currentGender == "Male">>
<<switch _currentSexPref>>
<<case "Straight">>
<<set _currentSexPref = "Feminine">>
<<case "Bi">>
<<set _currentSexPref = "Bi">>
<<case "Homo">>
<<set _currentSexPref = "Manly">>
<</switch>>
<<else>>
<<switch _currentSexPref>>
<<case "Straight">>
<<set _currentSexPref = "Manly">>
<<case "Bi">>
<<set _currentSexPref = "Bi">>
<<case "Homo">>
<<set _currentSexPref = "Feminine">>
<</switch>>
<</if>>
<<run CreateCharacter({
isPlayer: false,
characterWork: "None",
age: Random(20,50),
gender: _currentGender,
skin: _currentSkin,
sexualPreference: _currentSexPref,
}, true)>>
<</for>>
/*Families - formed from existing citizens by picking parents and matching children by race */
<<if $generateNumber.familyMembers > 0>>
<<set _numFamilies = Math.max(1, Math.round($generateNumber.familyMembers / 4))>>
<<run CreateFamilies(_numFamilies)>>
<</if>>
/*Solo houses - assign individual houses to all remaining unassigned citizens */
<<run CreateSoloHouses()>>
/*Surgeon */
<<run CreateCharacter({
isPlayer: false,
characterWork: "Plastic Surgeon",
gender: "Male",
age: Random(30,45),
}, true)>>
/*Pimp */
<<run CreateCharacter({
isPlayer: false,
characterWork: "Pimp",
battleSkill: 80,
strength: Random(85,90),
defense: Random(85,90),
vitality: Random(85,90),
dexterity: Random(85,90),
SexRole: "Active",
gender: "Male",
sexualPreference: "Bi",
clothesPreference: "men",
age: Random(30,45),
}, true)>>
/*Photographer */
<<run CreateCharacter({
isPlayer: false,
characterWork: "Photographer",
battleSkill: 80,
strength: Random(85,90),
defense: Random(85,90),
vitality: Random(85,90),
dexterity: Random(85,90),
SexRole: "Active",
gender: "Male",
sexualPreference: "Bi",
clothesPreference: "men",
age: Random(25,45),
}, true)>>
/*Porn Director */
<<run CreateCharacter({
isPlayer: false,
characterWork: "Porn director",
battleSkill: 80,
strength: Random(85,90),
defense: Random(85,90),
vitality: Random(85,90),
dexterity: Random(85,90),
SexRole: "Active",
gender: "Male",
sexualPreference: "Bi",
clothesPreference: "men",
age: Random(30,45),
}, true)>>
/*Quest Characters Start*/
/* Ethan */
<<run _ethan = CreateCharacter({
isPlayer: false,
isQuestCharacter: true,
questCharID: 0,
currentQuestID: 0,
currentCharImg: "Media\\Characters\\QuestChars\\Ethan\\face\\1.png",
currentCharState: "Childhood friend",
firstName: "Ethan",
secondName: "Ashford",
characterWork: "Quest",
SexRole: "Active",
dominance: 4,
gender: "Male",
sexualPreference: "Bi",
clothesPreference: "men",
skin: "White",
age: 18,
}, true)>>
<<run $player.characterEvents.registerEvent(_ethan.info.id, "knows you", 1)>>
/* Robert */
<<run _robert = CreateCharacter({
isPlayer: false,
isQuestCharacter: true,
questCharID: 1,
currentQuestID: 0,
currentCharImg: "Media\\Characters\\QuestChars\\Robert\\face\\1.png",
currentCharState: "Friend's father",
firstName: "Robert",
secondName: "Ashford",
characterWork: "Quest",
SexRole: "Active",
dominance: 8,
gender: "Male",
sexualPreference: "Bi",
clothesPreference: "men",
skin: "White",
age: 45,
}, true)>>
<<run $player.characterEvents.registerEvent(_robert.info.id, "knows you", 1)>>
/* Sarah */
<<run _sarah = CreateCharacter({
isPlayer: false,
isQuestCharacter: true,
questCharID: 2,
currentQuestID: 0,
currentCharImg: "Media\\Characters\\QuestChars\\Sarah\\face\\1.png",
currentCharState: "Friend's sister",
firstName: "Sarah",
secondName: "Ashford",
characterWork: "Quest",
SexRole: "Passive",
dominance: 2,
gender: "Female",
sexualPreference: "Bi",
clothesPreference: "women",
skin: "White",
age: 19,
}, true)>>
<<run $player.characterEvents.registerEvent(_sarah.info.id, "knows you", 1)>>
/* Amanda */
<<run _amanda = CreateCharacter({
isPlayer: false,
isQuestCharacter: true,
questCharID:3,
currentQuestID: 0,
currentCharImg: "Media\\Characters\\QuestChars\\Amanda\\face\\1.png",
currentCharState: "Friend's mom",
firstName: "Amanda",
secondName: "Ashford",
characterWork: "Quest",
SexRole: "Active",
dominance: 6,
gender: "Female",
sexualPreference: "Bi",
clothesPreference: "women",
skin: "White",
age: 35,
}, true)>>
<<run $player.characterEvents.registerEvent(_amanda.info.id, "knows you", 1)>>
/*Quest Characters End*/
<<unset $studentSexPrefArray $citizensSexPrefArray $studetsSkinsArray $citizensSkinArray $studentGenderArray $citizensGenderArray>>
<</nobr>><<nobr>>
<<set $fightPhrasesNpcWon = ["Looks like you're not as tough as you thought, huh? I always knew you were all talk. Now everyone can see it too", "Just goes to show, arrogance doesn't win fights. Skill does. And you were clearly lacking", "Maybe next time you'll think twice before underestimating me. I'm not someone you can just push around.", "Talk big, fall hard. That's what happens to people like you. Remember this defeat.", "I didn't just beat you in a fight, I showed you what happens when you mess with the wrong person.", "Looks like I had the last word this time. And it's a word you won't forget anytime soon"]>>
<<set $fightPhrasesPlayerWon = ["Aaah, damn, that hurts.", "Okay, okay, you win... I'm done.", "Ugh, I didn't see that coming.", "I'm out, I'm out... no more.", "Ouch, my back."]>>
<</nobr>><<nobr>>
<<set $maleNames to ["John", "Michael", "William", "David", "Richard", "Joseph", "Charles", "Thomas", "Daniel", "Matthew", "Robert", "James", "Brian", "Andrew", "Edward", "Steven", "George", "Christopher", "Kenneth", "Anthony", "Kevin", "Paul", "Mark", "Donald", "Ronald", "Jeffrey", "Timothy", "Scott", "Jason", "Eric", "Stephen", "Larry", "Frank", "Gary", "Dennis", "Gregory", "Roger", "Jerry", "Keith", "Terry", "Samuel", "Bryan", "Willie", "Randy", "Howard", "Fred", "Eugene", "Carlos", "Russell", "Phillip", "Roy", "Harry", "Louis", "Benjamin", "Raymond", "Jeffery", "Wayne", "Ralph", "Billy", "Alan", "Juan", "Gerald", "Joe", "Carl", "Jeremy", "Adam", "Arthur", "Lawrence", "Sean", "Albert", "Dylan", "Logan", "Walter", "Jay", "Henry", "Bobby", "Todd", "Craig", "Jesse", "Philip", "Ernest", "Martin", "Ethan", "Ricky", "Dwayne", "Willard", "Warren", "Clarence", "Lee", "Glenn", "Antonio", "Travis", "Stanley", "Fredrick", "Melvin", "Leon", "Micheal", "Kyle", "Adrian", "Alex", "Barry", "Blake", "Cameron", "Chase", "Cody", "Colin", "Curtis", "Darren", "Dominic", "Evan", "Felix", "Garrett", "Gordon", "Grant", "Harrison", "Isaac", "Jackson", "Jake", "Jared", "Jordan", "Justin", "Karl", "Kieran", "Landon", "Liam", "Lucas", "Malcolm", "Mason", "Nathan", "Nolan", "Oscar", "Owen", "Parker", "Patrick", "Quentin", "Rhys", "Sam", "Seth", "Shane", "Spencer", "Theodore", "Tobias", "Trevor", "Victor", "Vincent", "Wesley", "Wyatt", "Xavier", "Zachary", "Aiden", "Alec", "Archer", "Beckett", "Brooks", "Caleb", "Declan", "Derek", "Dexter", "Emmett", "Finn", "Graham", "Hudson", "Hunter", "Ian", "Jaxon", "Jonah", "Kai", "Keegan", "Kellan", "Leo", "Lincoln", "Max", "Nathaniel", "Nico", "Oliver", "Orion", "Preston", "Rhett", "Riley", "Rowan", "Sebastian", "Silas", "Theo", "Tristan", "Xander", "Zane", "Zayden", "Abraham", "August", "Bennett", "Calvin", "Colton", "Dawson", "Elliott", "Ezra", "Fabian", "Griffin", "Hugo", "Isaiah", "Jasper", "Knox", "Levi", "Maddox", "Nash", "Noah", "Peyton", "Roman", "Sawyer", "Simon", "Thaddeus", "Tucker", "Winston", "Zephyr", "Adonis", "Apollo", "Bodhi", "Caspian", "Dante", "Dashiell", "Elias", "Ezekiel", "Finnian", "Gideon", "Hendrix", "Jagger", "Kairos", "Kaspar", "Lachlan", "Maverick", "Nehemiah", "Octavian", "Percival", "Quillon", "Rafferty", "Simeon", "Thelonious", "Ulysses", "Viggo", "Wilder", "Xerxes", "Yardley", "Zephyrus", "Zorion", "Alistair", "Barnaby", "Cassius", "Demitrius", "Emerson", "Finnegan", "Gulliver", "Hawthorne", "Ignatius", "Jotham", "Kipling", "Lysander", "Montgomery", "Napoleon", "Octavius", "Phineas", "Quincy", "Raphael", "Tiberius", "Valentine", "Walden", "Yorick", "Zebedee", "Alaric", "Beauregard", "Calloway", "Darrow", "Emory", "Fitzwilliam", "Gareth", "Hollis", "Ingram", "Jethro", "Kendrick", "Laramie"]>>
<<set $femaleNames to [
"Alice", "Beatrice", "Catherine", "Daisy", "Eleanor",
"Fiona", "Grace", "Hannah", "Isabella", "Jane",
"Katherine", "Lily", "Megan", "Natalie", "Olivia",
"Penelope", "Quinn", "Rebecca", "Samantha", "Tabitha",
"Ursula", "Violet", "Wendy", "Xena", "Yvonne",
"Zoe", "Abigail", "Brianna", "Charlotte", "Delilah",
"Eloise", "Felicity", "Gabrielle", "Hazel", "Isabelle",
"Josephine", "Kaitlyn", "Lillian", "Madeline", "Nora",
"Ophelia", "Paige", "Quincy", "Rachel", "Serena",
"Tiffany", "Uma", "Valerie", "Willow", "Xandra",
"Yasmin", "Zara", "Adeline", "Bella", "Chloe",
"Daphne", "Eva", "Faye", "Georgia", "Holly",
"Ivy", "Jocelyn", "Kelsey", "Leah", "Mia",
"Nina", "Olive", "Piper", "Quincy", "Riley",
"Sophia", "Tessa", "Ursula", "Vivian", "Wren",
"Xiomara", "Yvette", "Zoey", "Alexandra", "Brooklyn",
"Cassandra", "Danielle", "Emily", "Fiona", "Grace",
"Hannah", "Isabella", "Jasmine", "Katherine", "Lily",
"Megan", "Natalie", "Olivia", "Penelope", "Quinn",
"Rebecca", "Samantha", "Tabitha", "Ursula", "Violet",
"Wendy", "Xena", "Yvonne", "Zoe", "Ava", "Brielle", "Carmen", "Diana", "Elena",
"Faith", "Giselle", "Hailey", "Isla", "Jade",
"Kylie", "Luna", "Mila", "Nora", "Olive",
"Piper", "Quinn", "Riley", "Scarlett", "Taylor",
"Uma", "Vivienne", "Willa", "Xanthe", "Yara",
"Zara", "Amelia", "Bianca", "Cecilia", "Daisy",
"Evelyn", "Felicity", "Gemma", "Hazel", "Ivy",
"Josephine", "Kira", "Leah", "Morgan", "Natalia",
"Octavia", "Poppy", "Quincy", "Raven", "Savannah",
"Talia", "Ursula", "Violet", "Wren", "Xia",
"Yasmine", "Zoey", "Avery", "Bella", "Charlotte",
"Daphne", "Eva", "Fiona", "Grace", "Harper",
"Isla", "Juliette", "Katherine", "Layla", "Mia",
"Nina", "Olivia", "Penelope", "Quinn", "Reagan",
"Sophia", "Tessa", "Ursula", "Valentina", "Willow",
"Xena", "Yvonne", "Zara", "Aria", "Blair",
"Clara", "Daisy", "Eloise", "Fiona", "Gwen",
"Hannah", "Isabel", "Jenna", "Kendall", "Lily",
"Maddison", "Nora", "Ophelia", "Paisley", "Quincy",
"Riley", "Sienna", "Tessa", "Ursula", "Vivian",
"Willow", "Ximena", "Yasmin", "Zoe", "Ariana", "Brynn", "Celeste", "Dahlia", "Eliza",
"Fay", "Gwendolyn", "Haven", "Ivy", "Jessamine",
"Kira", "Lilith", "Maeve", "Nola", "Olympia",
"Paisley", "Quiana", "Raven", "Serenity", "Talia",
"Uma", "Vivienne", "Willa", "Xanthe", "Yara",
"Zahara", "Adriana", "Bianca", "Camila", "Darcy",
"Eleanor", "Felicity", "Giselle", "Hermione", "Isla",
"Jocelyn", "Kendall", "Lorelei", "Mabel", "Nina",
"Ophelia", "Primrose", "Quinn", "Rowan", "Savannah",
"Tessa", "Ursula", "Violet", "Winifred", "Xenia",
"Yasmine", "Zephyr", "Avalon", "Briar", "Cassia",
"Daisy", "Evangeline", "Faye", "Guinevere", "Hazel",
"Isabeau", "Jade", "Kenna", "Luna", "Magnolia",
"Niamh", "Odette", "Persephone", "Quincy", "Rhiannon",
"Saoirse", "Thalia", "Undine", "Vesper", "Wren",
"Xandra", "Yelena", "Zelda", "Amara", "Bellatrix",
"Clarissa", "Delphine", "Eowyn", "Fleur", "Gwyneth",
"Harmony", "Isolde", "Jasmine", "Kalliope", "Liliana",
"Maren", "Nerissa", "Ondine", "Pandora", "Quinlan",
"Rosalind", "Selene", "Thisbe", "Ulyssia", "Vada",
"Willow", "Xylia", "Yara", "Zephyra"
]>>
<<set $surnames to ["Smith", "Johnson", "Brown", "Davis", "Wilson", "Miller", "Moore", "Taylor", "Anderson", "Thomas", "Jackson", "White", "Harris", "Martin", "Thompson", "Garcia", "Martinez", "Robinson", "Clark", "Lewis", "Walker", "Hall", "Young", "Allen", "Wright", "King", "Green", "Baker", "Adams", "Nelson", "Hill", "Ramirez", "Campbell", "Mitchell", "Roberts", "Carter", "Phillips", "Evans", "Turner", "Parker", "Collins", "Edwards", "Stewart", "Flores", "Morris", "Nguyen", "Murphy", "Rivera", "Cook", "Rogers", "Morgan", "Peterson", "Cooper", "Reed", "Bailey", "Bell", "Gomez", "Kelly", "Howard", "Ward", "Cox", "Diaz", "Richardson", "Wood", "Watson", "Brooks", "Bennett", "Gray", "James", "Reyes", "Cruz", "Hughes", "Price", "Myers", "Long", "Foster", "Sanders", "Ross", "Morales", "Powell", "Sullivan", "Russell", "Ortiz", "Jenkins", "Gutierrez", "Perry", "Butler", "Barnes", "Fisher", "Henderson", "Coleman", "Simmons", "Patterson", "Jordan", "Reynolds", "Hamilton", "Graham", "Kim", "Gonzales", "Alexander", "Ramos", "Wallace", "Griffin", "West", "Cole", "Hayes", "Adler", "Brock", "Carver", "Delgado", "Elliott", "Fleming", "Graves", "Hansen", "Ingram", "Jefferson", "Keller", "Larson", "Mathews", "Nicholson", "Oliver", "Peters", "Quinn", "Rodriguez", "Silva", "Torres", "Underwood", "Vargas", "Wagner", "Xavier", "York", "Zimmerman", "Avery", "Bishop", "Chapman", "Dixon", "Erickson", "Ferguson", "Gill", "Harrison", "Irwin", "Jensen", "Kendrick", "Lawson", "Mendoza", "Nash", "Owens", "Porter", "Quintero", "Reyes", "Salazar", "Trujillo", "Vasquez", "Weaver", "Xiong", "Yates", "Zuniga", "Armstrong", "Barrett", "Chan", "Dunn", "Eaton", "Freeman", "Gaines", "Huffman", "Ingram", "Jensen", "Knox", "Lopez", "Mendez", "Owens", "Perez", "Quinn", "Ramsey", "Schmidt", "Tucker", "Vaughn", "Watkins", "Yoder", "Zhang", "Bauer", "Chavez", "Donovan", "Fowler", "Gibson", "Hanson", "Ibrahim", "Jackson", "Kaplan", "Lawrence", "Mendez", "Nguyen", "O'Donnell", "Patterson", "Quinn", "Reyes", "Sanchez", "Tanner", "Vargas", "Watts", "Young", "Zhao", "Abbott", "Bennett", "Carlson", "Donnelly", "Estrada", "Fitzgerald", "Gilliam", "Holloway", "Ingram", "Jefferson", "Kennedy", "Larson", "Manning", "Nelson", "O'Donnell", "Perez", "Quinn", "Ramirez", "Sullivan", "Thompson", "Underwood", "Valdez", "Wright", "Xiong", "Yates", "Zimmerman", "Austin", "Beck", "Chang", "Duncan", "Erickson", "Fowler", "Gonzalez", "Harrington", "Iverson", "Johnson", "Kaplan", "Lopez", "Martinez", "Nash", "Owens", "Patterson", "Quintero", "Reyes", "Soto", "Tucker", "Vasquez", "Wagner", "Xavier", "Young", "Zhang", "Bailey", "Chavez", "Dixon", "Eaton", "Fleming", "Garcia", "Hernandez", "Irwin", "Jenkins", "Keller", "Lawson", "Mendoza", "Norton", "Ortega", "Parker", "Ramos", "Sanchez", "Torres", "Valencia", "Walker", "Xiao", "Yoder", "Zuniga", "Bates", "Cruz", "Delgado", "Espinoza", "Fisher", "Gomez", "Hanson", "Ingram", "Jensen", "Kendrick", "Leblanc", "Mendez", "Nguyen", "O'Neill", "Perez", "Quinn", "Rivera", "Sullivan", "Trujillo", "Vargas", "Watts", "Yates", "Zhou"]>>
<</nobr>><<nobr>>
<div class="cp-card">
<div class="cp-card-header cp-card-header--purple">
<span class="cp-card-icon">✎</span>
<span class="cp-card-title">Name</span>
</div>
<div class="cp-card-body">
<div class="cheat-form-container">
<form id="cheat-nameForm" class="cp-form cp-name-form">
<div class="cp-form-copy">Update first and last name values instantly.</div>
<div class="cp-form-grid cp-name-grid">
<div class="cheat-input-group cp-name-field">
<label for="cheat-firstName" class="cheat-input-label">First Name</label>
<input type="text" id="cheat-firstName" class="cheat-input" placeholder="First name" required>
<label for="cheat-firstName" class="cheat-label-name">First Name</label>
</div>
<div class="cheat-input-group cp-name-field">
<label for="cheat-secondName" class="cheat-input-label">Last Name</label>
<input type="text" id="cheat-secondName" class="cheat-input" placeholder="Last name" required>
<label for="cheat-secondName" class="cheat-label-name">Second Name</label>
</div>
</div>
<div class="cp-action-btn cp-action-btn--primary"><div class="btn"><<button "Apply">><<include "Change_Name_Cheats">><</button>></div></div>
</form>
</div>
</div>
</div>
<<done>>
<<include "UpdateNameField_Cheats">>
<</done>>
<</nobr>><<nobr>>
<<run document.getElementById("cheat-firstName").value = $cheatsChar.info.firstName>>
<<run document.getElementById("cheat-secondName").value = $cheatsChar.info.secondName>>
<</nobr>><<nobr>>
<<run $cheatsChar.info.firstName = document.getElementById("cheat-firstName").value>>
<<run $cheatsChar.info.secondName = document.getElementById("cheat-secondName").value>>
<<if $cheatsChar.info.isPlayer == true>>
<<run DisplayText("player-name", $cheatsChar.info.firstName + " " + $cheatsChar.info.secondName)>>
<</if>>
<</nobr>><<nobr>>
<div class="cp-card">
<div class="cp-card-header cp-card-header--purple">
<span class="cp-card-icon">👤</span>
<span class="cp-card-title">Face</span>
</div>
<div class="cp-card-body">
<div class="surgery-container cp-face-control">
<div class="surgery-item"><div class="btn cp-compact-btn cp-compact-btn--face"><<button "<<<">><<set $imgNumIncrease = false>><<replace "#surgery-icon">><<include "ChangeValue_Face_Cheats">><</replace>><</button>></div></div>
<div class="surgery-item cp-face-preview" id="surgery-icon"><img class="cp-face-image" @src="_characterIcon" alt="Avatar"></div>
<div class="surgery-item"><div class="btn cp-compact-btn cp-compact-btn--face"><<button ">>>">><<set $imgNumIncrease = true>><<replace "#surgery-icon">><<include "ChangeValue_Face_Cheats">><</replace>><</button>></div></div>
</div>
<div class="surgery-item cp-face-select" id="select-new-charface"><div class="btn"><<button "Select">><<include "Select_Face_Cheats">><</button>></div></div>
</div>
</div>
<<done>>
<<include "Update_Select_Button_Face_Cheats">>
<</done>>
<</nobr>><<nobr>>
<<set _characterIcon = "Media\\Characters\\" + $cheatsChar.info.skin + "\\Face\\" + $characterFaceType.value + "\\" + Math.trunc($cheatsChar.body.face.value) + ".jpeg">>
<</nobr>><<nobr>>
<<if $imgNumIncrease == true>>
<<if $characterFaceType.value == $characterFaceType.max>>
<<set $characterFaceType.value = $characterFaceType.min>>
<<else>>
<<set $characterFaceType.increase(1)>>
<</if>>
<<else>>
<<if $characterFaceType.value == $characterFaceType.min>>
<<set $characterFaceType.value = $characterFaceType.max>>
<<else>>
<<set $characterFaceType.decrease(1)>>
<</if>>
<</if>>
<<include "Update_Image_Cheats">>
<<include "Update_Select_Button_Face_Cheats">>
<</nobr>><<nobr>>
<<run _characterIcon = "Media\\Characters\\" + $cheatsChar.info.skin + "\\Face\\" + $characterFaceType.value + "\\" + Math.trunc($cheatsChar.body.face.value) + ".jpeg">>
<img class="cp-face-image" @src="_characterIcon" alt="Avatar">
<</nobr>><<nobr>>
<<if $characterFaceType.value != $cheatsChar.body.faceType.value>>
<<replace "#select-new-charface">><div class="btn"><<button "Select">><<include "Assign_Face_Cheats">><</button>></div><</replace>>
<<else>>
<<replace "#select-new-charface">><div class="btn non-interacting"><<button "Select">><</button>></div><</replace>>
<</if>>
<</nobr>><<nobr>>
<<set $cheatsChar.body.faceType.value = $characterFaceType.value>>
<<include "Select_Face_Cheats">>
<</nobr>><<nobr>>
<<include "Face_Variables_Assign_Cheats">>
<<replace "#surgery-icon">><<include "Update_Image_Cheats">><</replace>>
<<include "Update_Image_Cheats">>
<<include "Update_Select_Button_Face_Cheats">>
<<if $cheatsChar.info.isPlayer == true>>
<<run document.getElementById("player-icon").src = _characterIcon>>
<</if>>
<</nobr>><<nobr>>
<div class="cp-card">
<div class="cp-card-header cp-card-header--purple">
<span class="cp-card-icon">🏋</span>
<span class="cp-card-title">Body</span>
</div>
<div class="cp-card-body">
<div class="stat-card-stat-visual cp-stat-card">
<div class="stat-title-stat-visual">Femininity</div>
<div class="surgery-container cp-stat-control">
<div class="surgery-item" id="surgery-femininity-decrease-btn"></div>
<div class="stat-visual-stat-visual cp-stat-value-pill" id="surgery-femininity-value_txt"></div>
<div class="surgery-item" id="surgery-femininity-increase-btn"></div>
</div>
</div>
<div class="stat-card-stat-visual cp-stat-card">
<div class="stat-title-stat-visual">Breast</div>
<div class="surgery-container cp-stat-control">
<div class="surgery-item" id="surgery-breast-decrease-btn"></div>
<div class="stat-visual-stat-visual cp-stat-value-pill" id="surgery-breast-value_txt"></div>
<div class="surgery-item" id="surgery-breast-increase-btn"></div>
</div>
</div>
<div class="stat-card-stat-visual cp-stat-card">
<div class="stat-title-stat-visual">Butt</div>
<div class="surgery-container cp-stat-control">
<div class="surgery-item" id="surgery-butt-decrease-btn"></div>
<div class="stat-visual-stat-visual cp-stat-value-pill" id="surgery-butt-value_txt"></div>
<div class="surgery-item" id="surgery-butt-increase-btn"></div>
</div>
</div>
</div>
</div>
<<done>>
<<include "Update_Buttons_Body_Cheats">>
<<include "Update_Body_Value_Cheats">>
<</done>>
<</nobr>><<nobr>>
<<set _characterFemininity = $cheatsChar.body.face>>
<<set _characterBreastSize = $cheatsChar.body.breastSize>>
<<set _characterButtSize = $cheatsChar.body.buttSize>>
<</nobr>><<nobr>>
<<replace "#surgery-femininity-value_txt">><<print Math.trunc(_characterFemininity.value)>>/_characterFemininity.max<</replace>>
<<replace "#surgery-breast-value_txt">><<print Math.trunc(_characterBreastSize.value)>>/_characterBreastSize.max<</replace>>
<<replace "#surgery-butt-value_txt">><<print Math.trunc(_characterButtSize.value)>>/_characterButtSize.max<</replace>>
<</nobr>><<nobr>>
/* Femininity */
<<if Math.trunc(_characterFemininity.value) != _characterFemininity.max>>
<<replace "#surgery-femininity-increase-btn">><div class="btn"><<button " >>> ">><<include "IncreaseFemininity_Cheats">><</button>></div><</replace>>
<<else>>
<<replace "#surgery-femininity-increase-btn">><div class="btn non-interacting"><<button " >>> ">><</button>></div><</replace>>
<</if>>
<<if Math.trunc(_characterFemininity.value) != _characterFemininity.min>>
<<replace "#surgery-femininity-decrease-btn">><div class="btn"><<button " <<< ">><<include "DecreaseFemininity_Cheats">><</button>></div><</replace>>
<<else>>
<<replace "#surgery-femininity-decrease-btn">><div class="btn non-interacting"><<button " <<< ">><</button>></div><</replace>>
<</if>>
/* ------------------------ */
/* Breast */
<<if Math.trunc(_characterBreastSize.value) != _characterBreastSize.max>>
<<replace "#surgery-breast-increase-btn">><div class="btn"><<button " >>> ">><<include "IncreaseBreast_Cheats">><</button>></div><</replace>>
<<else>>
<<replace "#surgery-breast-increase-btn">><div class="btn non-interacting"><<button " >>> ">><</button>></div><</replace>>
<</if>>
<<if Math.trunc(_characterBreastSize.value) != _characterBreastSize.min>>
<<replace "#surgery-breast-decrease-btn">><div class="btn"><<button " <<< ">><<include "DecreaseBreast_Cheats">><</button>></div><</replace>>
<<else>>
<<replace "#surgery-breast-decrease-btn">><div class="btn non-interacting"><<button " <<< ">><</button>></div><</replace>>
<</if>>
/* ------------------------ */
/* Butt */
<<if Math.trunc(_characterButtSize.value) != _characterButtSize.max>>
<<replace "#surgery-butt-increase-btn">><div class="btn"><<button " >>> ">><<include "IncreaseButt_Cheats">><</button>></div><</replace>>
<<else>>
<<replace "#surgery-butt-increase-btn">><div class="btn non-interacting"><<button " >>> ">><</button>></div><</replace>>
<</if>>
<<if Math.trunc(_characterButtSize.value) != _characterButtSize.min>>
<<replace "#surgery-butt-decrease-btn">><div class="btn"><<button " <<< ">><<include "DecreaseButt_Cheats">><</button>></div><</replace>>
<<else>>
<<replace "#surgery-butt-decrease-btn">><div class="btn non-interacting"><<button " <<< ">><</button>></div><</replace>>
<</if>>
/* ------------------------ */
<</nobr>><<nobr>>
<<run $cheatsChar.body.face.increase(1)>>
<<include "Default_Body_Checks_Cheats">>
<</nobr>><<nobr>>
<<run $cheatsChar.body.face.decrease(1)>>
<<include "Default_Body_Checks_Cheats">>
<</nobr>><<nobr>>
<<run $cheatsChar.body.breastSize.increase(1)>>
<<include "Default_Body_Checks_Cheats">>
<</nobr>><<nobr>>
<<run $cheatsChar.body.breastSize.decrease(1)>>
<<include "Default_Body_Checks_Cheats">>
<</nobr>><<nobr>>
<<run $cheatsChar.body.buttSize.increase(1)>>
<<include "Default_Body_Checks_Cheats">>
<</nobr>><<nobr>>
<<run $cheatsChar.body.buttSize.decrease(1)>>
<<include "Default_Body_Checks_Cheats">>
<</nobr>><<nobr>>
<<include "Update_Buttons_Body_Cheats">>
<<include "Update_Body_Value_Cheats">>
<<include "Face_Variables_Assign_Cheats">>
<<replace "#surgery-icon">><<include "Update_Image_Cheats">><</replace>>
<</nobr>><<nobr>>
<div class="cp-card">
<div class="cp-card-header cp-card-header--purple">
<span class="cp-card-icon">⚧</span>
<span class="cp-card-title">Genitals</span>
</div>
<div class="cp-card-body">
<div class="cp-genitals-row">
<div class="surgery-item"><div class="btn" id="surgery-vagina-btn"></div></div>
<div class="surgery-item"><div class="btn" id="surgery-penis-btn"></div></div>
</div>
</div>
</div>
<<done>>
<<include "Update_Buttons_Genitals_Cheats">>
<</done>>
<</nobr>><<nobr>>
<<set _characterGenitals = $cheatsChar.genitalia()>>
<</nobr>><<nobr>>
<<if _characterGenitals != "Vagina">>
<<replace "#surgery-vagina-btn">><div class="btn"><<button "Vagina">><<include "SetVagina_Cheats">><</button>></div><</replace>>
<<else>>
<<replace "#surgery-vagina-btn">><div class="btn non-interacting"><<button "Vagina">><</button>></div><</replace>>
<</if>>
<<if _characterGenitals != "Penis">>
<<replace "#surgery-penis-btn">><div class="btn"><<button "Penis">><<include "SetPenis_Cheats">><</button>></div><</replace>>
<<else>>
<<replace "#surgery-penis-btn">><div class="btn non-interacting"><<button "Penis">><</button>></div><</replace>>
<</if>>
<</nobr>><<nobr>>
<<run $cheatsChar.body.penisSize.value = 8>>
<<run $cheatsChar.body.vaginaSize.value = 0>>
<<include "Genitals_Variables_Assign">>
<<include "Update_Buttons_Genitals_Cheats">>
<<include "Face_Variables_Assign_Cheats">>
<<replace "#surgery-icon">><<include "Update_Image_Cheats">><</replace>>
<<include "Update_Second_Stats_Cheats">>
<<include "Update_Buttons_Second_Stats_Cheats">>
<</nobr>><<nobr>>
<<run $cheatsChar.body.penisSize.value = 0>>
<<run $cheatsChar.body.vaginaSize.value = 1>>
<<include "Genitals_Variables_Assign">>
<<include "Update_Buttons_Genitals_Cheats">>
<<include "Face_Variables_Assign_Cheats">>
<<replace "#surgery-icon">><<include "Update_Image_Cheats">><</replace>>
<<include "Update_Second_Stats_Cheats">>
<<include "Update_Buttons_Second_Stats_Cheats">>
<</nobr>><<nobr>>
<div class="cp-card">
<div class="cp-card-header cp-card-header--purple">
<span class="cp-card-icon">🎨</span>
<span class="cp-card-title">Skin Tone</span>
</div>
<div class="cp-card-body">
<div class="cp-skin-tone-row">
<div class="surgery-item"><div class="btn" id="white-btn"></div></div>
<div class="surgery-item"><div class="btn" id="black-btn"></div></div>
<div class="surgery-item"><div class="btn" id="asian-btn"></div></div>
</div>
</div>
</div>
<<done>>
<<include "Update_Buttons_Skin_Cheats">>
<</done>>
<</nobr>><<nobr>>
<<if $cheatsChar.info.skin != "White">>
<<replace "#white-btn">><div class="btn"><<button "White">><<run $cheatsChar.info.skin = "White">><<include "Skin_Update_Cheats">><</button>></div><</replace>>
<<else>>
<<replace "#white-btn">><div class="btn non-interacting"><<button "White">><</button>></div><</replace>>
<</if>>
<<if $cheatsChar.info.skin != "Black">>
<<replace "#black-btn">><div class="btn"><<button "Black">><<run $cheatsChar.info.skin = "Black">><<include "Skin_Update_Cheats">><</button>></div><</replace>>
<<else>>
<<replace "#black-btn">><div class="btn non-interacting"><<button "Black">><</button>></div><</replace>>
<</if>>
<<if $cheatsChar.info.skin != "Asian">>
<<replace "#asian-btn">><div class="btn"><<button "Asian">><<run $cheatsChar.info.skin = "Asian">><<include "Skin_Update_Cheats">><</button>></div><</replace>>
<<else>>
<<replace "#asian-btn">><div class="btn non-interacting"><<button "Asian">><</button>></div><</replace>>
<</if>>
<</nobr>><<nobr>>
<<include "Face_Variables_Assign_Cheats">>
<<replace "#surgery-icon">><<include "Update_Image_Cheats">><</replace>>
<<include "Update_Buttons_Skin_Cheats">>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<div class="cp-card">
<div class="cp-card-header cp-card-header--red">
<span class="cp-card-icon">⚔</span>
<span class="cp-card-title">Battle Mode</span>
</div>
<div class="cp-card-body">
<div class="surgery-item"><div class="btn" id="battle-standard-btn"><<button "Standard">><<set $gameSettings.battleMode="Standard">><<include "Display_Battle_Modes_Cheats_UpdateButtons">><</button>></div></div>
<div class="padding-top"><div class="surgery-item"><div class="btn" id="battle-sex-battle-btn"><<button "Sex Battle">><<set $gameSettings.battleMode="SexBattle">><<include "Display_Battle_Modes_Cheats_UpdateButtons">><</button>></div></div></div>
<div class="padding-top"><div class="surgery-item"><div class="btn" id="battle-no-sex-btn"><<button "No Sex Battle">><<set $gameSettings.battleMode="NoSexBattle">><<include "Display_Battle_Modes_Cheats_UpdateButtons">><</button>></div></div></div>
</div>
</div>
<<include "Display_Battle_Modes_Cheats_UpdateButtons">>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if $gameSettings.battleMode == undefined>>
<<set $gameSettings.battleMode = "Standard">>
<</if>>
<<done>>
<<removeclass "#battle-standard-btn" "non-interacting">>
<<removeclass "#battle-sex-battle-btn" "non-interacting">>
<<removeclass "#battle-no-sex-btn" "non-interacting">>
<<if $gameSettings.battleMode == "Standard">>
<<addclass "#battle-standard-btn" "non-interacting">>
<<elseif $gameSettings.battleMode == "SexBattle">>
<<addclass "#battle-sex-battle-btn" "non-interacting">>
<<elseif $gameSettings.battleMode == "NoSexBattle">>
<<addclass "#battle-no-sex-btn" "non-interacting">>
<</if>>
<</done>>
<</nobr>><<nobr>>
<div class="cp-card">
<div class="cp-card-header cp-card-header--pink">
<span class="cp-card-icon">🏙</span>
<span class="cp-card-title">Brothel</span>
</div>
<<if $playerBrothel>>
<div class="cp-card-body">
/* Brothel Level */
<div class="cheat-section-row">
<span class="cheat-section-row-label">Level: <span class="cheat-section-row-value--gold"><<print $playerBrothel.level>></span>/26</span>
<div class="cheat-section-row-buttons">
<div class="btn btn--small"><<button "+1">>
<<if $playerBrothel.level < 26>>
<<set $playerBrothel.level += 1>>
<</if>>
<<goto "Cheats">>
<</button>></div>
<div class="btn btn--small"><<button "+5">>
<<set $playerBrothel.level = Math.min(26, $playerBrothel.level + 5)>>
<<goto "Cheats">>
<</button>></div>
<div class="btn btn--small"><<button "MAX">>
<<set $playerBrothel.level = 26>>
<<goto "Cheats">>
<</button>></div>
</div>
</div>
/* Skill Points */
<div class="cheat-section-row">
<span class="cheat-section-row-label">Skill Points: <span class="cheat-section-row-value--gold"><<print $playerBrothel.skillPoints>></span></span>
<div class="cheat-section-row-buttons">
<div class="btn btn--small"><<button "+1">>
<<set $playerBrothel.skillPoints += 1>>
<<goto "Cheats">>
<</button>></div>
<div class="btn btn--small"><<button "+5">>
<<set $playerBrothel.skillPoints += 5>>
<<goto "Cheats">>
<</button>></div>
<div class="btn btn--small"><<button "+10">>
<<set $playerBrothel.skillPoints += 10>>
<<goto "Cheats">>
<</button>></div>
</div>
</div>
/* Reputation */
<div class="cheat-section-row">
<span class="cheat-section-row-label">Reputation: <span class="cheat-section-row-value--green"><<print $playerBrothel.reputation>></span>/<<print $playerBrothel.maxReputation>></span>
<div class="cheat-section-row-buttons">
<div class="btn btn--small"><<button "+50">>
<<set $playerBrothel.reputation += 50>>
<<goto "Cheats">>
<</button>></div>
<div class="btn btn--small"><<button "MAX">>
<<set $playerBrothel.reputation = $playerBrothel.maxReputation>>
<<goto "Cheats">>
<</button>></div>
</div>
</div>
/* Rooms */
<div class="cheat-section-row">
<span class="cheat-section-row-label">Rooms: <span class="cheat-section-row-value--blue"><<print $playerBrothel.rooms>></span>/<<print $playerBrothel.maxRooms>></span>
<div class="cheat-section-row-buttons">
<div class="btn btn--small"><<button "+1">>
<<if $playerBrothel.rooms < $playerBrothel.maxRooms>>
<<set $playerBrothel.rooms += 1>>
<</if>>
<<goto "Cheats">>
<</button>></div>
<div class="btn btn--small"><<button "MAX">>
<<set $playerBrothel.rooms = $playerBrothel.maxRooms>>
<<goto "Cheats">>
<</button>></div>
</div>
</div>
/* Client Rooms */
<div class="cheat-section-row">
<span class="cheat-section-row-label">Client Rooms: <span class="cheat-section-row-value--orange"><<print $playerBrothel.clientRooms>></span>/10</span>
<div class="cheat-section-row-buttons">
<div class="btn btn--small"><<button "+1">>
<<if $playerBrothel.clientRooms < 10>>
<<set $playerBrothel.clientRooms += 1>>
<</if>>
<<goto "Cheats">>
<</button>></div>
<div class="btn btn--small"><<button "MAX">>
<<set $playerBrothel.clientRooms = 10>>
<<goto "Cheats">>
<</button>></div>
</div>
</div>
/* Dungeon Cells */
<div class="cheat-section-row">
<span class="cheat-section-row-label">Dungeon Cells: <span class="cheat-section-row-value--purple"><<print $playerBrothel.dungeonCells || 1>></span>/5</span>
<div class="cheat-section-row-buttons">
<div class="btn btn--small"><<button "+1">>
<<if ($playerBrothel.dungeonCells || 1) < 5>>
<<set $playerBrothel.dungeonCells = ($playerBrothel.dungeonCells || 1) + 1>>
<</if>>
<<goto "Cheats">>
<</button>></div>
<div class="btn btn--small"><<button "MAX">>
<<set $playerBrothel.dungeonCells = 5>>
<<goto "Cheats">>
<</button>></div>
</div>
</div>
/* Uncollected Earnings */
<div class="cheat-section-row">
<span class="cheat-section-row-label">Uncollected: <span class="cheat-section-row-value--green">$<<print $playerBrothel.uncollectedEarnings || 0>>/20000</span></span>
<div class="cheat-section-row-buttons">
<div class="btn btn--small"><<button "+$500">>
<<set $playerBrothel.uncollectedEarnings = Math.min(($playerBrothel.uncollectedEarnings || 0) + 500, 20000)>>
<<goto "Cheats">>
<</button>></div>
<div class="btn btn--small"><<button "+$5000">>
<<set $playerBrothel.uncollectedEarnings = Math.min(($playerBrothel.uncollectedEarnings || 0) + 5000, 20000)>>
<<goto "Cheats">>
<</button>></div>
<div class="btn btn--small"><<button "Max">>
<<set $playerBrothel.uncollectedEarnings = 20000>>
<<goto "Cheats">>
<</button>></div>
</div>
</div>
/* Unlock All Upgrades */
<div class="cheat-section-row cheat-section-row--accent-pink">
<span class="cheat-section-row-value--pink">Upgrades</span>
<div class="cheat-section-row-buttons">
<div class="btn btn--small"><<button "Unlock All">>
<<set $playerBrothel.upgrades.advertising = true>>
<<set $playerBrothel.upgrades.security = true>>
<<set $playerBrothel.upgrades.bar = true>>
<<set $playerBrothel.upgrades.vipZone = true>>
<<set $playerBrothel.upgrades.lighting = true>>
<<set $playerBrothel.upgrades.furniture = true>>
<<set $playerBrothel.upgrades.trainingRoom = true>>
<<set $playerBrothel.upgrades.dungeon = true>>
<<set $playerBrothel.upgrades.spa = true>>
<<set $playerBrothel.upgrades.medical = true>>
<<set $playerBrothel.upgrades.relaxation = true>>
<<set $playerBrothel.upgrades.masterRoom = true>>
<<goto "Cheats">>
<</button>></div>
</div>
</div>
/* Unlock All Perks */
<div class="cheat-section-row cheat-section-row--accent-gold">
<span class="cheat-section-row-value--gold">Perks</span>
<div class="cheat-section-row-buttons">
<div class="btn btn--small"><<button "Unlock All">>
<<set $playerBrothel.perks.seeStats = true>>
<<set $playerBrothel.perks.profitBonus = 5>>
<<set $playerBrothel.perks.energySaving = 5>>
<<set $playerBrothel.perks.securityDiscount = true>>
<<set $playerBrothel.perks.feminizationAttempts = true>>
<<set $playerBrothel.perks.haggle = true>>
<<set $playerBrothel.perks.biweeklyPay = true>>
<<set $playerBrothel.perks.playerProfitBonus = 5>>
<<set $playerBrothel.perks.relaxationSpeed = 5>>
<<set $playerBrothel.perks.surgeryDiscount = true>>
<<goto "Cheats">>
<</button>></div>
<div class="btn btn--small"><<button "Reset">>
<<set $playerBrothel.perks.seeStats = false>>
<<set $playerBrothel.perks.profitBonus = 0>>
<<set $playerBrothel.perks.energySaving = 0>>
<<set $playerBrothel.perks.securityDiscount = false>>
<<set $playerBrothel.perks.feminizationAttempts = false>>
<<set $playerBrothel.perks.haggle = false>>
<<set $playerBrothel.perks.biweeklyPay = false>>
<<set $playerBrothel.perks.playerProfitBonus = 0>>
<<set $playerBrothel.perks.relaxationSpeed = 0>>
<<set $playerBrothel.perks.surgeryDiscount = false>>
<<goto "Cheats">>
<</button>></div>
</div>
</div>
</div>
<<else>>
<div class="cp-card-body cheat-section-empty">
<p>Brothel not initialized.</p>
<p class="cheat-section-empty-hint">Visit the brothel first to initialize it.</p>
</div>
<</if>>
</div>
<</nobr>><<nobr>>
<div class="cp-card">
<div class="cp-card-header cp-card-header--pink">
<span class="cp-card-icon">🔒</span>
<span class="cp-card-title">Chastity Cage</span>
</div>
<div class="cp-card-body">
<div class="surgery-item"><div class="btn" id="chastity-lock-btn"><<button "Lock">><<set $playerlock = true>><<include "Display_ChastityCage_Cheats_UpdateButtons">><</button>></div></div>
<div class="padding-top"><div class="surgery-item"><div class="btn" id="chastity-unlock-btn"><<button "Unlock">><<set $playerlock = false>><<include "Display_ChastityCage_Cheats_UpdateButtons">><</button>></div></div></div>
</div>
</div>
<<include "Display_ChastityCage_Cheats_UpdateButtons">>
<</nobr>><<nobr>>
<<done>>
<<removeclass "#chastity-lock-btn" "non-interacting">>
<<removeclass "#chastity-unlock-btn" "non-interacting">>
<<if $playerlock == true>>
<<addclass "#chastity-lock-btn" "non-interacting">>
<<else>>
<<addclass "#chastity-unlock-btn" "non-interacting">>
<</if>>
<</done>>
<</nobr>><<nobr>>
<div class="cp-card">
<div class="cp-card-header cp-card-header--blue">
<span class="cp-card-icon">📅</span>
<span class="cp-card-title">Events</span>
</div>
<div class="cp-card-body">
<div class="cp-action-btn"><div class="btn"><<button "Clear Daily Events">><<run $cheatsChar.dailyEvents.clearAllEvents()>><</button>></div></div>
</div>
</div>
<</nobr>><<nobr>>
<div class="cp-card">
<div class="cp-card-header cp-card-header--gold">
<span class="cp-card-icon">🎒</span>
<span class="cp-card-title">Items</span>
</div>
<div class="cp-card-body">
<div class="cp-action-btn cp-action-btn--primary"><div class="btn"><<button "Get All Items">><<run $cheatsChar.getAllItems()>><</button>></div></div>
<div class="cheat-section-row cheat-section-row--offset">
<span class="cheat-section-row-label">Lockpicks</span>
<div class="cheat-section-row-buttons">
<div class="btn btn--small"><<button "+1">><<run $cheatsChar.inventory.addItemByName("lockpick", 1)>><</button>></div>
<div class="btn btn--small"><<button "+5">><<run $cheatsChar.inventory.addItemByName("lockpick", 5)>><</button>></div>
<div class="btn btn--small"><<button "+10">><<run $cheatsChar.inventory.addItemByName("lockpick", 10)>><</button>></div>
</div>
</div>
</div>
</div>
<</nobr>><<nobr>>
<div class="cp-card" data-cheat-search="cruise ship voyage sirena capsule gacha rps tables chips debt loan house corruption victory tokens skills cage chastity disguise rigged rounds materials crafting workbench daily limits wheel mingle rest cards hand tally curfew dump discard">
<div class="cp-card-header cp-card-header--blue">
<span class="cp-card-icon">🚢</span>
<span class="cp-card-title">Cruise / Ship</span>
</div>
<div class="cp-card-body">
<<if $ship and $ship.onBoard>>
<div class="stat-card-stat-visual cp-stat-card">
<div class="stat-title-stat-visual">House debt (loan to settle)</div>
<div class="surgery-container cp-stat-control">
<div class="cp-stat-actions cp-stat-actions--decrease">
<div class="surgery-item"><div class="btn cp-compact-btn"><<button "-500">><<set $ship.loan = Math.max(0, ($ship.loan || 0) - 500)>><<include "Update_Cruise_Cheats">><</button>></div></div>
<div class="surgery-item"><div class="btn cp-compact-btn"><<button "Clear">><<set $ship.loan = 0>><<include "Update_Cruise_Cheats">><</button>></div></div>
</div>
<div class="stat-visual-stat-visual cp-stat-value-pill" id="cruise-loan-txt"></div>
<div class="cp-stat-actions cp-stat-actions--increase">
<div class="surgery-item"><div class="btn cp-compact-btn"><<button "+500">><<set $ship.loan = ($ship.loan || 0) + 500>><<include "Update_Cruise_Cheats">><</button>></div></div>
</div>
</div>
</div>
<div class="stat-card-stat-visual cp-stat-card">
<div class="stat-title-stat-visual">Cruise corruption</div>
<div class="surgery-container cp-stat-control">
<div class="cp-stat-actions cp-stat-actions--decrease">
<div class="surgery-item"><div class="btn cp-compact-btn"><<button "-1">><<set $ship.corr = Math.max(0, ($ship.corr || 0) - 1)>><<include "Update_Cruise_Cheats">><</button>></div></div>
</div>
<div class="stat-visual-stat-visual cp-stat-value-pill" id="cruise-corr-txt"></div>
<div class="cp-stat-actions cp-stat-actions--increase">
<div class="surgery-item"><div class="btn cp-compact-btn"><<button "+1">><<set $ship.corr = Math.min(6, ($ship.corr || 0) + 1)>><<include "Update_Cruise_Cheats">><</button>></div></div>
</div>
</div>
</div>
<div class="stat-card-stat-visual cp-stat-card">
<div class="stat-title-stat-visual">Victory tokens (5 = 1 skill level)</div>
<div class="surgery-container cp-stat-control">
<div class="stat-visual-stat-visual cp-stat-value-pill" id="cruise-tokens-txt"></div>
<div class="cp-stat-actions cp-stat-actions--increase">
<div class="surgery-item"><div class="btn cp-compact-btn"><<button "+5">><<if $cruiseSkills>><<set $cruiseSkills.tokens = ($cruiseSkills.tokens || 0) + 5>><</if>><<include "Update_Cruise_Cheats">><</button>></div></div>
<div class="surgery-item"><div class="btn cp-compact-btn"><<button "+25">><<if $cruiseSkills>><<set $cruiseSkills.tokens = ($cruiseSkills.tokens || 0) + 25>><</if>><<include "Update_Cruise_Cheats">><</button>></div></div>
</div>
</div>
</div>
<div class="stat-card-stat-visual cp-stat-card">
<div class="stat-title-stat-visual">Rigged RPS rounds (auto-win)</div>
<div class="surgery-container cp-stat-control">
<div class="stat-visual-stat-visual cp-stat-value-pill" id="cruise-rigged-txt"></div>
<div class="cp-stat-actions cp-stat-actions--increase">
<div class="surgery-item"><div class="btn cp-compact-btn"><<button "+1">><<set $ship.riggedRounds = ($ship.riggedRounds || 0) + 1>><<include "Update_Cruise_Cheats">><</button>></div></div>
<div class="surgery-item"><div class="btn cp-compact-btn"><<button "+3">><<set $ship.riggedRounds = ($ship.riggedRounds || 0) + 3>><<include "Update_Cruise_Cheats">><</button>></div></div>
</div>
</div>
</div>
<div class="stat-card-stat-visual cp-stat-card">
<div class="stat-title-stat-visual">Cards in hand (unplayed = tally penalty at 22:00)</div>
<div class="surgery-container cp-stat-control">
<div class="cp-stat-actions cp-stat-actions--decrease">
/* A live RPS session keeps its own copy of the hand and writes it
back on leave/fold - zero that too or the dump gets undone. */
<div class="surgery-item"><div class="btn cp-compact-btn"><<button "Dump all">><<set $cruisePlayerHand = { Rock: 0, Scissors: 0, Paper: 0 }>><<if $rps and $rps.playerHand>><<set $rps.playerHand = { Rock: 0, Scissors: 0, Paper: 0 }>><</if>><<include "Update_Cruise_Cheats">><</button>></div></div>
</div>
<div class="stat-visual-stat-visual cp-stat-value-pill" id="cruise-hand-txt"></div>
</div>
</div>
<div class="stat-card-stat-visual cp-stat-card">
<div class="stat-title-stat-visual">Tally immunity (every night, hand ignored)</div>
<div class="surgery-container cp-stat-control">
<div class="stat-visual-stat-visual cp-stat-value-pill" id="cruise-tallyimmune-txt"></div>
<div class="cp-stat-actions cp-stat-actions--increase">
<div class="surgery-item"><div class="btn cp-compact-btn"><<button "Toggle">><<set $ship.tallyExempt = not $ship.tallyExempt>><<include "Update_Cruise_Cheats">><</button>></div></div>
</div>
</div>
</div>
<div class="stat-card-stat-visual cp-stat-card">
<div class="stat-title-stat-visual">Chastity cage (voyage)</div>
<div class="surgery-container cp-stat-control">
<div class="stat-visual-stat-visual cp-stat-value-pill" id="cruise-cage-txt"></div>
<div class="cp-stat-actions cp-stat-actions--increase">
<div class="surgery-item"><div class="btn cp-compact-btn"><<button "Toggle">><<set $ship.caged = not $ship.caged>><<include "Update_Cruise_Cheats">><</button>></div></div>
</div>
</div>
</div>
<div class="stat-card-stat-visual cp-stat-card">
<div class="stat-title-stat-visual">Crew disguise</div>
<div class="surgery-container cp-stat-control">
<div class="stat-visual-stat-visual cp-stat-value-pill" id="cruise-disguise-txt"></div>
<div class="cp-stat-actions cp-stat-actions--increase">
<div class="surgery-item"><div class="btn cp-compact-btn"><<button "Toggle">><<set $ship.disguised = not $ship.disguised>><<include "Update_Cruise_Cheats">><</button>></div></div>
</div>
</div>
</div>
<div class="cp-action-btn"><div class="btn cp-compact-btn"><<button "Max cruise skills (10)">><<if $cruiseSkills>><<set $cruiseSkills.stealth = 10>><<set $cruiseSkills.persuasion = 10>><<set $cruiseSkills.trade = 10>><<set $cruiseSkills.crafting = 10>><<set $cruiseSkills.lockpick = 10>><<set $cruiseSkills.endurance = 10>><</if>><<include "Update_Cruise_Cheats">><</button>></div></div>
<div class="cp-action-btn"><div class="btn cp-compact-btn"><<button "Fill crafting materials (+3 each)">><<if $cruiseInventory>><<for _m range ["wire", "cloth", "grease", "herbs", "spare_chip", "blank_key"]>><<set $cruiseInventory[_m] = ($cruiseInventory[_m] || 0) + 3>><</for>><</if>><<include "Update_Cruise_Cheats">><</button>></div></div>
<div class="cp-action-btn"><div class="btn cp-compact-btn"><<button "Reset daily limits">><<set $ship.wheelSpun = false>><<set $ship.mingleDone = false>><<set $ship.restedDone = false>><<set $ship.barTakeDone = false>><<set $ship.galleyTakeDone = false>><<set $ship.gloryDone = false>><<set $ship.searchDone = false>><<set $ship.allInDone = false>><<set $ship.labyrinthDone = false>><<set $ship.eventPicked = false>><<set $ship.travelFired = 0>><<include "Update_Cruise_Cheats">><</button>></div></div>
<div class="stat-title-stat-visual" style="opacity:0.7; font-size:0.82em; line-height:1.35; margin-top:6px;">Cruise-only state for the «Sirena» voyage, separate from city money, items and stats. Materials fill the workbench kit; tokens buy skills (5 each); "Dump all" empties your card hand (a fresh hand is dealt every morning - dump again or use immunity); "Tally immunity" makes every night's ten o'clock tally skip the player entirely; reset clears the wheel / mingle / rest / bottle / galley / gloryhole / search / all-in / maze / event / corridor-incident day-locks.</div>
<<else>>
<div class="stat-title-stat-visual" style="opacity:0.7; line-height:1.4;">Not aboard. Board the «Sirena» from the pier first - these drive live voyage state, so they only apply during a cruise.</div>
<</if>>
</div>
</div>
<<done>>
<<include "Update_Cruise_Cheats">>
<</done>>
<</nobr>><<nobr>>
<<if $ship and $ship.onBoard>>
<<replace "#cruise-loan-txt">><<print ($ship.loan || 0)>><</replace>>
<<replace "#cruise-corr-txt">><<print ($ship.corr || 0)>>/6<</replace>>
<<replace "#cruise-tokens-txt">><<print ($cruiseSkills ? ($cruiseSkills.tokens || 0) : 0)>><</replace>>
<<replace "#cruise-rigged-txt">><<print ($ship.riggedRounds || 0)>><</replace>>
<<replace "#cruise-hand-txt">><<print ($cruisePlayerHand ? ($cruisePlayerHand.Rock || 0) + "R / " + ($cruisePlayerHand.Scissors || 0) + "S / " + ($cruisePlayerHand.Paper || 0) + "P" : "-")>><</replace>>
<<replace "#cruise-tallyimmune-txt">><<print ($ship.tallyExempt ? "On" : "Off")>><</replace>>
<<replace "#cruise-cage-txt">><<print ($ship.caged ? "On" : "Off")>><</replace>>
<<replace "#cruise-disguise-txt">><<print ($ship.disguised ? "On" : "Off")>><</replace>>
<</if>>
<</nobr>><<nobr>>
<div class="cp-card">
<div class="cp-card-header cp-card-header--gold">
<span class="cp-card-icon">💰</span>
<span class="cp-card-title">Money</span>
</div>
<div class="cp-card-body">
<div class="cheat-form-container">
<form id="cheat-nameForm" class="cp-form">
<div class="cp-form-copy">Set an exact currency value for the selected character.</div>
<div class="cheat-input-group">
<label for="cheat-money" class="cheat-input-label">Amount</label>
<input type="number" id="cheat-money" class="cheat-input" placeholder="Amount" required>
<label for="cheat-firstName" class="cheat-label-name">Money</label>
</div>
<div class="cp-action-btn cp-action-btn--primary"><div class="btn"><<button "Apply">><<include "Change_Money_Cheats">><</button>></div></div>
</form>
</div>
</div>
</div>
<<done>>
<<include "Update_Money_Field_Cheats">>
<</done>>
<</nobr>><<nobr>>
<<run document.getElementById("cheat-money").value = $cheatsChar.money>>
<</nobr>><<nobr>>
/* The input hands back text: store a number, or every "money -= price" downstream breaks. */
<<run $cheatsChar.money = Math.round(Number(document.getElementById("cheat-money").value) || 0)>>
<<include "UpdateStatBars">>
<</nobr>><<nobr>>
<div class="cp-card">
<div class="cp-card-header cp-card-header--gold">
<span class="cp-card-icon">⭐</span>
<span class="cp-card-title">Reputation</span>
</div>
<div class="cp-card-body">
<<StatsCheatButton "Photo model" "photo-model" true>>
<<StatsCheatButton "Porn" "porn" true>>
<<StatsCheatButton "Nightclub" "nightclub" true>>
</div>
</div>
<<done>>
<<include "Update_Reputation_Value_Cheats">>
<<include "Update_Buttons_Reputation_Cheats">>
<</done>>
<</nobr>><<nobr>>
<<set _characterPhoto = $cheatsChar.info.reputation.photoModel>>
<<set _characterPorn = $cheatsChar.info.reputation.pornActer>>
<<set _characterNightclub = $cheatsChar.info.reputation.nightclub>>
<</nobr>><<nobr>>
<<replace "#photo-model-value_txt">><<print Math.trunc(_characterPhoto.value)>>/_characterPhoto.max<</replace>>
<<replace "#porn-value_txt">><<print Math.trunc(_characterPorn.value)>>/_characterPorn.max<</replace>>
<<replace "#nightclub-value_txt">><<print Math.trunc(_characterNightclub.value)>>/_characterNightclub.max<</replace>>
<</nobr>><<nobr>>
<<CheatsButtonUpdate "photo-model" _characterPhoto "UpdateReputationValues" true 1 10>>
<<CheatsButtonUpdate "porn" _characterPorn "UpdateReputationValues" true 1 10>>
<<CheatsButtonUpdate "nightclub" _characterNightclub "UpdateReputationValues" true 1 10>>
<</nobr>><<nobr>>
<<include "Update_Reputation_Value_Cheats">>
<<include "Update_Buttons_Reputation_Cheats">>
<<include "UpdateStatBars">>
<</nobr>><<nobr>>
<div class="cp-card" data-cheat-search="street gangs crews gang streets world seed status reroll night nights simulation advance dossier intel map heat police operation peace wars target crew picker">
<div class="cp-card-header cp-card-header--red">
<span class="cp-card-icon">🗡</span>
<span class="cp-card-title">Street World</span>
</div>
<div class="cp-card-body">
<<if typeof gangCheatStatus !== "function">>
<div class="stat-title-stat-visual">The street-gang bundle is not loaded.</div>
<<elseif !getGangWorld()>>
<div class="cp-gang-status">No street-gang world in this save.</div>
<div class="cp-gang-actions">
<div class="btn cp-compact-btn"><<button "Roll a street world">><<run gangCheatReroll()>><<goto "Cheats">><</button>></div>
</div>
<<else>>
<div class="cp-gang-status" id="gang-cheat-status"><<= gangCheatStatus()>></div>
<label class="cp-gang-target">
<span>Target crew (used by the career, war and crew cards)</span>
<select id="gang-cheat-target"></select>
</label>
<div class="cp-gang-msg" id="gang-cheat-msg-world"></div>
<div class="cp-gang-actions">
<div class="btn cp-compact-btn"><<button "Run 1 night">><<run gangCheatSay(gangCheatNights(1), "world")>><</button>></div>
<div class="btn cp-compact-btn"><<button "Run 7 nights">><<run gangCheatSay(gangCheatNights(7), "world")>><</button>></div>
<div class="btn cp-compact-btn"><<button "Run 30 nights">><<run gangCheatSay(gangCheatNights(30), "world")>><</button>></div>
<div class="btn cp-compact-btn"><<button "Open every dossier">><<run gangCheatSay(gangCheatRevealAll(), "world")>><</button>></div>
<div class="btn cp-compact-btn"><<button "Cool all police heat">><<run gangCheatSay(gangCheatCoolHeat(), "world")>><</button>></div>
<div class="btn cp-compact-btn"><<button "Peace across the city">><<run gangCheatSay(gangCheatCityPeace(), "world")>><</button>></div>
<div class="btn cp-compact-btn"><<button "Reroll the street world">><<run gangCheatSay(gangCheatReroll(), "world")>><</button>></div>
</div>
<div class="cp-gang-hint">Nights run ahead of the calendar: afterwards the streets wait until the calendar catches up. To move time for the whole city, use Time & Events.</div>
<<done>><<run gangCheatRefresh()>><</done>>
<</if>>
</div>
</div>
<</nobr>><<nobr>>
<<if typeof gangCheatStatus === "function" && getGangWorld()>>
<div class="cp-card" data-cheat-search="street career join crew hangaround recruit soldier made lieutenant block rank promote standing rep reputation leave walk out jobs board boss job daily limits opinion liked hated rat mark hunt loan debt coup lieutenants">
<div class="cp-card-header cp-card-header--gold">
<span class="cp-card-icon">🌟</span>
<span class="cp-card-title">Your Street Career</span>
</div>
<div class="cp-card-body">
<div class="cp-gang-msg" id="gang-cheat-msg-career"></div>
<div class="cp-gang-sub">Join the target crew as</div>
<div class="cp-gang-actions">
<div class="btn cp-compact-btn"><<button "Hangaround">><<run gangCheatSay(gangCheatJoin(0, gangCheatTarget()), "career")>><</button>></div>
<div class="btn cp-compact-btn"><<button "Recruit">><<run gangCheatSay(gangCheatJoin(1, gangCheatTarget()), "career")>><</button>></div>
<div class="btn cp-compact-btn"><<button "Soldier">><<run gangCheatSay(gangCheatJoin(2, gangCheatTarget()), "career")>><</button>></div>
<div class="btn cp-compact-btn"><<button "Made">><<run gangCheatSay(gangCheatJoin(3, gangCheatTarget()), "career")>><</button>></div>
<div class="btn cp-compact-btn"><<button "Lieutenant">><<run gangCheatSay(gangCheatJoin(4, gangCheatTarget()), "career")>><</button>></div>
</div>
<div class="cp-gang-sub">Rank and name</div>
<div class="cp-gang-actions">
<div class="btn cp-compact-btn"><<button "Promote one rank">><<run gangCheatSay(gangCheatPromote(), "career")>><</button>></div>
<div class="btn cp-compact-btn"><<button "Standing +20">><<run gangCheatSay(gangCheatStanding(20), "career")>><</button>></div>
<div class="btn cp-compact-btn"><<button "Street rep +10">><<run gangCheatSay(gangCheatRep(10), "career")>><</button>></div>
<div class="btn cp-compact-btn"><<button "Street rep max">><<run gangCheatSay(gangCheatRep(100), "career")>><</button>></div>
<div class="btn cp-compact-btn"><<button "Lieutenants back your coup">><<run gangCheatSay(gangCheatCoupReady(), "career")>><</button>></div>
<div class="btn cp-compact-btn"><<button "Walk out for free">><<run gangCheatSay(gangCheatLeave(), "career")>><</button>></div>
</div>
<div class="cp-gang-sub">Jobs</div>
<div class="cp-gang-actions">
<div class="btn cp-compact-btn"><<button "Finish all your jobs">><<run gangCheatSay(gangCheatFinishJobs(), "career")>><</button>></div>
<div class="btn cp-compact-btn"><<button "Fresh job board">><<run gangCheatSay(gangCheatNewBoard(), "career")>><</button>></div>
<div class="btn cp-compact-btn"><<button "Reset daily street limits">><<run gangCheatSay(gangCheatResetDaily(), "career")>><</button>></div>
</div>
<div class="cp-gang-sub">How the street sees you</div>
<div class="cp-gang-actions">
<div class="btn cp-compact-btn"><<button "Every crew likes you">><<run gangCheatSay(gangCheatBeloved(), "career")>><</button>></div>
<div class="btn cp-compact-btn"><<button "Every crew hates you">><<run gangCheatSay(gangCheatHated(), "career")>><</button>></div>
<div class="btn cp-compact-btn"><<button "Clean slate (rat, hunts, debts)">><<run gangCheatSay(gangCheatCleanSlate(), "career")>><</button>></div>
</div>
<div class="cp-gang-hint">Joining goes through the real initiation and promotions, so ranks come with their perks. Allies of a sisterhood get work but no rank. Finished jobs pay your cut and count toward promotion.</div>
</div>
</div>
<</if>>
<</nobr>><<nobr>>
<<if typeof gangCheatStatus === "function" && getGangWorld()>>
<div class="cp-card" data-cheat-search="own crew boss found hq treasury money rooms modules hire crew loyalty bond hurt jailed bail legend xp level stash goods block claim ultimatum siege demands king crown">
<div class="cp-card-header cp-card-header--purple">
<span class="cp-card-icon">👑</span>
<span class="cp-card-title">Your Own Crew</span>
</div>
<div class="cp-card-body">
<div class="cp-gang-msg" id="gang-cheat-msg-boss"></div>
<div class="cp-gang-actions">
<div class="btn cp-compact-btn"><<button "Found a crew now">><<run gangCheatSay(gangCheatFound(), "boss")>><</button>></div>
<div class="btn cp-compact-btn"><<button "Treasury +$5000">><<run gangCheatSay(gangCheatCrewCash(5000), "boss")>><</button>></div>
<div class="btn cp-compact-btn"><<button "Treasury +$50000">><<run gangCheatSay(gangCheatCrewCash(50000), "boss")>><</button>></div>
<div class="btn cp-compact-btn"><<button "Max HQ and rooms">><<run gangCheatSay(gangCheatMaxHq(), "boss")>><</button>></div>
<div class="btn cp-compact-btn"><<button "Hire 3 people">><<run gangCheatSay(gangCheatHire(3), "boss")>><</button>></div>
<div class="btn cp-compact-btn"><<button "Crew loyalty and bond max">><<run gangCheatSay(gangCheatCrewDevotion(), "boss")>><</button>></div>
<div class="btn cp-compact-btn"><<button "Heal and bail out the crew">><<run gangCheatSay(gangCheatCrewReady(), "boss")>><</button>></div>
<div class="btn cp-compact-btn"><<button "Crew to Legend">><<run gangCheatSay(gangCheatCrewLegend(), "boss")>><</button>></div>
<div class="btn cp-compact-btn"><<button "Fill the stash">><<run gangCheatSay(gangCheatStash(), "boss")>><</button>></div>
<div class="btn cp-compact-btn"><<button "Claim the block you are on">><<run gangCheatSay(gangCheatClaimHere(), "boss")>><</button>></div>
<div class="btn cp-compact-btn"><<button "Drop demands and sieges">><<run gangCheatSay(gangCheatClearThreats(), "boss")>><</button>></div>
<div class="btn cp-compact-btn"><<button "Crown yourself King">><<run gangCheatSay(gangCheatKing(), "boss")>><</button>></div>
</div>
<div class="cp-gang-hint">Founding is free and takes the first empty site; you walk out of your current crew without paying. The block you are on is the place you opened the cheats from.</div>
</div>
</div>
<</if>>
<</nobr>><<nobr>>
<<if typeof gangCheatStatus === "function" && getGangWorld()>>
<div class="cp-card" data-cheat-search="war declare win end peace alliance pact non-aggression tribute vassal treaty deals ai war fight diplomacy">
<div class="cp-card-header cp-card-header--red">
<span class="cp-card-icon">⚔</span>
<span class="cp-card-title">War & Deals</span>
</div>
<div class="cp-card-body">
<div class="cp-gang-msg" id="gang-cheat-msg-war"></div>
<div class="cp-gang-sub">Your crew</div>
<div class="cp-gang-actions">
<div class="btn cp-compact-btn"><<button "Declare war on target">><<run gangCheatSay(gangCheatWarOn(gangCheatTarget()), "war")>><</button>></div>
<div class="btn cp-compact-btn"><<button "Win your war">><<run gangCheatSay(gangCheatWinWar(), "war")>><</button>></div>
<div class="btn cp-compact-btn"><<button "End your war">><<run gangCheatSay(gangCheatEndWar(), "war")>><</button>></div>
<div class="btn cp-compact-btn"><<button "Alliance with target">><<run gangCheatSay(gangCheatPact(gangCheatTarget(), "alliance"), "war")>><</button>></div>
<div class="btn cp-compact-btn"><<button "Non-aggression with target">><<run gangCheatSay(gangCheatPact(gangCheatTarget(), "nonAggression"), "war")>><</button>></div>
<div class="btn cp-compact-btn"><<button "Target pays you tribute">><<run gangCheatSay(gangCheatVassal(gangCheatTarget()), "war")>><</button>></div>
</div>
<div class="cp-gang-sub">Between AI crews</div>
<div class="cp-gang-actions">
<div class="btn cp-compact-btn"><<button "Set a crew on the target">><<run gangCheatSay(gangCheatAiWar(gangCheatTarget()), "war")>><</button>></div>
<div class="btn cp-compact-btn"><<button "Tear up target's deals">><<run gangCheatSay(gangCheatTearUpDeals(gangCheatTarget()), "war")>><</button>></div>
</div>
<div class="cp-gang-hint">A won war ends with the loser paying tribute. Allies and crews that pay you tribute count toward the crown.</div>
</div>
</div>
<</if>>
<</nobr>><<nobr>>
<<if typeof gangCheatStatus === "function" && getGangWorld()>>
<div class="cp-card" data-cheat-search="target crew rival ai gang boss leader kill jail cash bankrupt soldiers base state lockdown party raided mourning low profile blocks take wipe destroy dossier secrets">
<div class="cp-card-header cp-card-header--blue">
<span class="cp-card-icon">🎯</span>
<span class="cp-card-title">Target Crew</span>
</div>
<div class="cp-card-body">
<div class="cp-gang-msg" id="gang-cheat-msg-rival"></div>
<div class="cp-gang-actions">
<div class="btn cp-compact-btn"><<button "Open its dossier">><<run gangCheatSay(gangCheatDossier(gangCheatTarget()), "rival")>><</button>></div>
<div class="btn cp-compact-btn"><<button "Kill its boss">><<run gangCheatSay(gangCheatKillBoss(gangCheatTarget()), "rival")>><</button>></div>
<div class="btn cp-compact-btn"><<button "Jail its boss (7 days)">><<run gangCheatSay(gangCheatJailBoss(gangCheatTarget()), "rival")>><</button>></div>
<div class="btn cp-compact-btn"><<button "Cash +$5000">><<run gangCheatSay(gangCheatGangCash(gangCheatTarget(), 5000), "rival")>><</button>></div>
<div class="btn cp-compact-btn"><<button "Bankrupt it">><<run gangCheatSay(gangCheatGangCash(gangCheatTarget(), "zero"), "rival")>><</button>></div>
<div class="btn cp-compact-btn"><<button "Soldiers +10">><<run gangCheatSay(gangCheatSoldiers(gangCheatTarget(), 10), "rival")>><</button>></div>
<div class="btn cp-compact-btn"><<button "Halve its soldiers">><<run gangCheatSay(gangCheatSoldiers(gangCheatTarget(), "half"), "rival")>><</button>></div>
<div class="btn cp-compact-btn"><<button "Take all its blocks">><<run gangCheatSay(gangCheatTakeBlocks(gangCheatTarget()), "rival")>><</button>></div>
<div class="btn cp-compact-btn"><<button "Wipe it out">><<run gangCheatSay(gangCheatDestroy(gangCheatTarget()), "rival")>><</button>></div>
</div>
<div class="cp-gang-sub">Its base for three days</div>
<div class="cp-gang-actions">
<div class="btn cp-compact-btn"><<button "Lockdown">><<run gangCheatSay(gangCheatBaseState(gangCheatTarget(), "lockdown"), "rival")>><</button>></div>
<div class="btn cp-compact-btn"><<button "Party">><<run gangCheatSay(gangCheatBaseState(gangCheatTarget(), "party"), "rival")>><</button>></div>
<div class="btn cp-compact-btn"><<button "Mourning">><<run gangCheatSay(gangCheatBaseState(gangCheatTarget(), "mourning"), "rival")>><</button>></div>
<div class="btn cp-compact-btn"><<button "Boarded up">><<run gangCheatSay(gangCheatBaseState(gangCheatTarget(), "raided"), "rival")>><</button>></div>
<div class="btn cp-compact-btn"><<button "Laying low">><<run gangCheatSay(gangCheatBaseState(gangCheatTarget(), "lowProfile"), "rival")>><</button>></div>
<div class="btn cp-compact-btn"><<button "Open as usual">><<run gangCheatSay(gangCheatBaseState(gangCheatTarget(), "normal"), "rival")>><</button>></div>
</div>
<div class="cp-gang-hint">A killed boss is replaced by the strongest lieutenant, and a contested chair can split the crew. Taking blocks needs a crew of your own. You cannot wipe out the crew you work for.</div>
</div>
</div>
<</if>>
<</nobr>><<nobr>>
<<if typeof gangCheatStatus === "function" && getGangWorld()>>
<div class="cp-card" data-cheat-search="market shock prices goods product guns cars loot drought glut calm">
<div class="cp-card-header cp-card-header--green">
<span class="cp-card-icon">📈</span>
<span class="cp-card-title">Street Market</span>
</div>
<div class="cp-card-body">
<div class="cp-gang-msg" id="gang-cheat-msg-market"></div>
<div class="cp-gang-actions">
<<for _gcShock, _gcLabel range gangCheatShockLabels()>>
<<capture _gcShock>>
<div class="btn cp-compact-btn"><<button _gcLabel>><<run gangCheatSay(gangCheatMarketShock(_gcShock), "market")>><</button>></div>
<</capture>>
<</for>>
<div class="btn cp-compact-btn"><<button "Calm the market">><<run gangCheatSay(gangCheatMarketCalm(), "market")>><</button>></div>
</div>
<div class="cp-gang-hint">A drought makes a good scarce and dear for a few days; a glut makes it cheap. Shortages push crews into deals and wars.</div>
</div>
</div>
<</if>>
<</nobr>><<nobr>>
<<if typeof gangCheatStatus === "function" && getGangWorld()>>
<div class="cp-card" data-cheat-search="18+ adult sex scenes lounge lover crew bond victory night boss favorite refusal limits stroll debt work honeytrap communion sisters captive spoils">
<div class="cp-card-header cp-card-header--pink">
<span class="cp-card-icon">💋</span>
<span class="cp-card-title">Street Scenes 18+</span>
</div>
<div class="cp-card-body">
<div class="cp-gang-status" id="gang-cheat-scene-status"><<= gangCheatSceneStatus()>></div>
<div class="cp-gang-msg" id="gang-cheat-msg-scene"></div>
<div class="cp-gang-actions">
<div class="btn cp-compact-btn"><<button "Reset refusals and limits">><<run gangCheatSay(gangCheatResetScenes(), "scene")>><</button>></div>
<div class="btn cp-compact-btn"><<button "Lounge open, crew close">><<run gangCheatSay(gangCheatLoungeReady(), "scene")>><</button>></div>
<div class="btn cp-compact-btn"><<button "Victory night tonight">><<run gangCheatSay(gangCheatVictoryNight(), "scene")>><</button>></div>
<div class="btn cp-compact-btn"><<button "The boss wants you">><<run gangCheatSay(gangCheatBossFavorite(), "scene")>><</button>></div>
</div>
<div class="cp-gang-hint">Scenes still follow the content filter for each pair. The lounge and victory nights need your own crew and happen at the HQ at night; the boss asks a soldier or higher up to the office. The communion and the sisters come with joining a cult or a sisterhood as a hangaround. Captive follows a lost fight and spoils a won one.</div>
</div>
</div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if $cheatsToken == undefined || hashWord($cheatsToken) != '1b7c4408'>>
<<ChatMessage 'Invalid cheat code'>>
<div class="cheat-panel cheat-panel--state">
<div class="cheat-state-card">
<div class="cheat-state-icon">⚠</div>
<div class="cheat-state-title">Access denied</div>
<div class="cheat-state-text">The current cheat token is missing or invalid. Return to gameplay and unlock the panel again.</div>
<div class="cheat-panel-footer cheat-panel-footer--center">
<div class="cheat-panel-footer-action">
<div class="btn"><<button "Continue" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
</div>
</div>
</div>
</div>
<<else>>
<<include "Choose_Object_Cheats">>
<<include "Face_Variables_Assign_Cheats">>
<<include "Body_Variables_Assign">>
<<include "Genitals_Variables_Assign">>
<<include "Stats1_Variables_Assign">>
<<include "Second_Stats_Variables_Assign">>
<<include "All_Attributes_Variables_Assign">>
<<include "Reputation_Variables_Assign">>
<<include "Relationships_Variables_Assign">>
<<include "Relationships_Second_Variables_Assign">>
<<if $cheatsChar.info.isPlayer>>
<<include "Display_Battle_Modes_Cheats_UpdateButtons">>
<</if>>
<div class="cheat-panel">
<div class="cheat-panel-header">
<div class="cheat-panel-header-left">
<div class="cheat-panel-emblem">⚙</div>
<div class="cheat-panel-heading">
<span class="cheat-panel-eyebrow">Developer Access</span>
<div class="cheat-panel-title-row">
<span class="cheat-panel-title">Cheat Panel</span>
<<if $cheatsChar.info.isPlayer == true>>
<span class="cheat-panel-badge cheat-panel-badge--player">Player</span>
<<else>>
<span class="cheat-panel-badge cheat-panel-badge--npc">NPC</span>
<</if>>
</div>
<span class="cheat-panel-char-name"><<print $cheatsChar.info.firstName + " " + $cheatsChar.info.secondName>></span>
</div>
</div>
</div>
<div class="cheat-panel-toolbar">
<div class="cheat-panel-toolbar-copy">
<div class="cheat-panel-toolbar-title">Direct control over stats, appearance and world state</div>
<div class="cheat-panel-toolbar-text">Tabs keep the original cheat logic intact while exposing faster controls and clearer grouping.</div>
</div>
<div class="cheat-panel-tools">
<div class="cheat-tab-nav" role="tablist" aria-label="Cheat categories">
<button type="button" class="cheat-tab-btn cheat-tab-btn--active" id="cheat-tab-appearance" role="tab" aria-selected="true" aria-controls="cheat-panel-appearance" tabindex="0" onclick="switchCheatTab('appearance')">
<span class="cheat-tab-btn-icon">👤</span>
<span class="cheat-tab-btn-label">Appearance</span>
</button>
<button type="button" class="cheat-tab-btn" id="cheat-tab-stats" role="tab" aria-selected="false" aria-controls="cheat-panel-stats" tabindex="-1" onclick="switchCheatTab('stats')">
<span class="cheat-tab-btn-icon">📈</span>
<span class="cheat-tab-btn-label">Stats</span>
</button>
<button type="button" class="cheat-tab-btn" id="cheat-tab-clothing" role="tab" aria-selected="false" aria-controls="cheat-panel-clothing" tabindex="-1" onclick="switchCheatTab('clothing')">
<span class="cheat-tab-btn-icon">👚</span>
<span class="cheat-tab-btn-label">Clothing</span>
</button>
<<if $cheatsChar.info.isPlayer == true>>
<button type="button" class="cheat-tab-btn" id="cheat-tab-economy" role="tab" aria-selected="false" aria-controls="cheat-panel-economy" tabindex="-1" onclick="switchCheatTab('economy')">
<span class="cheat-tab-btn-icon">💰</span>
<span class="cheat-tab-btn-label">Economy</span>
</button>
<button type="button" class="cheat-tab-btn" id="cheat-tab-time" role="tab" aria-selected="false" aria-controls="cheat-panel-time" tabindex="-1" onclick="switchCheatTab('time')">
<span class="cheat-tab-btn-icon">⏰</span>
<span class="cheat-tab-btn-label">Time & Events</span>
</button>
<button type="button" class="cheat-tab-btn" id="cheat-tab-other" role="tab" aria-selected="false" aria-controls="cheat-panel-other" tabindex="-1" onclick="switchCheatTab('other')">
<span class="cheat-tab-btn-icon">⚡</span>
<span class="cheat-tab-btn-label">Battle & Other</span>
</button>
<button type="button" class="cheat-tab-btn" id="cheat-tab-streets" role="tab" aria-selected="false" aria-controls="cheat-panel-streets" tabindex="-1" onclick="switchCheatTab('streets')">
<span class="cheat-tab-btn-icon">🗡</span>
<span class="cheat-tab-btn-label">Street Gangs</span>
</button>
<<else>>
<button type="button" class="cheat-tab-btn" id="cheat-tab-relations" role="tab" aria-selected="false" aria-controls="cheat-panel-relations" tabindex="-1" onclick="switchCheatTab('relations')">
<span class="cheat-tab-btn-icon">🤝</span>
<span class="cheat-tab-btn-label">Relations</span>
</button>
<button type="button" class="cheat-tab-btn" id="cheat-tab-preferences" role="tab" aria-selected="false" aria-controls="cheat-panel-preferences" tabindex="-1" onclick="switchCheatTab('preferences')">
<span class="cheat-tab-btn-icon">⚑</span>
<span class="cheat-tab-btn-label">Preferences</span>
</button>
<button type="button" class="cheat-tab-btn" id="cheat-tab-events" role="tab" aria-selected="false" aria-controls="cheat-panel-events" tabindex="-1" onclick="switchCheatTab('events')">
<span class="cheat-tab-btn-icon">⚠</span>
<span class="cheat-tab-btn-label">Events</span>
</button>
<</if>>
</div>
<div class="cheat-search-bar">
<span class="cheat-search-icon" aria-hidden="true">
<svg viewBox="0 0 24 24" focusable="false">
<circle cx="11" cy="11" r="6.5"></circle>
<path d="M16 16l4.5 4.5"></path>
</svg>
</span>
<input type="text" class="cheat-search-input" id="cheat-search-input" placeholder="Search active tab..." aria-label="Search cheats in the active tab" oninput="filterCheats(this.value)" />
</div>
</div>
</div>
<div class="cheat-panel-content">
<div class="cheat-tab-panel cheat-tab-panel--active" id="cheat-panel-appearance" role="tabpanel" aria-labelledby="cheat-tab-appearance" tabindex="0">
<div class="cheat-tab-grid cheat-tab-grid--appearance">
<div class="cheat-section cheat-section--appearance">
<<include "Display_Face_Cheats">>
</div>
<div class="cheat-section cheat-section--appearance">
<<include "ChangeName_Cheats">>
</div>
<div class="cheat-section cheat-section--appearance">
<<include "Display_Body_Cheats">>
</div>
<div class="cheat-section cheat-section--appearance">
<div class="cp-card-stack">
<<include "Display_Genitals_Cheats">>
<<include "Display_Skin_Cheats">>
</div>
</div>
</div>
<div class="cheat-tab-empty" hidden aria-hidden="true">
<div class="cheat-tab-empty-icon">🔍</div>
<div class="cheat-tab-empty-title">No appearance cheats found</div>
<div class="cheat-tab-empty-text">Try a broader keyword or switch to another tab.</div>
</div>
</div>
<div class="cheat-tab-panel" id="cheat-panel-stats" role="tabpanel" aria-labelledby="cheat-tab-stats" tabindex="0" hidden>
<div class="cheat-tab-grid cheat-tab-grid--double">
<div class="cheat-section">
<<include "Display_Battle_Stats_Cheats">>
</div>
<div class="cheat-section">
<<include "Display_Second_Stats_Cheats">>
</div>
</div>
<div class="cheat-tab-grid cheat-tab-grid--single">
<div class="cheat-section">
<<include "Display_Stats_Cheats">>
</div>
</div>
<div class="cheat-tab-empty" hidden aria-hidden="true">
<div class="cheat-tab-empty-icon">🔍</div>
<div class="cheat-tab-empty-title">No stat cheats found</div>
<div class="cheat-tab-empty-text">Search matches titles, labels, values and action controls inside this tab.</div>
</div>
</div>
<div class="cheat-tab-panel" id="cheat-panel-clothing" role="tabpanel" aria-labelledby="cheat-tab-clothing" tabindex="0" hidden>
<section class="clothing-cheat-catalog" id="clothing-cheat-catalog">
<div class="clothing-cheat-hero">
<div>
<span class="clothing-cheat-eyebrow">Complete collection</span>
<h2>Clothing catalogue</h2>
<p>Browse every clothing item and add an exact copy directly to <<print $cheatsChar.info.firstName>>'s inventory.</p>
</div>
<div class="clothing-cheat-counter" id="clothing-cheat-count">200 items</div>
</div>
<div class="clothing-cheat-controls">
<label class="clothing-cheat-search-control">
<span>Search</span>
<input id="clothing-cheat-search" data-clothing-filter type="search" placeholder="Name, description, perk, role..." autocomplete="off">
</label>
<label><span>Slot</span><select id="clothing-cheat-slot" data-clothing-filter>
<option value="all" selected>All slots</option><option value="5">Head</option><option value="2">Upper body</option><option value="3">Lower body</option><option value="6">Hands</option><option value="4">Feet</option><option value="1">Bra</option><option value="0">Underwear</option>
</select></label>
<label><span>Gender</span><select id="clothing-cheat-gender" data-clothing-filter>
<option value="all" selected>All genders</option><option value="women">Women</option><option value="men">Men</option><option value="unisex">Unisex</option>
</select></label>
<label><span>Role / status</span><select id="clothing-cheat-role" data-clothing-filter>
<option value="all" selected>All roles</option><option value="civilian">Civilian</option><option value="student">Student</option><option value="worker">Worker</option><option value="guard">Guard</option><option value="jailer">Jailer</option><option value="police">Police</option><option value="inmate">Inmate</option>
</select></label>
<label><span>Style</span><select id="clothing-cheat-style" data-clothing-filter>
<option value="all" selected>All styles</option><option value="0">Casual</option><option value="1">Business</option><option value="2">Sportswear</option><option value="3">Sexy</option><option value="4">Formal</option><option value="5">Uniform</option><option value="6">Prison</option><option value="7">Workwear</option><option value="8">Streetwear</option>
</select></label>
<label><span>Sort by</span><select id="clothing-cheat-sort" data-clothing-filter>
<option value="name" selected>Name</option><option value="slot">Slot</option><option value="style">Style</option><option value="gender">Gender</option><option value="role">Role / status</option><option value="price">Price</option><option value="protection">Protection</option><option value="beauty">Beauty</option><option value="transgenderness">Trans potential</option><option value="sexuality">Sexuality</option><option value="horror">Horror</option>
</select></label>
<label><span>Direction</span><select id="clothing-cheat-direction" data-clothing-filter>
<option value="asc" selected>Low → high</option><option value="desc">High → low</option>
</select></label>
<label><span>Give amount</span><select id="clothing-cheat-quantity" data-clothing-filter>
<option value="1" selected>×1</option><option value="5">×5</option><option value="10">×10</option><option value="25">×25</option><option value="99">×99</option>
</select></label>
<button type="button" class="clothing-cheat-reset" id="clothing-cheat-reset">Reset filters</button>
</div>
<div class="clothing-cheat-grid" id="clothing-cheat-grid">
<div class="clothing-cheat-loading">Open the Clothing tab to load the catalogue.</div>
</div>
</section>
</div>
<<if $cheatsChar.info.isPlayer == true>>
<div class="cheat-tab-panel" id="cheat-panel-economy" role="tabpanel" aria-labelledby="cheat-tab-economy" tabindex="0" hidden>
<div class="cheat-tab-grid cheat-tab-grid--double">
<div class="cheat-section">
<<include "Display_Reputation_Cheats">>
</div>
<div class="cheat-section">
<<include "Display_Money_Cheats">>
</div>
</div>
<div class="cheat-tab-grid cheat-tab-grid--single">
<div class="cheat-section">
<<include "Display_Items_Cheats">>
</div>
</div>
<div class="cheat-tab-empty" hidden aria-hidden="true">
<div class="cheat-tab-empty-icon">🔍</div>
<div class="cheat-tab-empty-title">No economy cheats found</div>
<div class="cheat-tab-empty-text">Search by resource name, action label or stat title.</div>
</div>
</div>
<div class="cheat-tab-panel" id="cheat-panel-time" role="tabpanel" aria-labelledby="cheat-tab-time" tabindex="0" hidden>
<div class="cheat-tab-grid cheat-tab-grid--double">
<div class="cheat-section">
<<include "Display_TimeManagement_Cheats">>
</div>
<div class="cheat-section">
<<include "Display_Events_Cheats">>
</div>
</div>
<div class="cheat-tab-empty" hidden aria-hidden="true">
<div class="cheat-tab-empty-icon">🔍</div>
<div class="cheat-tab-empty-title">No time or event cheats found</div>
<div class="cheat-tab-empty-text">Search by time unit, event action or utility control.</div>
</div>
</div>
<div class="cheat-tab-panel" id="cheat-panel-other" role="tabpanel" aria-labelledby="cheat-tab-other" tabindex="0" hidden>
<div class="cheat-tab-grid cheat-tab-grid--double">
<div class="cheat-section">
<<include "Display_Battle_Modes_Cheats">>
</div>
<div class="cheat-section">
<<include "Display_ChastityCage_Cheats">>
</div>
</div>
<div class="cheat-tab-grid cheat-tab-grid--double">
<div class="cheat-section">
<<include "Display_Brothel_Cheats">>
</div>
<div class="cheat-section">
<<include "Display_Weather_Cheats">>
</div>
</div>
<div class="cheat-tab-grid cheat-tab-grid--single">
<div class="cheat-section">
<<include "Display_NpcRelationSpeed_Cheats">>
</div>
</div>
<div class="cheat-tab-grid cheat-tab-grid--single">
<div class="cheat-section">
<<include "Display_Cruise_Cheats">>
</div>
</div>
<div class="cheat-tab-grid cheat-tab-grid--single">
<div class="cheat-section">
<<include "Display_Prison_Cheats">>
</div>
</div>
<div class="cheat-tab-empty" hidden aria-hidden="true">
<div class="cheat-tab-empty-icon">🔍</div>
<div class="cheat-tab-empty-title">No advanced cheats found</div>
<div class="cheat-tab-empty-text">Try another keyword or inspect a different category.</div>
</div>
</div>
<div class="cheat-tab-panel" id="cheat-panel-streets" role="tabpanel" aria-labelledby="cheat-tab-streets" tabindex="0" hidden>
<div class="cheat-tab-grid cheat-tab-grid--single">
<div class="cheat-section">
<<include "Display_Gang_Cheats">>
</div>
</div>
<div class="cheat-tab-grid cheat-tab-grid--double">
<div class="cheat-section">
<<include "Display_Gang_Career_Cheats">>
</div>
<div class="cheat-section">
<<include "Display_Gang_Boss_Cheats">>
</div>
</div>
<div class="cheat-tab-grid cheat-tab-grid--double">
<div class="cheat-section">
<<include "Display_Gang_War_Cheats">>
</div>
<div class="cheat-section">
<<include "Display_Gang_Rival_Cheats">>
</div>
</div>
<div class="cheat-tab-grid cheat-tab-grid--double">
<div class="cheat-section">
<<include "Display_Gang_Market_Cheats">>
</div>
<div class="cheat-section">
<<include "Display_Gang_Scene_Cheats">>
</div>
</div>
<div class="cheat-tab-empty" hidden aria-hidden="true">
<div class="cheat-tab-empty-icon">🔍</div>
<div class="cheat-tab-empty-title">No street-gang cheats found</div>
<div class="cheat-tab-empty-text">Search by crew, rank, war, market or scene.</div>
</div>
</div>
<<else>>
<div class="cheat-tab-panel" id="cheat-panel-relations" role="tabpanel" aria-labelledby="cheat-tab-relations" tabindex="0" hidden>
<div class="cheat-tab-grid cheat-tab-grid--double">
<div class="cheat-section">
<<include "Display_Relationships_Cheats">>
</div>
<div class="cheat-section">
<<include "Display_Relationships_Second_Cheats">>
</div>
</div>
<div class="cheat-tab-empty" hidden aria-hidden="true">
<div class="cheat-tab-empty-icon">🔍</div>
<div class="cheat-tab-empty-title">No relationship cheats found</div>
<div class="cheat-tab-empty-text">Search by metric name or override action inside the active tab.</div>
</div>
</div>
<div class="cheat-tab-panel" id="cheat-panel-preferences" role="tabpanel" aria-labelledby="cheat-tab-preferences" tabindex="0" hidden>
<div class="cheat-tab-grid">
<div class="cheat-section">
<<include "Sexual_Orientation_Cheats">>
</div>
<div class="cheat-section">
<<include "Display_Sexual_Role_Cheats">>
</div>
<div class="cheat-section">
<<include "Display_Clothing_Preference_Cheats">>
</div>
</div>
<div class="cheat-tab-empty" hidden aria-hidden="true">
<div class="cheat-tab-empty-icon">🔍</div>
<div class="cheat-tab-empty-title">No preference cheats found</div>
<div class="cheat-tab-empty-text">Search by preference type, label or toggle action.</div>
</div>
</div>
<div class="cheat-tab-panel" id="cheat-panel-events" role="tabpanel" aria-labelledby="cheat-tab-events" tabindex="0" hidden>
<div class="cheat-tab-grid cheat-tab-grid--double">
<div class="cheat-section">
<<include "Display_Events_Cheats">>
</div>
<div class="cheat-section">
<<include "Display_Relocate_NPC_Cheats">>
</div>
</div>
<div class="cheat-tab-empty" hidden aria-hidden="true">
<div class="cheat-tab-empty-icon">🔍</div>
<div class="cheat-tab-empty-title">No event cheats found</div>
<div class="cheat-tab-empty-text">Search by event utility or relocation control.</div>
</div>
</div>
<</if>>
</div>
</div>
<div class="cheat-panel-footer">
<div class="cheat-panel-footer-copy">
<div class="cheat-panel-footer-title">Exit cheat controls</div>
<div class="cheat-panel-footer-text">Applied changes stay active. Leave the panel and return to the current scene at any time.</div>
</div>
<div class="cheat-panel-footer-action">
<div class="btn"><<button "🧪 System Test Lab" "DevTestLab">><</button>></div>
<div class="btn"><<button "Back" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
</div>
</div>
<</if>>
<</nobr>><<nobr>>
<<if $cheatsChar.info.isPlayer == true>>
<<set $cheatsChar = $player>>
<<else>>
<<set $cheatsChar = $interactionNpc>>
<</if>>
<</nobr>><<nobr>>
<div class="cp-card" data-cheat-search="prison jail cellblock police wanted level suspect fugitive arrest booking sentence release parole bail escape scrip reputation heat good time priors sentence days materials shank lockpick pruno protective custody solitary the hole block instant walk out felony misdemeanor intake serve stint programming shot-caller shotcaller run the tier take the block tribute law library inmates npc relations relationships trust bonds grudges friendship hostility cooldown interactions active passive sex role">
<div class="cp-card-header cp-card-header--red">
<span class="cp-card-icon">🔒</span>
<span class="cp-card-title">Prison / Cellblock</span>
</div>
<div class="cp-card-body">
<div class="stat-card-stat-visual cp-stat-card">
<div class="stat-title-stat-visual">Police wanted level (0-100)</div>
<div class="surgery-container cp-stat-control">
<div class="cp-stat-actions cp-stat-actions--decrease">
<div class="surgery-item"><div class="btn cp-compact-btn"><<button "-10">><<run adjustWanted($police, -10)>><<include "Update_Prison_Cheats">><</button>></div></div>
<div class="surgery-item"><div class="btn cp-compact-btn"><<button "Clear">><<run adjustWanted($police, -100)>><<include "Update_Prison_Cheats">><</button>></div></div>
</div>
<div class="stat-visual-stat-visual cp-stat-value-pill" id="police-wanted-txt"></div>
<div class="cp-stat-actions cp-stat-actions--increase">
<div class="surgery-item"><div class="btn cp-compact-btn"><<button "+10">><<run adjustWanted($police, 10)>><<include "Update_Prison_Cheats">><</button>></div></div>
<div class="surgery-item"><div class="btn cp-compact-btn"><<button "Max">><<run adjustWanted($police, 100)>><<include "Update_Prison_Cheats">><</button>></div></div>
</div>
</div>
</div>
<<if isInside()>>
<<set _prog = getSentenceProgress()>>
<div class="stat-title-stat-visual" style="text-align:center; padding-bottom:6px;">Inside Cellblock <<= $prison.block>> - day <<= _prog.day>> of <<= _prog.total>>, <<= _prog.daysLeft>> left.</div>
<div class="stat-card-stat-visual cp-stat-card">
<div class="stat-title-stat-visual">Scrip (commissary currency)</div>
<div class="surgery-container cp-stat-control">
<div class="cp-stat-actions cp-stat-actions--decrease">
<div class="surgery-item"><div class="btn cp-compact-btn"><<button "-10">><<set $prison.scrip = Math.max(0, ($prison.scrip || 0) - 10)>><<include "Update_Prison_Cheats">><</button>></div></div>
</div>
<div class="stat-visual-stat-visual cp-stat-value-pill" id="prison-scrip-txt"></div>
<div class="cp-stat-actions cp-stat-actions--increase">
<div class="surgery-item"><div class="btn cp-compact-btn"><<button "+10">><<set $prison.scrip = ($prison.scrip || 0) + 10>><<include "Update_Prison_Cheats">><</button>></div></div>
<div class="surgery-item"><div class="btn cp-compact-btn"><<button "+50">><<set $prison.scrip = ($prison.scrip || 0) + 50>><<include "Update_Prison_Cheats">><</button>></div></div>
</div>
</div>
</div>
<div class="stat-card-stat-visual cp-stat-card">
<div class="stat-title-stat-visual">Reputation on the block (0-100)</div>
<div class="surgery-container cp-stat-control">
<div class="cp-stat-actions cp-stat-actions--decrease">
<div class="surgery-item"><div class="btn cp-compact-btn"><<button "-10">><<set $prison.rep = Math.max(0, ($prison.rep || 0) - 10)>><<include "Update_Prison_Cheats">><</button>></div></div>
</div>
<div class="stat-visual-stat-visual cp-stat-value-pill" id="prison-rep-txt"></div>
<div class="cp-stat-actions cp-stat-actions--increase">
<div class="surgery-item"><div class="btn cp-compact-btn"><<button "+10">><<set $prison.rep = Math.min(100, ($prison.rep || 0) + 10)>><<include "Update_Prison_Cheats">><</button>></div></div>
<div class="surgery-item"><div class="btn cp-compact-btn"><<button "Max">><<set $prison.rep = 100>><<include "Update_Prison_Cheats">><</button>></div></div>
</div>
</div>
</div>
<div class="stat-card-stat-visual cp-stat-card">
<div class="stat-title-stat-visual">Heat / guard suspicion (0-100)</div>
<div class="surgery-container cp-stat-control">
<div class="cp-stat-actions cp-stat-actions--decrease">
<div class="surgery-item"><div class="btn cp-compact-btn"><<button "-10">><<set $prison.heat = Math.max(0, ($prison.heat || 0) - 10)>><<include "Update_Prison_Cheats">><</button>></div></div>
<div class="surgery-item"><div class="btn cp-compact-btn"><<button "Clear">><<set $prison.heat = 0>><<include "Update_Prison_Cheats">><</button>></div></div>
</div>
<div class="stat-visual-stat-visual cp-stat-value-pill" id="prison-heat-txt"></div>
<div class="cp-stat-actions cp-stat-actions--increase">
<div class="surgery-item"><div class="btn cp-compact-btn"><<button "+10">><<set $prison.heat = Math.min(100, ($prison.heat || 0) + 10)>><<include "Update_Prison_Cheats">><</button>></div></div>
</div>
</div>
</div>
<div class="stat-card-stat-visual cp-stat-card">
<div class="stat-title-stat-visual">Good time (days shaved off the bid)</div>
<div class="surgery-container cp-stat-control">
<div class="cp-stat-actions cp-stat-actions--decrease">
<div class="surgery-item"><div class="btn cp-compact-btn"><<button "Reset">><<set $prison.goodTime = 0>><<include "Update_Prison_Cheats">><</button>></div></div>
</div>
<div class="stat-visual-stat-visual cp-stat-value-pill" id="prison-goodtime-txt"></div>
<div class="cp-stat-actions cp-stat-actions--increase">
<div class="surgery-item"><div class="btn cp-compact-btn"><<button "+1">><<set $prison.goodTime = Math.max(0, ($prison.goodTime || 0) + 1)>><<include "Update_Prison_Cheats">><</button>></div></div>
<div class="surgery-item"><div class="btn cp-compact-btn"><<button "+5">><<set $prison.goodTime = Math.max(0, ($prison.goodTime || 0) + 5)>><<include "Update_Prison_Cheats">><</button>></div></div>
</div>
</div>
</div>
<div class="stat-card-stat-visual cp-stat-card">
<div class="stat-title-stat-visual">Sentence length (days handed down)</div>
<div class="surgery-container cp-stat-control">
<div class="cp-stat-actions cp-stat-actions--decrease">
<div class="surgery-item"><div class="btn cp-compact-btn"><<button "-1">><<set $prison.sentenceDays = Math.max(1, ($prison.sentenceDays || 1) - 1)>><<include "Update_Prison_Cheats">><</button>></div></div>
</div>
<div class="stat-visual-stat-visual cp-stat-value-pill" id="prison-sentence-txt"></div>
<div class="cp-stat-actions cp-stat-actions--increase">
<div class="surgery-item"><div class="btn cp-compact-btn"><<button "+1">><<set $prison.sentenceDays = ($prison.sentenceDays || 0) + 1>><<include "Update_Prison_Cheats">><</button>></div></div>
</div>
</div>
</div>
<div class="stat-card-stat-visual cp-stat-card">
<div class="stat-title-stat-visual">Priors on your sheet (stack the next fall)</div>
<div class="surgery-container cp-stat-control">
<div class="cp-stat-actions cp-stat-actions--decrease">
<div class="surgery-item"><div class="btn cp-compact-btn"><<button "-1">><<set $prison.priors = Math.max(0, ($prison.priors || 0) - 1)>><<include "Update_Prison_Cheats">><</button>></div></div>
</div>
<div class="stat-visual-stat-visual cp-stat-value-pill" id="prison-priors-txt"></div>
<div class="cp-stat-actions cp-stat-actions--increase">
<div class="surgery-item"><div class="btn cp-compact-btn"><<button "+1">><<set $prison.priors = ($prison.priors || 0) + 1>><<include "Update_Prison_Cheats">><</button>></div></div>
</div>
</div>
</div>
<div class="stat-card-stat-visual cp-stat-card">
<div class="stat-title-stat-visual">Programming credit (feeds the parole board)</div>
<div class="surgery-container cp-stat-control">
<div class="cp-stat-actions cp-stat-actions--decrease">
<div class="surgery-item"><div class="btn cp-compact-btn"><<button "Reset">><<set $prison.programming = 0>><<include "Update_Prison_Cheats">><</button>></div></div>
</div>
<div class="stat-visual-stat-visual cp-stat-value-pill" id="prison-prog-txt"></div>
<div class="cp-stat-actions cp-stat-actions--increase">
<div class="surgery-item"><div class="btn cp-compact-btn"><<button "+1">><<set $prison.programming = Math.max(0, ($prison.programming || 0) + 1)>><<include "Update_Prison_Cheats">><</button>></div></div>
<div class="surgery-item"><div class="btn cp-compact-btn"><<button "+5">><<set $prison.programming = Math.max(0, ($prison.programming || 0) + 5)>><<include "Update_Prison_Cheats">><</button>></div></div>
</div>
</div>
</div>
<div class="stat-card-stat-visual cp-stat-card">
<div class="stat-title-stat-visual">Inmate relationships (whole roster)</div>
<div class="surgery-container cp-stat-control">
<div class="stat-visual-stat-visual cp-stat-value-pill" id="prison-relations-txt"></div>
</div>
</div>
<div class="cp-action-btn"><div class="btn cp-compact-btn"><<button "Raise trust with everyone (+25)">><<run boostAllPrisonTrust($prisonRoster, 25)>><<include "Update_Prison_Cheats">><</button>></div></div>
<div class="cp-action-btn"><div class="btn cp-compact-btn"><<button "Improve every inmate bond (+20)">><<run improveAllPrisonBonds($prisonRoster, 20)>><<include "Update_Prison_Cheats">><</button>></div></div>
<div class="cp-action-btn"><div class="btn cp-compact-btn"><<button "Clear all prison grudges">><<run clearAllPrisonGrudges($prisonRoster)>><<include "Update_Prison_Cheats">><</button>></div></div>
<div class="cp-action-btn cp-action-btn--primary"><div class="btn cp-compact-btn"><<button "Max every prison relationship">><<run maximizePrisonRelationships($prisonRoster)>><<include "Update_Prison_Cheats">><</button>></div></div>
<div class="cp-action-btn"><div class="btn cp-compact-btn"><<button "Reset inmate interaction limits">><<run resetPrisonNpcInteractionLimits($prison, $prisonRoster)>><<include "Update_Prison_Cheats">><</button>></div></div>
<div class="cp-action-btn cp-action-btn--primary"><div class="btn cp-compact-btn"><<button "Prepare active-role sex access">><<run maximizePrisonRelationships($prisonRoster)>><<set $prison.rep = Math.max(50, ($prison.rep || 0))>><<if $player.attributes.dominance>><<set $player.attributes.dominance.value = $player.attributes.dominance.max>><</if>><<run resetPrisonNpcInteractionLimits($prison, $prisonRoster)>><<include "Update_Prison_Cheats">><</button>></div></div>
<div class="stat-title-stat-visual" style="opacity:0.7; font-size:0.82em; line-height:1.35; margin-top:6px;">Trust is each inmate's relationship with you; bonds are relationships between inmates on the same block. Clearing grudges keeps positive bonds and ownership ties intact. The interaction reset only clears NPC-menu cooldowns - it does not advance the date, sentence, regime, business cycle, or overnight simulation. Active-role preparation also raises block reputation to 50 and maximizes player dominance so the hard active gates are open, though the scene roll can still fail.</div>
<div class="stat-card-stat-visual cp-stat-card">
<div class="stat-title-stat-visual">Shot-caller (you run the tier)</div>
<div class="surgery-container cp-stat-control">
<div class="stat-visual-stat-visual cp-stat-value-pill" id="prison-boss-txt"></div>
<div class="cp-stat-actions cp-stat-actions--increase">
<div class="surgery-item"><div class="btn cp-compact-btn"><<button "Toggle">><<set $prison.shotCaller = not $prison.shotCaller>><<include "Update_Prison_Cheats">><</button>></div></div>
</div>
</div>
</div>
<div class="stat-card-stat-visual cp-stat-card">
<div class="stat-title-stat-visual">Holding a shank</div>
<div class="surgery-container cp-stat-control">
<div class="stat-visual-stat-visual cp-stat-value-pill" id="prison-shiv-txt"></div>
<div class="cp-stat-actions cp-stat-actions--increase">
<div class="surgery-item"><div class="btn cp-compact-btn"><<button "Toggle">><<set $prison.hasShiv = not $prison.hasShiv>><<include "Update_Prison_Cheats">><</button>></div></div>
</div>
</div>
</div>
<div class="stat-card-stat-visual cp-stat-card">
<div class="stat-title-stat-visual">Holding a lockpick (eases the crossing / fence)</div>
<div class="surgery-container cp-stat-control">
<div class="stat-visual-stat-visual cp-stat-value-pill" id="prison-pick-txt"></div>
<div class="cp-stat-actions cp-stat-actions--increase">
<div class="surgery-item"><div class="btn cp-compact-btn"><<button "Toggle">><<set $prison.hasLockpick = not $prison.hasLockpick>><<include "Update_Prison_Cheats">><</button>></div></div>
</div>
</div>
</div>
<div class="cp-action-btn"><div class="btn cp-compact-btn"><<button "Fill crafting stash (+3 of each material)">><<for _m range ["metal", "cloth", "wire", "fruit", "sugar"]>><<set $prison.materials = addPrisonMaterial($prison.materials, _m, 3)>><</for>><<include "Update_Prison_Cheats">><</button>></div></div>
<div class="cp-action-btn"><div class="btn cp-compact-btn"><<button "Reset today's limits (work / cross / bribe / visit ...)">><<run newPrisonDay()>><<include "Update_Prison_Cheats">><</button>></div></div>
<div class="cp-action-btn cp-action-btn--primary"><div class="btn cp-compact-btn"><<button "Walk out free now - end the stint" "PoliceStation">><<run releasePlayer('served')>><</button>></div></div>
<div class="stat-title-stat-visual" style="opacity:0.7; font-size:0.82em; line-height:1.35; margin-top:6px;">Live stint state on $prison. Good time and a shorter sentence both bring the gate closer (walk out from the block once the clock runs out); more priors stack the next fall. "Walk out free now" ends the stint immediately, returns your held property and thaws the frozen city - same as serving your time. Toggles hand you a shank or a lockpick; the stash fill drops raw stock for the crafting bench.</div>
<<else>>
<div class="stat-title-stat-visual" style="text-align:center; padding-bottom:6px;">Not locked up. These book you straight into intake - your city cash is escrowed as property and handed back on release.</div>
<div class="cp-action-btn cp-action-btn--primary"><div class="btn cp-compact-btn"><<button "Send me down - felony (about 36 days)" "Prison_Intake">><<run arrestPlayer(5)>><</button>></div></div>
<div class="cp-action-btn"><div class="btn cp-compact-btn"><<button "Send me down - misdemeanor (about 9 days)" "Prison_Intake">><<run arrestPlayer(2)>><</button>></div></div>
<div class="cp-action-btn"><div class="btn cp-compact-btn"><<button "Throw the book (max severity, about 45 days)" "Prison_Intake">><<run arrestPlayer(6)>><</button>></div></div>
<div class="stat-title-stat-visual" style="opacity:0.7; font-size:0.82em; line-height:1.35; margin-top:6px;">Sentence length scales with the severity you pick and any priors already on your sheet. Booking freezes the city, houses you by gender and generates a fresh block roster - identical to a real arrest. Once inside, reopen this panel for the full stint controls and an instant release.</div>
<</if>>
</div>
</div>
<<done>>
<<include "Update_Prison_Cheats">>
<</done>>
<</nobr>><<nobr>>
<<replace "#police-wanted-txt">><<print getWanted($police)>>/100 · <<print wantedTier(getWanted($police)).label>><</replace>>
<<if isInside()>>
<<set _prisonRelSummary = prisonRelationshipCheatSummary($prisonRoster)>>
<<replace "#prison-scrip-txt">><<print ($prison.scrip || 0)>><</replace>>
<<replace "#prison-rep-txt">><<print ($prison.rep || 0)>>/100<</replace>>
<<replace "#prison-heat-txt">><<print ($prison.heat || 0)>>/100<</replace>>
<<replace "#prison-goodtime-txt">><<print ($prison.goodTime || 0)>><</replace>>
<<replace "#prison-sentence-txt">><<print ($prison.sentenceDays || 0)>><</replace>>
<<replace "#prison-priors-txt">><<print ($prison.priors || 0)>><</replace>>
<<replace "#prison-prog-txt">><<print ($prison.programming || 0)>><</replace>>
<<replace "#prison-relations-txt">><<print _prisonRelSummary.inmates>> inmates · trust avg <<print _prisonRelSummary.averageTrust>> (min <<print _prisonRelSummary.minimumTrust>>) · bonds avg <<print _prisonRelSummary.averageBond>> · <<print _prisonRelSummary.grudges>> grudges<</replace>>
<<replace "#prison-boss-txt">><<print ($prison.shotCaller ? "Yes" : "No")>><</replace>>
<<replace "#prison-shiv-txt">><<print ($prison.hasShiv ? "Yes" : "No")>><</replace>>
<<replace "#prison-pick-txt">><<print ($prison.hasLockpick ? "Yes" : "No")>><</replace>>
<</if>>
<</nobr>><<nobr>>
<div class="cp-card">
<div class="cp-card-header cp-card-header--blue">
<span class="cp-card-icon">🤝</span>
<span class="cp-card-title">Relationships</span>
</div>
<div class="cp-card-body">
<<StatsCheatButton "Friendship" "friendship" true>>
<<StatsCheatButton "Love" "love" true>>
<<StatsCheatButton "Fear" "fear" true>>
</div>
</div>
<<done>>
<<include "Update_Relationships_Cheats">>
<<include "Update_Buttons_Relationships_Cheats">>
<</done>>
<</nobr>><<nobr>>
<<set _relMetrics = $player.getRelationship($cheatsChar.info.id).metrics>>
<<set _characterFriendship = _relMetrics.getMetricProxy("friendship")>>
<<set _characterLove = _relMetrics.getMetricProxy("love")>>
<<set _characterFear = _relMetrics.getMetricProxy("fear")>>
<</nobr>><<nobr>>
<<replace "#friendship-value_txt">><<print Math.trunc(_characterFriendship.value)>>/_characterFriendship.max<</replace>>
<<replace "#love-value_txt">><<print Math.trunc(_characterLove.value)>>/_characterLove.max<</replace>>
<<replace "#fear-value_txt">><<print Math.trunc(_characterFear.value)>>/_characterFear.max<</replace>>
<</nobr>><<nobr>>
<<CheatsButtonUpdate "friendship" _characterFriendship "UpdateRelationshipsValues" true 1 10>>
<<CheatsButtonUpdate "love" _characterLove "UpdateRelationshipsValues" true 1 10>>
<<CheatsButtonUpdate "fear" _characterFear "UpdateRelationshipsValues" true 1 10>>
<</nobr>><<nobr>>
<<include "Update_Relationships_Cheats">>
<<include "Update_Buttons_Relationships_Cheats">>
<</nobr>><<nobr>>
<div class="cp-card">
<div class="cp-card-header cp-card-header--blue">
<span class="cp-card-icon">💔</span>
<span class="cp-card-title">Relationships (2)</span>
</div>
<div class="cp-card-body">
<<StatsCheatButton "Sex" "sex" true>>
<<StatsCheatButton "Anger" "anger" true>>
</div>
</div>
<<done>>
<<include "Update_Relationships_Second_Cheats">>
<<include "Update_Buttons_Relationships_Second_Cheats">>
<</done>>
<</nobr>><<nobr>>
<<set _relMetrics2 = $player.getRelationship($cheatsChar.info.id).metrics>>
<<set _characterSex = _relMetrics2.getMetricProxy("sex")>>
<<set _characterAnger = _relMetrics2.getMetricProxy("anger")>>
<</nobr>><<nobr>>
<<replace "#sex-value_txt">><<print Math.trunc(_characterSex.value)>>/_characterSex.max<</replace>>
<<replace "#anger-value_txt">><<print Math.trunc(_characterAnger.value)>>/_characterAnger.max<</replace>>
<</nobr>><<nobr>>
<<CheatsButtonUpdate "sex" _characterSex "UpdateRelationships_SecondValues" true 1 10>>
<<CheatsButtonUpdate "anger" _characterAnger "UpdateRelationships_SecondValues" true 1 10>>
<</nobr>><<nobr>>
<<include "Update_Relationships_Second_Cheats">>
<<include "Update_Buttons_Relationships_Second_Cheats">>
<</nobr>><<nobr>>
<div class="cp-card">
<div class="cp-card-header cp-card-header--blue">
<span class="cp-card-icon">📍</span>
<span class="cp-card-title">Location</span>
</div>
<div class="cp-card-body">
<div class="cp-action-btn"><div class="btn"><<button "Relocate NPC">><<run RandomRelocateCharacter($indexNPC)>><</button>></div></div>
</div>
</div>
<</nobr>><<nobr>>
<div class="cp-card">
<div class="cp-card-header cp-card-header--purple">
<span class="cp-card-icon">👔</span>
<span class="cp-card-title">Clothing Preference</span>
</div>
<div class="cp-card-body">
<div class="surgery-item"><div class="btn" id="men-btn"></div></div>
<div class="padding-top">
<div class="surgery-item"><div class="btn" id="women-btn"></div></div>
</div>
</div>
</div>
<<done>>
<<include "Update_Buttons_Clothing_Preference_Cheats">>
<</done>>
<</nobr>><<nobr>>
<<if $cheatsChar.info.clothesPreference != "men">>
<<replace "#men-btn">><div class="btn"><<button "👔 Masculine">><<run $cheatsChar.info.clothesPreference = "men">><<run $cheatsChar.AddCloth(true)>><<include "Clothing_Preference_Update_Cheats">><</button>></div><</replace>>
<<else>>
<<replace "#men-btn">><div class="btn non-interacting"><<button "👔 Masculine">><</button>></div><</replace>>
<</if>>
<<if $cheatsChar.info.clothesPreference != "women">>
<<replace "#women-btn">><div class="btn"><<button "👗 Feminine">><<run $cheatsChar.info.clothesPreference = "women">><<run $cheatsChar.AddCloth(true)>><<include "Clothing_Preference_Update_Cheats">><</button>></div><</replace>>
<<else>>
<<replace "#women-btn">><div class="btn non-interacting"><<button "👗 Feminine">><</button>></div><</replace>>
<</if>>
<</nobr>><<nobr>>
<<include "Update_Buttons_Clothing_Preference_Cheats">>
<</nobr>><<nobr>>
<div class="cp-card">
<div class="cp-card-header cp-card-header--pink">
<span class="cp-card-icon">💜</span>
<span class="cp-card-title">Gender Preference</span>
</div>
<div class="cp-card-body">
<div class="surgery-item"><div class="btn" id="manly-btn"></div></div>
<div class="padding-top">
<div class="surgery-item"><div class="btn" id="bi-btn"></div></div>
</div>
<div class="padding-top">
<div class="surgery-item"><div class="btn" id="feminine-btn"></div></div>
</div>
</div>
</div>
<<done>>
<<include "Update_Buttons_Sexual_Orientation_Cheats">>
<</done>>
<</nobr>><<nobr>>
<<if $cheatsChar.info.sexualPreference != "Manly">>
<<replace "#manly-btn">><div class="btn"><<button "Manly">><<run $cheatsChar.info.sexualPreference = "Manly">><<include "Sexual_Orientation_Update_Cheats">><</button>></div><</replace>>
<<else>>
<<replace "#manly-btn">><div class="btn non-interacting"><<button "Manly">><</button>></div><</replace>>
<</if>>
<<if $cheatsChar.info.sexualPreference != "Bi">>
<<replace "#bi-btn">><div class="btn"><<button "Bi">><<run $cheatsChar.info.sexualPreference = "Bi">><<include "Sexual_Orientation_Update_Cheats">><</button>></div><</replace>>
<<else>>
<<replace "#bi-btn">><div class="btn non-interacting"><<button "Bi">><</button>></div><</replace>>
<</if>>
<<if $cheatsChar.info.sexualPreference != "Feminine">>
<<replace "#feminine-btn">><div class="btn"><<button "Feminine">><<run $cheatsChar.info.sexualPreference = "Feminine">><<include "Sexual_Orientation_Update_Cheats">><</button>></div><</replace>>
<<else>>
<<replace "#feminine-btn">><div class="btn non-interacting"><<button "Feminine">><</button>></div><</replace>>
<</if>>
<</nobr>><<nobr>>
<<include "Update_Buttons_Sexual_Orientation_Cheats">>
<</nobr>><<nobr>>
<div class="cp-card">
<div class="cp-card-header cp-card-header--pink">
<span class="cp-card-icon">💫</span>
<span class="cp-card-title">Sexual Role</span>
</div>
<div class="cp-card-body">
<div class="surgery-item"><div class="btn" id="top-btn"></div></div>
<div class="padding-top">
<div class="surgery-item"><div class="btn" id="versatile-btn"></div></div>
</div>
<div class="padding-top">
<div class="surgery-item"><div class="btn" id="bottom-btn"></div></div>
</div>
</div>
</div>
<<done>>
<<include "Update_Buttons_Sexual_Role_Cheats">>
<</done>>
<</nobr>><<nobr>>
<<if $cheatsChar.info.SexRole != "Active">>
<<replace "#top-btn">><div class="btn"><<button "Top">><<run $cheatsChar.info.SexRole = "Active">><<include "Sexual_Role_Update_Cheats">><</button>></div><</replace>>
<<else>>
<<replace "#top-btn">><div class="btn non-interacting"><<button "Top">><</button>></div><</replace>>
<</if>>
<<if $cheatsChar.info.SexRole != "Versatile">>
<<replace "#versatile-btn">><div class="btn"><<button "Versatile">><<run $cheatsChar.info.SexRole = "Versatile">><<include "Sexual_Role_Update_Cheats">><</button>></div><</replace>>
<<else>>
<<replace "#versatile-btn">><div class="btn non-interacting"><<button "Versatile">><</button>></div><</replace>>
<</if>>
<<if $cheatsChar.info.SexRole != "Passive">>
<<replace "#bottom-btn">><div class="btn"><<button "Bottom">><<run $cheatsChar.info.SexRole = "Passive">><<include "Sexual_Role_Update_Cheats">><</button>></div><</replace>>
<<else>>
<<replace "#bottom-btn">><div class="btn non-interacting"><<button "Bottom">><</button>></div><</replace>>
<</if>>
<</nobr>><<nobr>>
<<include "Update_Buttons_Sexual_Role_Cheats">>
<</nobr>><<nobr>>
<div class="cp-card">
<div class="cp-card-header cp-card-header--red">
<span class="cp-card-icon">❤</span>
<span class="cp-card-title">Vitals</span>
</div>
<div class="cp-card-body">
<<StatsCheatButton "Energy" "energy" true>>
<<StatsCheatButton "Health" "health" true>>
<<StatsCheatButton "Horny" "horny" true>>
</div>
</div>
<<done>>
<<include "Update_Stats1_Value_Cheats">>
<<include "Update_Buttons_Stats1_Cheats">>
<</done>>
<</nobr>><<nobr>>
<<set _characterHealth = $cheatsChar.status.health>>
<<set _characterEnergy = $cheatsChar.status.energy>>
<<set _characterHorny = $cheatsChar.status.horny>>
<</nobr>><<nobr>>
<<replace "#health-value_txt">><<print Math.trunc(_characterHealth.value)>>/_characterHealth.max<</replace>>
<<replace "#energy-value_txt">><<print Math.trunc(_characterEnergy.value)>>/_characterEnergy.max<</replace>>
<<replace "#horny-value_txt">><<print Math.trunc(_characterHorny.value)>>/_characterHorny.max<</replace>>
<</nobr>><<nobr>>
<<CheatsButtonUpdate "health" _characterHealth "UpdateStats1Values" true 1 10>>
<<CheatsButtonUpdate "energy" _characterEnergy "UpdateStats1Values" true 1 10>>
<<CheatsButtonUpdate "horny" _characterHorny "UpdateStats1Values" true 1 10>>
<</nobr>><<nobr>>
<<include "Update_Stats1_Value_Cheats">>
<<include "Update_Buttons_Stats1_Cheats">>
<<include "UpdateStatBars">>
<</nobr>><<nobr>>
<div class="cp-card">
<div class="cp-card-header cp-card-header--pink">
<span class="cp-card-icon">🔥</span>
<span class="cp-card-title">Secondary Stats</span>
</div>
<div class="cp-card-body">
<<StatsCheatButton "Dominance" "dominance" true>>
<<StatsCheatButton "Sexual Stamina" "potency" true>>
<<StatsCheatButton "Penis Size" "penisSize" true>>
</div>
</div>
<<done>>
<<include "Update_Second_Stats_Cheats">>
<<include "Update_Buttons_Second_Stats_Cheats">>
<</done>>
<</nobr>><<nobr>>
<<set _characterDominance = $cheatsChar.attributes.dominance>>
<<set _characterPotency = $cheatsChar.status.potency>>
<<set _characterPenisSize = $cheatsChar.body.penisSize>>
<</nobr>><<nobr>>
<<replace "#dominance-value_txt">><<print Math.trunc(_characterDominance.value)>>/_characterDominance.max<</replace>>
<<replace "#potency-value_txt">><<print Math.trunc(_characterPotency.value)>>/_characterPotency.max<</replace>>
<<replace "#penisSize-value_txt">><<print Math.trunc(_characterPenisSize.value)>>/_characterPenisSize.max<</replace>>
<</nobr>><<nobr>>
<<if _characterPenisSize.value == _characterPenisSize.min && _characterGenitals == "Penis">>
/* <<run console.log("Change to Vagina")>> */
<<include "SetVagina_Cheats">>
<<elseif _characterPenisSize.value > _characterPenisSize.min && _characterGenitals == "Vagina">>
<<include "Genitals_Variables_Assign">>
<<include "Update_Buttons_Genitals_Cheats">>
<<include "Face_Variables_Assign_Cheats">>
<<replace "#surgery-icon">><<include "Update_Image_Cheats">><</replace>>
<<run $cheatsChar.body.vaginaSize.value = 0>>
<</if>>
<</nobr>><<nobr>>
<<CheatsButtonUpdate "dominance" _characterDominance "UpdateStats2Values" true 1 10>>
<<CheatsButtonUpdate "potency" _characterPotency "UpdateStats2Values" false 1>>
<<CheatsButtonUpdate "penisSize" _characterPenisSize "UpdateStats2Values" true 1 5>>
<</nobr>><<nobr>>
<<include "Update_Second_Stats_Cheats">>
<<include "Update_Buttons_Second_Stats_Cheats">>
<<include "UpdateStatBars">>
<<include "Check_Min_Penis_Size_Cheats">>
<</nobr>><<nobr>>
<div class="cp-card-stack">
<div class="cp-card">
<div class="cp-card-header cp-card-header--gold">
<span class="cp-card-icon">★</span>
<span class="cp-card-title">All Skills</span>
</div>
<div class="cp-card-body">
<div class="cp-action-btn cp-action-btn--primary"><div class="btn"><<button "Max All Stats">><<include "Maximize_Stats_Cheats">><<include "UpdateAllAttributeValues">><</button>></div></div>
</div>
</div>
<div class="cp-card">
<div class="cp-card-header cp-card-header--red">
<span class="cp-card-icon">⚔</span>
<span class="cp-card-title">Combat</span>
</div>
<div class="cp-card-body">
<<StatsCheatButton "Strength" "attr-strength" true>>
<<StatsCheatButton "Vitality" "attr-vitality" true>>
<<StatsCheatButton "Endurance" "attr-endurance" true>>
<<StatsCheatButton "Dexterity" "attr-dexterity" true>>
<<StatsCheatButton "Defense" "attr-defense" true>>
<div class="cp-action-btn"><div class="btn"><<button "Max Combat">><<include "Maximize_Combat_Cheats">><<include "UpdateAllAttributeValues">><</button>></div></div>
</div>
</div>
<div class="cp-card">
<div class="cp-card-header cp-card-header--blue">
<span class="cp-card-icon">💬</span>
<span class="cp-card-title">Social</span>
</div>
<div class="cp-card-body">
<<StatsCheatButton "Intelligence" "attr-intelligence" true>>
<<StatsCheatButton "Speech" "attr-speech" true>>
<<StatsCheatButton "Performer" "attr-performer" true>>
<div class="cp-action-btn"><div class="btn"><<button "Max Social">><<include "Maximize_Social_Cheats">><<include "UpdateAllAttributeValues">><</button>></div></div>
</div>
</div>
<div class="cp-card">
<div class="cp-card-header cp-card-header--pink">
<span class="cp-card-icon">❤</span>
<span class="cp-card-title">Sexual</span>
</div>
<div class="cp-card-body">
<<StatsCheatButton "Corruption" "attr-corruption" true>>
<<StatsCheatButton "Lust" "attr-lust" true>>
<<StatsCheatButton "Sex Stamina" "attr-sexStamina" true>>
<<StatsCheatButton "Dominance" "attr-dominance2" true>>
<<StatsCheatButton "Submission" "attr-submission" true>>
<div class="cp-action-btn"><div class="btn"><<button "Max Sexual">><<include "Maximize_Sexual_Cheats">><<include "UpdateAllAttributeValues">><</button>></div></div>
</div>
</div>
<div class="cp-card">
<div class="cp-card-header cp-card-header--green">
<span class="cp-card-icon">🔧</span>
<span class="cp-card-title">Proficiency</span>
</div>
<div class="cp-card-body">
<<StatsCheatButton "Lockpick" "attr-lockpick" true>>
<<StatsCheatButton "Firearms" "attr-firearms" true>>
<<StatsCheatButton "Melee" "attr-melee" true>>
<div class="cp-action-btn"><div class="btn"><<button "Max Proficiency">><<include "Maximize_Proficiency_Cheats">><<include "UpdateAllAttributeValues">><</button>></div></div>
</div>
</div>
</div>
<<done>>
<<include "Update_All_Attributes_Values">>
<<include "Update_All_Attributes_Buttons">>
<</done>>
<</nobr>><<nobr>>
/* Combat */
<<set _attrStrength = $cheatsChar.attributes.strength>>
<<set _attrVitality = $cheatsChar.attributes.vitality>>
<<set _attrEndurance = $cheatsChar.attributes.endurance>>
<<set _attrDexterity = $cheatsChar.attributes.dexterity>>
<<set _attrDefense = $cheatsChar.attributes.defense>>
/* Social */
<<set _attrIntelligence = $cheatsChar.attributes.intelligence>>
<<set _attrSpeech = $cheatsChar.attributes.speech>>
<<set _attrPerformer = $cheatsChar.attributes.performer>>
/* Sexual */
<<set _attrCorruption = $cheatsChar.attributes.corruption>>
<<set _attrLust = $cheatsChar.attributes.lust>>
<<set _attrSexStamina = $cheatsChar.attributes.sexStamina>>
<<set _attrDominance2 = $cheatsChar.attributes.dominance>>
<<set _attrSubmission = $cheatsChar.attributes.submission>>
/* Proficiency */
<<set _attrLockpick = $cheatsChar.attributes.lockpick>>
<<set _attrFirearms = $cheatsChar.attributes.firearmProficiency>>
<<set _attrMelee = $cheatsChar.attributes.meleeWeapons>>
<</nobr>><<nobr>>
/* Combat */
<<replace "#attr-strength-value_txt">><<print Math.trunc(_attrStrength.value)>>/_attrStrength.max<</replace>>
<<replace "#attr-vitality-value_txt">><<print Math.trunc(_attrVitality.value)>>/_attrVitality.max<</replace>>
<<replace "#attr-endurance-value_txt">><<print Math.trunc(_attrEndurance.value)>>/_attrEndurance.max<</replace>>
<<replace "#attr-dexterity-value_txt">><<print Math.trunc(_attrDexterity.value)>>/_attrDexterity.max<</replace>>
<<replace "#attr-defense-value_txt">><<print Math.trunc(_attrDefense.value)>>/_attrDefense.max<</replace>>
/* Social */
<<replace "#attr-intelligence-value_txt">><<print Math.trunc(_attrIntelligence.value)>>/_attrIntelligence.max<</replace>>
<<replace "#attr-speech-value_txt">><<print Math.trunc(_attrSpeech.value)>>/_attrSpeech.max<</replace>>
<<replace "#attr-performer-value_txt">><<print Math.trunc(_attrPerformer.value)>>/_attrPerformer.max<</replace>>
/* Sexual */
<<replace "#attr-corruption-value_txt">><<print Math.trunc(_attrCorruption.value)>>/_attrCorruption.max<</replace>>
<<replace "#attr-lust-value_txt">><<print Math.trunc(_attrLust.value)>>/_attrLust.max<</replace>>
<<replace "#attr-sexStamina-value_txt">><<print Math.trunc(_attrSexStamina.value)>>/_attrSexStamina.max<</replace>>
<<replace "#attr-dominance2-value_txt">><<print Math.trunc(_attrDominance2.value)>>/_attrDominance2.max<</replace>>
<<replace "#attr-submission-value_txt">><<print Math.trunc(_attrSubmission.value)>>/_attrSubmission.max<</replace>>
/* Proficiency */
<<replace "#attr-lockpick-value_txt">><<print Math.trunc(_attrLockpick.value)>>/_attrLockpick.max<</replace>>
<<replace "#attr-firearms-value_txt">><<print Math.trunc(_attrFirearms.value)>>/_attrFirearms.max<</replace>>
<<replace "#attr-melee-value_txt">><<print Math.trunc(_attrMelee.value)>>/_attrMelee.max<</replace>>
<</nobr>><<nobr>>
/* Combat */
<<CheatsButtonUpdate "attr-strength" _attrStrength "UpdateAllAttributeValues" true 1 5>>
<<CheatsButtonUpdate "attr-vitality" _attrVitality "UpdateAllAttributeValues" true 1 5>>
<<CheatsButtonUpdate "attr-endurance" _attrEndurance "UpdateAllAttributeValues" true 1 5>>
<<CheatsButtonUpdate "attr-dexterity" _attrDexterity "UpdateAllAttributeValues" true 1 5>>
<<CheatsButtonUpdate "attr-defense" _attrDefense "UpdateAllAttributeValues" true 1 5>>
/* Social */
<<CheatsButtonUpdate "attr-intelligence" _attrIntelligence "UpdateAllAttributeValues" true 1 5>>
<<CheatsButtonUpdate "attr-speech" _attrSpeech "UpdateAllAttributeValues" true 1 5>>
<<CheatsButtonUpdate "attr-performer" _attrPerformer "UpdateAllAttributeValues" true 1 5>>
/* Sexual */
<<CheatsButtonUpdate "attr-corruption" _attrCorruption "UpdateAllAttributeValues" true 1 5>>
<<CheatsButtonUpdate "attr-lust" _attrLust "UpdateAllAttributeValues" true 1 5>>
<<CheatsButtonUpdate "attr-sexStamina" _attrSexStamina "UpdateAllAttributeValues" true 1 5>>
<<CheatsButtonUpdate "attr-dominance2" _attrDominance2 "UpdateAllAttributeValues" true 1 5>>
<<CheatsButtonUpdate "attr-submission" _attrSubmission "UpdateAllAttributeValues" true 1 5>>
/* Proficiency */
<<CheatsButtonUpdate "attr-lockpick" _attrLockpick "UpdateAllAttributeValues" true 1 5>>
<<CheatsButtonUpdate "attr-firearms" _attrFirearms "UpdateAllAttributeValues" true 1 5>>
<<CheatsButtonUpdate "attr-melee" _attrMelee "UpdateAllAttributeValues" true 1 5>>
<</nobr>><<nobr>>
<<include "Update_All_Attributes_Values">>
<<include "Update_All_Attributes_Buttons">>
<<include "UpdateStatBars">>
<</nobr>><<nobr>>
<<include "Maximize_Combat_Cheats">>
<<include "Maximize_Social_Cheats">>
<<include "Maximize_Sexual_Cheats">>
<<include "Maximize_Proficiency_Cheats">>
<</nobr>><<nobr>>
<<set $cheatsChar.attributes.strength.value = $cheatsChar.attributes.strength.max>>
<<set $cheatsChar.attributes.vitality.value = $cheatsChar.attributes.vitality.max>>
<<set $cheatsChar.attributes.endurance.value = $cheatsChar.attributes.endurance.max>>
<<set $cheatsChar.attributes.dexterity.value = $cheatsChar.attributes.dexterity.max>>
<<set $cheatsChar.attributes.defense.value = $cheatsChar.attributes.defense.max>>
<</nobr>><<nobr>>
<<set $cheatsChar.attributes.intelligence.value = $cheatsChar.attributes.intelligence.max>>
<<set $cheatsChar.attributes.speech.value = $cheatsChar.attributes.speech.max>>
<<set $cheatsChar.attributes.performer.value = $cheatsChar.attributes.performer.max>>
<</nobr>><<nobr>>
<<set $cheatsChar.attributes.corruption.value = $cheatsChar.attributes.corruption.max>>
<<set $cheatsChar.attributes.lust.value = $cheatsChar.attributes.lust.max>>
<<set $cheatsChar.attributes.sexStamina.value = $cheatsChar.attributes.sexStamina.max>>
<<set $cheatsChar.attributes.dominance.value = $cheatsChar.attributes.dominance.max>>
<<set $cheatsChar.attributes.submission.value = $cheatsChar.attributes.submission.max>>
<</nobr>><<nobr>>
<<set $cheatsChar.attributes.lockpick.value = $cheatsChar.attributes.lockpick.max>>
<<set $cheatsChar.attributes.firearmProficiency.value = $cheatsChar.attributes.firearmProficiency.max>>
<<set $cheatsChar.attributes.meleeWeapons.value = $cheatsChar.attributes.meleeWeapons.max>>
<</nobr>><<nobr>>
<div class="cp-card">
<div class="cp-card-header cp-card-header--blue">
<span class="cp-card-icon">⏰</span>
<span class="cp-card-title">Time Management</span>
</div>
<div class="cp-card-body">
<div class="stat-card-stat-visual cp-stat-card">
<div class="stat-title-stat-visual">Minutes</div>
<div class="surgery-container cp-stat-control">
<div class="cp-stat-actions cp-stat-actions--decrease">
<div class="surgery-item"><div class="btn cp-compact-btn"><<button "-10">><<include "Decrease_Minutes_Time_10_Cheats">><</button>></div></div>
<div class="surgery-item"><div class="btn cp-compact-btn"><<button "-1">><<include "Decrease_Minutes_Time_1_Cheats">><</button>></div></div>
</div>
<div class="stat-visual-stat-visual cp-stat-value-pill cp-stat-value-pill--time" id="minutes-txt"></div>
<div class="cp-stat-actions cp-stat-actions--increase">
<div class="surgery-item"><div class="btn cp-compact-btn"><<button "+1">><<include "Increase_Minutes_Time_Cheats">><</button>></div></div>
<div class="surgery-item"><div class="btn cp-compact-btn"><<button "+10">><<include "Increase_Minutes_Time_10_Cheats">><</button>></div></div>
</div>
</div>
</div>
<div class="stat-card-stat-visual cp-stat-card">
<div class="stat-title-stat-visual">Hours</div>
<div class="surgery-container cp-stat-control">
<div class="cp-stat-actions cp-stat-actions--decrease">
<div class="surgery-item"><div class="btn cp-compact-btn"><<button "-1">><<include "Decrease_Hour_Time_1_Cheats">><</button>></div></div>
</div>
<div class="stat-visual-stat-visual cp-stat-value-pill cp-stat-value-pill--time" id="hours-txt"></div>
<div class="cp-stat-actions cp-stat-actions--increase">
<div class="surgery-item"><div class="btn cp-compact-btn"><<button "+1">><<include "Increase_Hour_Time_Cheats">><</button>></div></div>
</div>
</div>
</div>
<div class="stat-card-stat-visual cp-stat-card">
<div class="stat-title-stat-visual">Days</div>
<div class="surgery-container cp-stat-control">
<div class="cp-stat-actions cp-stat-actions--decrease">
<div class="surgery-item"><div class="btn cp-compact-btn"><<button "-1">><<include "Decrease_Day_Time_1_Cheats">><</button>></div></div>
</div>
<div class="stat-visual-stat-visual cp-stat-value-pill cp-stat-value-pill--time" id="days-txt"></div>
<div class="cp-stat-actions cp-stat-actions--increase">
<div class="surgery-item"><div class="btn cp-compact-btn"><<button "+1">><<include "Increase_Day_Time_Cheats">><</button>></div></div>
</div>
</div>
</div>
</div>
</div>
<<done>>
<<include "Update_Time_Value_Cheats">>
<</done>>
<</nobr>><<nobr>>
<<replace "#hours-txt">><<print $dateTime.hours>><</replace>>
<<replace "#minutes-txt">><<print $dateTime.minutes>><</replace>>
<<replace "#days-txt">><<print $dateTime.day>><</replace>>
<</nobr>><<nobr>>
<<set $dateTime.hours += 1>>
<<include "Update_Time_Cheats">>
<</nobr>><<nobr>>
<<set $dateTime.hours -= 1>>
<<include "Update_Time_Cheats">>
<</nobr>><<nobr>>
<<set $dateTime.minutes += 1>>
<<include "Update_Time_Cheats">>
<</nobr>><<nobr>>
<<set $dateTime.minutes -= 1>>
<<include "Update_Time_Cheats">>
<</nobr>><<nobr>>
<<set $dateTime.minutes += 10>>
<<include "Update_Time_Cheats">>
<</nobr>><<nobr>>
<<set $dateTime.minutes -= 10>>
<<include "Update_Time_Cheats">>
<</nobr>><<nobr>>
<<SpendDay>>
<<include "Update_Time_Cheats">>
<</nobr>><<nobr>>
<<set $dateTime.day -= 1>>
<<include "Update_Time_Cheats">>
<</nobr>><<nobr>>
<<include "UpdateStatBars">>
<<include "Update_Time_Value_Cheats">>
<</nobr>><<nobr>>
<div class="cp-card">
<div class="cp-card-header cp-card-header--blue">
<span class="cp-card-icon">🌧</span>
<span class="cp-card-title">Weather Control</span>
</div>
<div class="cp-card-body">
<div class="stat-card-stat-visual cp-stat-card">
<div class="stat-title-stat-visual">Rain</div>
<div class="surgery-container cp-stat-control">
<div class="stat-visual-stat-visual cp-stat-value-pill" id="weather-rain-txt"></div>
<div class="cp-stat-actions cp-stat-actions--increase">
<div class="surgery-item"><div class="btn cp-compact-btn"><<button "Toggle">><<include "Toggle_Rain_Cheats">><</button>></div></div>
</div>
</div>
</div>
<div class="stat-card-stat-visual cp-stat-card">
<div class="stat-title-stat-visual">Rain Duration (hours left)</div>
<div class="surgery-container cp-stat-control">
<div class="cp-stat-actions cp-stat-actions--decrease">
<div class="surgery-item"><div class="btn cp-compact-btn"><<button "-1">><<include "Decrease_Rain_Duration_Cheats">><</button>></div></div>
</div>
<div class="stat-visual-stat-visual cp-stat-value-pill cp-stat-value-pill--time" id="weather-duration-txt"></div>
<div class="cp-stat-actions cp-stat-actions--increase">
<div class="surgery-item"><div class="btn cp-compact-btn"><<button "+1">><<include "Increase_Rain_Duration_Cheats">><</button>></div></div>
</div>
</div>
</div>
</div>
</div>
<<done>>
<<include "Update_Weather_Value_Cheats">>
<</done>>
<</nobr>><<nobr>>
<<if !$weather>>
<<set $weather = { isRaining: false, rainEndMinute: 0, nextRainCheckMinute: 0 }>>
<</if>>
<<set _rainStatus = $weather.isRaining ? "Raining" : "Clear">>
<<replace "#weather-rain-txt">><<print _rainStatus>><</replace>>
<<set _totalNow = getGameTotalMinutes($dateTime)>>
<<set _hoursLeft = $weather.isRaining ? Math.max(0, Math.round(($weather.rainEndMinute - _totalNow) / 60)) : 0>>
<<replace "#weather-duration-txt">><<print _hoursLeft>><</replace>>
<</nobr>><<nobr>>
<<if !$weather>>
<<set $weather = { isRaining: false, rainEndMinute: 0, nextRainCheckMinute: 0 }>>
<</if>>
<<if $weather.isRaining>>
<<set $weather.isRaining = false>>
<<set $weather.rainEndMinute = 0>>
<<set $weather.outdoorTrack = null>>
<<set $weather.indoorTrack = null>>
<<run setRainOverlay(false, false)>>
<<else>>
<<set $weather.isRaining = true>>
<<set _totalNow = getGameTotalMinutes($dateTime)>>
<<set $weather.rainEndMinute = _totalNow + 360>>
<<set _outdoorTracks = ["Media/Audio/Weather/rain1.wav","Media/Audio/Weather/rain2.wav","Media/Audio/Weather/rain3.wav","Media/Audio/Weather/rain4.wav"]>>
<<set _indoorTracks = ["Media/Audio/Weather/Outside/rain_outside_1.wav","Media/Audio/Weather/Outside/rain_outside_2.wav","Media/Audio/Weather/Outside/rain_outside_3.wav","Media/Audio/Weather/Outside/rain_outside_4.wav"]>>
<<set $weather.outdoorTrack = _outdoorTracks[Math.floor(Math.random() * _outdoorTracks.length)]>>
<<set $weather.indoorTrack = _indoorTracks[Math.floor(Math.random() * _indoorTracks.length)]>>
<<set _outdoor = typeof isOutdoorLocation === 'function' && isOutdoorLocation($player.info.currentLocation || '')>>
<<run setRainOverlay(true, _outdoor)>>
<</if>>
<<include "Update_Weather_Value_Cheats">>
<</nobr>><<nobr>>
<<if $weather && $weather.isRaining>>
<<set $weather.rainEndMinute += 60>>
<</if>>
<<include "Update_Weather_Value_Cheats">>
<</nobr>><<nobr>>
<<if $weather && $weather.isRaining>>
<<set _totalNow = getGameTotalMinutes($dateTime)>>
<<set $weather.rainEndMinute = Math.max(_totalNow + 1, $weather.rainEndMinute - 60)>>
<</if>>
<<include "Update_Weather_Value_Cheats">>
<</nobr>><<nobr>>
<<if $npcRelationSpeedMultiplier == undefined>>
<<set $npcRelationSpeedMultiplier = 1>>
<</if>>
<div class="cp-card" data-cheat-search="npc relationship speed multiplier world simulation sleep friendship love lust conflict negative breakup drift resentment anger">
<div class="cp-card-header cp-card-header--pink">
<span class="cp-card-icon">💕</span>
<span class="cp-card-title">NPC Relationship Speed</span>
</div>
<div class="cp-card-body">
<div class="stat-card-stat-visual cp-stat-card">
<div class="stat-title-stat-visual">NPC↔NPC Relationship Multiplier</div>
<div class="surgery-container cp-stat-control">
<div class="cp-stat-actions cp-stat-actions--decrease">
<div class="surgery-item"><div class="btn cp-compact-btn"><<button "-1">><<include "Decrease_NpcRelationSpeed_1_Cheats">><</button>></div></div>
<div class="surgery-item"><div class="btn cp-compact-btn"><<button "-0.5">><<include "Decrease_NpcRelationSpeed_Cheats">><</button>></div></div>
</div>
<div class="stat-visual-stat-visual cp-stat-value-pill" id="npc-relation-speed-txt"></div>
<div class="cp-stat-actions cp-stat-actions--increase">
<div class="surgery-item"><div class="btn cp-compact-btn"><<button "+0.5">><<include "Increase_NpcRelationSpeed_Cheats">><</button>></div></div>
<div class="surgery-item"><div class="btn cp-compact-btn"><<button "+1">><<include "Increase_NpcRelationSpeed_1_Cheats">><</button>></div></div>
</div>
</div>
</div>
<div class="cp-action-btn"><div class="btn cp-compact-btn"><<button "Reset to 1x">><<set $npcRelationSpeedMultiplier = 1>><<include "Update_NpcRelationSpeed_Value_Cheats">><</button>></div></div>
<div class="stat-title-stat-visual" style="opacity:0.7; font-size:0.82em; line-height:1.35; margin-top:6px;">Scales how fast NPC↔NPC relationships change — both ways. Higher values speed up bonding (friendship, love, lust) <em>and</em> souring (drifting apart, resentment, fights), so couples form and break up faster. 0x freezes all change; 1x is normal. Applies live in the world and during the pre-sleep world simulation.</div>
</div>
</div>
<<done>>
<<include "Update_NpcRelationSpeed_Value_Cheats">>
<</done>>
<</nobr>><<nobr>>
<<if $npcRelationSpeedMultiplier == undefined>>
<<set $npcRelationSpeedMultiplier = 1>>
<</if>>
<<replace "#npc-relation-speed-txt">><<print $npcRelationSpeedMultiplier>>x<</replace>>
<</nobr>><<nobr>>
<<set _cur = ($npcRelationSpeedMultiplier == undefined ? 1 : $npcRelationSpeedMultiplier)>>
<<set $npcRelationSpeedMultiplier = Math.min(10, Math.round((_cur + 0.5) * 10) / 10)>>
<<include "Update_NpcRelationSpeed_Value_Cheats">>
<</nobr>><<nobr>>
<<set _cur = ($npcRelationSpeedMultiplier == undefined ? 1 : $npcRelationSpeedMultiplier)>>
<<set $npcRelationSpeedMultiplier = Math.min(10, Math.round((_cur + 1) * 10) / 10)>>
<<include "Update_NpcRelationSpeed_Value_Cheats">>
<</nobr>><<nobr>>
<<set _cur = ($npcRelationSpeedMultiplier == undefined ? 1 : $npcRelationSpeedMultiplier)>>
<<set $npcRelationSpeedMultiplier = Math.max(0, Math.round((_cur - 0.5) * 10) / 10)>>
<<include "Update_NpcRelationSpeed_Value_Cheats">>
<</nobr>><<nobr>>
<<set _cur = ($npcRelationSpeedMultiplier == undefined ? 1 : $npcRelationSpeedMultiplier)>>
<<set $npcRelationSpeedMultiplier = Math.max(0, Math.round((_cur - 1) * 10) / 10)>>
<<include "Update_NpcRelationSpeed_Value_Cheats">>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if $cheatsToken == undefined || hashWord($cheatsToken) != '1b7c4408'>>
<<ChatMessage 'The test lab is developer-only.'>>
<div class="btn"><<button "Continue" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
<<else>>
<div class="cheat-panel">
<div class="cheat-panel-header">
<div class="cheat-panel-heading">
<span class="cheat-panel-eyebrow">Developer Access</span>
<div class="cheat-panel-title-row"><span class="cheat-panel-title">🐂 Infidelity Test Lab</span></div>
<span class="cheat-panel-char-name">Self-checks · live inspector · scene launchers</span>
</div>
</div>
\* ── Automated self-checks (no save mutation) ── */
<<set _checks = window.InfidelityTest.runSelfChecks()>>
<<set _passed = _checks.filter(c => c.pass).length>>
<div class="cp-card">
<div class="cp-card-header <<if _passed === _checks.length>>cp-card-header--blue<</if>>">
<span class="cp-card-title">Automated self-checks - <<= _passed>> / <<= _checks.length>> passed</span>
</div>
<div class="cp-card-body">
<<for _c range _checks>>
<div style="padding:3px 0;font-family:monospace;font-size:13px;">
<<if _c.pass>><span style="color:#54e09a">✓</span><<else>><span style="color:#ff2d55;font-weight:700">✗</span><</if>>
<b><<= _c.group>></b> - <<= _c.name>><<if _c.detail>> <span style="opacity:.55">(<<= _c.detail>>)</span><</if>>
</div>
<</for>>
</div>
</div>
\* ── Live inspector on the current NPC ── */
<<if $interactionNpc>>
<<set _npc = $interactionNpc>>
<<set _pid = $player.info.id>>
<<set _kinks = (_npc.behavior && _npc.behavior.kinks && _npc.behavior.kinks.length) ? _npc.behavior.kinks.join(", ") : "none">>
<<set _rp = findRomanticPartner(_npc, _pid)>>
<div class="cp-card">
<div class="cp-card-header"><span class="cp-card-title">Inspector - <<= _npc.info.firstName>></span></div>
<div class="cp-card-body" style="line-height:1.7;">
<div>Kinks: <b><<= _kinks>></b></div>
<div>Dominance: <b><<= _npc.attributes.dominance ? _npc.attributes.dominance.value : "?">></b></div>
<div>resolveCuckoldReaction → <b style="color:#ff7196"><<= window.InfidelityTest.reaction(_npc)>></b></div>
<div>faithfulnessSeductionFactor (vs you): <b><<= window.InfidelityTest.faithfulnessFactor(_npc, _pid).toFixed(2)>></b></div>
<div>cheatWillingnessFactor (vs you): <b><<= window.InfidelityTest.cheatWillingness(_npc, _pid).toFixed(2)>></b></div>
<div>Co-located romantic partner: <b><<if _rp>><<= _rp.character.info.firstName>><<else>>none<</if>></b></div>
<div style="margin-top:10px;opacity:.7">Set kinks on this NPC:</div>
<div class="btn"><<button "+Faithful">><<run window.InfidelityTest.addKink(_npc, "Faithfulness")>><<goto "InfidelityTestLab">><</button>></div>
<div class="btn"><<button "+Cheater">><<run window.InfidelityTest.addKink(_npc, "Cheater")>><<goto "InfidelityTestLab">><</button>></div>
<div class="btn"><<button "+Cuckold">><<run window.InfidelityTest.addKink(_npc, "Cuckold")>><<goto "InfidelityTestLab">><</button>></div>
<div class="btn"><<button "+Cuckquean">><<run window.InfidelityTest.addKink(_npc, "Cuckquean")>><<goto "InfidelityTestLab">><</button>></div>
<div class="btn"><<button "+Hotwife">><<run window.InfidelityTest.addKink(_npc, "Hotwife")>><<goto "InfidelityTestLab">><</button>></div>
<div class="btn"><<button "Clear kinks">><<run window.InfidelityTest.clearKinks(_npc)>><<goto "InfidelityTestLab">><</button>></div>
<div class="btn"><<button "Dominance = 9">><<run window.InfidelityTest.setDominance(_npc, 9)>><<goto "InfidelityTestLab">><</button>></div>
<div class="btn"><<button "Dominance = 2">><<run window.InfidelityTest.setDominance(_npc, 2)>><<goto "InfidelityTestLab">><</button>></div>
</div>
</div>
<div class="cp-card">
<div class="cp-card-header cp-card-header--blue"><span class="cp-card-title">Trigger systems / launch scenes</span></div>
<div class="cp-card-body">
<div class="btn"><<button "▶ Player cuckolds this NPC (mutates state)">>
<<set _n = window.InfidelityTest.cuckoldConsequence(_npc)>>
<<set $ilLastResult = "applyPlayerCuckoldConsequence → " + _n + " partner reaction(s) updated (ordinary partners: grievance/strain; Cuckold watchers: approval/no blame)">>
<<goto "InfidelityTestLab">>
<</button>></div>
<div class="btn"><<button "▶ Scene: I caught my partner cheating">>
<<set $playerPartner = _npc>><<set $playerPartnerIndex = $Characters.indexOf(_npc)>>
<<set $playerPartnerConfrontationReason = "npc_cheating">><<set $playerPartnerConfrontationOtherName = "someone">>
<<goto "player_partner_confrontation">>
<</button>></div>
<div class="btn"><<button "▶ Scene: my partner caught me">>
<<set $playerPartner = _npc>><<set $playerPartnerIndex = $Characters.indexOf(_npc)>>
<<set $playerPartnerConfrontationReason = "player_cheating">><<set $playerPartnerConfrontationOtherName = "someone">>
<<goto "player_partner_confrontation">>
<</button>></div>
<<if _rp>>
<div class="btn"><<button "▶ Scene: jealous partner intervenes">>
<<set $romanticPartnerObject = _rp>>
<<goto "jealous_partner_intervenes">>
<</button>></div>
<<else>>
<div style="opacity:.6;padding:6px 0">Jealous-partner scene needs this NPC to have a co-located dating/soulmate partner (build one in Cheats → Relations).</div>
<</if>>
<<if $ilLastResult>><div style="margin-top:8px;color:#54e09a;font-family:monospace;font-size:13px"><<= $ilLastResult>></div><</if>>
</div>
</div>
<<else>>
<div class="cp-card"><div class="cp-card-body" style="opacity:.7">Open this lab while interacting with an NPC to inspect and trigger systems on them.</div></div>
<</if>>
\* ── Settings ── */
<<set _bal = window.InfidelityTest.balance>>
<div class="cp-card">
<div class="cp-card-header"><span class="cp-card-title">Settings & balance</span></div>
<div class="cp-card-body" style="line-height:1.7">
<div>contentFilter.Cuckolding: <b><<= ($gameSettings.contentFilter.Cuckolding !== false) ? "ON" : "OFF">></b>
<div class="btn"><<button "Toggle">><<set $gameSettings.contentFilter.Cuckolding = ($gameSettings.contentFilter.Cuckolding === false)>><<goto "InfidelityTestLab">><</button>></div>
</div>
<div style="font-family:monospace;font-size:13px;opacity:.8;margin-top:6px">
seedChance=<<= _bal.coupleCuckoldSeedChance>> · breakup%=<<= _bal.cheatingBreakupChance>> · faithCap=<<= _bal.faithfulnessSeductionCap>> · confrontDom=<<= _bal.confrontDominanceThreshold>>
</div>
</div>
</div>
<div class="cheat-panel-footer">
<div class="cheat-panel-footer-action">
<div class="btn"><<button "← Back to Cheats" "Cheats">><</button>></div>
<div class="btn"><<button "Exit" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
</div>
</div>
</div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
/* In-game system test dashboard. The runtime lives in src/scripts/DevTestLab/
and is exposed as window.DevTestLab. Every check is read-only on the save. */
<<if !window.DevTestLab>>
<div class="cheat-panel">
<div class="cp-card">
<div class="cp-card-body" style="color:#ff2d55">
The DevTestLab runtime is not loaded. Rebuild the game (<code>npm run build</code>) so the
compiled scripts include <code>src/scripts/DevTestLab</code>.
</div>
</div>
</div>
<div class="btn"><<button "← Back to cheats" "Cheats">><</button>></div>
<<else>>
<<set _report = window.DevTestLab.runAll()>>
<<set _allGreen = _report.ok>>
<<set _failedSuites = _report.suitesTotal - _report.suitesPassed>>
<div class="cheat-panel">
<div class="cheat-panel-header">
<div class="cheat-panel-heading">
<span class="cheat-panel-eyebrow">Developer / QA</span>
<div class="cheat-panel-title-row"><span class="cheat-panel-title">🧪 System Test Lab</span></div>
<span class="cheat-panel-char-name">Trigger game systems · run read-only self-checks</span>
</div>
</div>
<div class="cheat-panel-content">
<div class="cp-card-stack">
/* ── Last scenario result (no save-persisted vars; read from the runtime) ── */
<<set _last = window.DevTestLab.lastScenario()>>
<<if _last>>
<div class="cp-card" style="border-left:3px solid <<if _last.ok>>#54e09a<<else>>#ff2d55<</if>>">
<div class="cp-card-body">
<b>Last trigger:</b> <<devplain _last.summary>><<if _last.detail>> <span style="opacity:.55">(<<devplain _last.detail>>)</span><</if>>
</div>
</div>
<</if>>
/* ── Scenario triggers - create conditions so a real capability fires ── */
<div class="cp-card">
<div class="cp-card-header cp-card-header--blue"><span class="cp-card-title">⚡ Scenario triggers</span></div>
<div class="cp-card-body" style="opacity:.75;font-size:12px">
Each button sets up live conditions and lets the <b>real game system</b> fire - e.g. two NPCs actually start having sex. These <b>mutate the staged NPCs</b>, but stay scoped to just them: the rest of the world is left alone.
</div>
</div>
<<for _sc range window.DevTestLab.listScenarios()>>
<<capture _sc>>
<div class="cp-card" style="border-left:3px solid #ffbe45">
<div class="cp-card-header"><span class="cp-card-title"><<if _sc.icon>><<devplain _sc.icon>> <</if>><<devplain _sc.label>></span></div>
<div class="cp-card-body">
<<if _sc.description>><div style="opacity:.6;font-size:12px;margin-bottom:6px"><<devplain _sc.description>></div><</if>>
<<if _sc.warning>><div style="color:#ffbe45;font-size:12px;margin-bottom:8px">⚠ <<devplain _sc.warning>></div><</if>>
<div class="btn"><<button "▶ Trigger">>
<<set _res = window.DevTestLab.runScenario(_sc.id)>>
<<if _res.goto>>
<<goto _res.goto>>
<<else>>
<<goto "DevTestLab">>
<</if>>
<</button>></div>
</div>
</div>
<</capture>>
<</for>>
/* ── Read-only diagnostics ── */
/* ── Summary banner ── */
<div class="cp-card">
<div class="cp-card-header <<if _allGreen>>cp-card-header--blue<</if>>">
<span class="cp-card-title">
<<devplain _report.checksPassed>> / <<devplain _report.checksTotal>> checks passed
· <<devplain _report.suitesPassed>> / <<devplain _report.suitesTotal>> systems green
</span>
</div>
<div class="cp-card-body">
<<if _allGreen>>
<span style="color:#54e09a;font-weight:600">✓ All systems nominal.</span>
<<else>>
<<if _report.suitesTotal === 0>>
<span style="color:#ff2d55;font-weight:700">✗ No diagnostic systems are registered.</span>
<<else>>
<span style="color:#ff2d55;font-weight:700">✗ <<devplain _failedSuites>> system(s) failed or returned no checks.</span>
<span style="opacity:.7">Red-spined cards below show what broke.</span>
<</if>>
<</if>>
<div class="btn" style="margin-top:10px"><<button "↻ Run again" "DevTestLab">><</button>></div>
</div>
</div>
/* ── One card per system ── */
<<for _s range _report.suites>>
<<set _suiteGreen = (!_s.error && _s.total > 0 && _s.passed === _s.total)>>
<div class="cp-card" style="border-left:3px solid <<if _suiteGreen>>#54e09a<<else>>#ff2d55<</if>>">
<div class="cp-card-header <<if _suiteGreen>>cp-card-header--blue<</if>>">
<span class="cp-card-title"><<if _s.icon>><<devplain _s.icon>> <</if>><<devplain _s.label>> - <<devplain _s.passed>>/<<devplain _s.total>></span>
</div>
<div class="cp-card-body">
<<if _s.description>>
<div style="opacity:.55;font-size:12px;margin-bottom:6px"><<devplain _s.description>></div>
<</if>>
<<if _s.error>>
<div style="color:#ff2d55;font-family:monospace;font-size:13px;margin-bottom:4px">suite threw: <<devplain _s.error>></div>
<</if>>
<<for _c range _s.checks>>
<div style="padding:2px 0;font-family:monospace;font-size:13px;line-height:1.5">
<<if _c.pass>><span style="color:#54e09a">✓</span><<else>><span style="color:#ff2d55;font-weight:700">✗</span><</if>>
<<devplain _c.name>><<if _c.detail>> <span style="opacity:.55"><<devplain _c.detail>></span><</if>>
</div>
<</for>>
</div>
</div>
<</for>>
</div>
</div>
<div class="cheat-panel-footer">
<div class="cheat-panel-footer-copy">
<div class="cheat-panel-footer-title">Read-only diagnostics</div>
<div class="cheat-panel-footer-text">Nothing here mutates your save. Safe to run any time.</div>
</div>
<div class="cheat-panel-footer-action">
<div class="btn"><<button "← Back to cheats" "Cheats">><</button>></div>
</div>
</div>
</div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<h1 style="text-align: center;">Bad ending (1)</h1>
<<ChatMessage 'Your vision blurs in and out, like a flickering candle in the wind. When your eyes finally manage to focus, you\'re met with a sight that makes your blood run cold. You\'re in a dimly lit room, the walls of which seem to be closing in on you. The air is thick with the smell of decay and corruption. You try to move, but your body doesn\'t respond. It\'s as if you\'re paralyzed, unable to control your own limbs.'>>
<<ChatMessage 'As your gaze falls upon your own body, you\'re horrified to see that it\'s been twisted and contorted into a grotesque parody of its former self. '>>
<<ChatMessage 'And then, you see it. A figure looming over you, its face twisted into a cruel grin. You feel a searing pain as the figure violates you, tearing at your body with an unnatural strength. You try to scream, but your voice is barely a whisper. Your mind recoils in horror as you realize that you\'ve lost all control, reduced to a mere sex toy for the twisted desires of this monster.'>>
<<ChatMessage 'The Etherium infection has consumed you, body and mind.'>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if !$player.attributes || !$player.attributes.corruption || $player.attributes.corruption.value < 50>>
<<ChatMessage 'A crude hole gapes in the plywood next to the alley dumpster. You are not that far gone.'>>
<div class="btn padding-top"><div class="btn"><<button "Back" "SR_SkidRow">><</button>></div></div>
<<elseif $player.status.energy.value < 25>>
<<ChatMessage 'You are too tired to even consider it.'>>
<div class="btn padding-top"><div class="btn"><<button "Back" "SR_SkidRow">><</button>></div></div>
<<else>>
<<SpendTime 30>>
<<SpendEnergy $player 25>>
<<if $player.gender() == "Male" || $player.gender() == "Shemale">>
<<set _pick = 'Media\\Sex\\GloryHole\\Male\\' + Random(0, 1, false) + '.mp4'>>
<<else>>
<<set _pick = 'Media\\Sex\\GloryHole\\Female\\' + Random(0, 4, false) + '.mp4'>>
<</if>>
<<set _tip = Random(20, 80)>>
<<set $player.money += _tip>>
<<if CheckContentFilter('Male')>><<Video _pick>><</if>>
<<ChatMessage 'You kneel. The other side does not speak - just breathes and waits.'>>
<<set _cm = 'A crumpled bill slides through the gap when it is over. $' + _tip + '.'>>
<<ChatMessage _cm>>
<<if typeof $player.attributes.corruption.increase === 'function'>>
<<run $player.attributes.corruption.increase(3)>>
<</if>>
<<run $player.status.horny.decrease(30)>>
<<run $player.characterEvents.registerEvent($player.info.id, "AlleyGloryHole", 1)>>
<div class="btn padding-top"><div class="btn"><<button "Leave" "SR_SkidRow">><</button>></div></div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<LockSettings>>
<<Chat $interactionNpc 'Darling, *she whispers softly, turning to you with that same smile that always makes your heart beat faster*. *Her voice, like warm silk, wraps you in comfort, like a hug on a cold evening*. I saw you pull up in that car. Is it really yours?'>>
<<ChatMessage 'You nod, and a light wave of pride spreads through your chest, warming the tips of your fingers.'>>
<<Chat $player 'Yeah, I just bought it. My first real ride.'>>
<<ChatMessage 'Her eyes light up with surprise and genuine admiration, and she claps her hands like a girl who\'s just seen a magician pull a rabbit out of a hat.'>>
<<Chat $interactionNpc 'Oh, you\'re amazing! Buying a car on your own-at your age, I wouldn\'t have dared dream of it. I\'m so proud of you, sweetie!'>>
<<ChatMessage 'She steps closer, and the air fills with her scent-sweet vanilla with a hint of something mysterious, intimate, that stirs a light thrill in you. Her hand touches your shoulder - a warm, almost tender touch that makes your breath catch and your skin tingle with goosebumps.'>>
<<Chat $interactionNpc 'I remember when Robert bought his first car, we\'d sneak off to the countryside all the time. Once we stumbled upon this secluded beach - no one around, just the waves and the wind. We could just be together, without any interruptions... Hey, how about we go there together sometime? I haven\'t been in ages.'>>
<<ChatMessage 'You look at her and ask:'>>
<<Chat $player 'Why not ask Robert?'>>
<<ChatMessage 'She looks away, and a shadow of sadness flickers in her eyes, her lips twisting into a disappointed smile.'>>
<<Chat $interactionNpc 'Robert doesn\'t want to go anywhere anymore. With age, he\'s become a real homebody-couch, TV, and no adventures.'>>
<<ChatMessage 'You smile out of the corner of your mouth, trying to stay calm.'>>
<<Chat $player 'Okay, let\'s go there right now.'>>
<div class="btn padding-top"><<button "Continue" "Amanda_Picnic_Quest_Start">><<LeaveInteractionSettings>><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/City/EntertainmentDistrict/Bar.jpg">>
<<ChatMessage 'You spend several hours drinking beer and talking.'>>
<<set $player.money -= 150>>
<<run $player.dailyEvents.registerEvent($interactionNpc.info.id, "InviteToBar", 1)>>
<<set _relUpgrd = {friendship: Random(5.0, 8.0, true)}>>
<<SetRelations $player $interactionNpc _relUpgrd>>
<div class="padding-top">
<div class="btn"><<button "Spike the drink with a drug" "GiveItems">>
<<set $filterType = "Drug">>
<<set $source = "SpikeDrink_BarEvent">>
<</button>></div>
</div>
<div class="padding-top">
<div class="btn"><<button "Leave" "Bar">>
<<run RandomRelocateCharacter($indexNPC, "Bar")>>
<<unset $interactionNpc $indexNPC>>
<<SetSaveBtn true>>
<</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<run _pronoun = $interactionNpc.pronoun().toLowerCase()>>
<<run _pronounHisHer = $interactionNpc.pronounHisHer().toLowerCase()>>
<<set _npcName = $interactionNpc.info.firstName>>
<<set _spikeMsg = "You spike " + _npcName + "'s beer with a drug when " + _pronoun + " goes to the restroom.">>
<<ChatMessage _spikeMsg>>
<<run $player.inventory.removeItem($item.name, 1)>>
<<if Random(0,100) > 60>>
<<set _drinkMsg = _npcName + " doesn't notice anything and continues drinking beer.">>
<<ChatMessage _drinkMsg>>
<<run $interactionNpc.useItem($item, $player)>>
<<run RandomRelocateCharacter($indexNPC, "Bar")>>
<<else>>
<<set _relUpgrd = {friendship: Random(-10.0, -20.0, true)}>>
<<SetRelations $player $interactionNpc _relUpgrd>>
<<run RandomRelocateCharacter($indexNPC)>>
<<set _angryMsg = _npcName + " notices you trying to spike " + _pronounHisHer + " drink and gets angry at you, then leaves.">>
<<ChatMessage _angryMsg>>
<</if>>
<div style="margin-top: 10px;">
<div class="btn"><<button "Leave" "Bar">>
<<unset $interactionNpc $indexNPC $item $filterType>>
<<SetSaveBtn true>>
<</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if $player.dailyEvents.isEventRegistered($player.info.id, "Park_MorningJogger")>>
<<goto $player.info.currentLocation>>
<</if>>
<<Video $locationEventType>>
<<ChatMessage 'A jogger cuts across the path in front of you, earbuds in, pace easy. They slow down when they notice you, pull one earbud free, and wave.'>>
<div class="btn-container padding-top">
<div class="btn"><<button "Just nod" $player.info.currentLocation>>
<<run $player.dailyEvents.registerEvent($player.info.id, "Park_MorningJogger", 1)>>
<<unset $locationEventType>>
<</button>></div>
<div class="btn"><<button "Jog a lap together" $player.info.currentLocation>>
<<SpendTime 20>>
<<SpendEnergy $player 10>>
<<run $player.status.horny.decrease(5)>>
<<ChatMessage 'Twenty minutes around the pond, no introductions, just breath and footfalls. They peel off at the far gate with a thumbs-up.'>>
<<run $player.dailyEvents.registerEvent($player.info.id, "Park_MorningJogger", 1)>>
<<unset $locationEventType>>
<</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if $player.dailyEvents.isEventRegistered($player.info.id, "Campus_StudentProtest")>>
<<goto $player.info.currentLocation>>
<</if>>
<<Video $locationEventType>>
<<ChatMessage 'A cluster of students has blocked the main walk - hand-painted signs, a megaphone that someone bought at a hardware store, a camera crew from the college paper orbiting the edge.'>>
<div class="btn-container padding-top">
<div class="btn"><<button "Edge around" $player.info.currentLocation>>
<<run $player.dailyEvents.registerEvent($player.info.id, "Campus_StudentProtest", 1)>>
<<unset $locationEventType>>
<</button>></div>
<div class="btn"><<button "Stop and listen" $player.info.currentLocation>>
<<SpendTime 15>>
<<ChatMessage 'You catch the three-minute version of whatever they are mad about. A student with clipboard asks for your signature; you scribble something unreadable and move on.'>>
<<run $player.dailyEvents.registerEvent($player.info.id, "Campus_StudentProtest", 1)>>
<<unset $locationEventType>>
<</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if $player.dailyEvents.isEventRegistered($player.info.id, "NC_Bar_DrunkPickup")>>
<<goto $player.info.currentLocation>>
<</if>>
<<if $player.status.alcoholIntoxication.value < 40>>
<<goto $player.info.currentLocation>>
<</if>>
<<if $player.gender() == "Male">>
<<set _pick = "Media\\Interactions\\Kiss\\Female\\Male\\0.webm">>
<<set _flavor = 'A woman three stools down has been looking at you for two drinks. She finally closes the gap, leans in, and kisses you mid-sentence.'>>
<<elseif $player.gender() == "Shemale">>
<<set _pair = Random(0, 1) == 0 ? "Female\\Male" : "Male\\Male">>
<<set _pick = "Media\\Interactions\\Kiss\\" + _pair + "\\0.webm">>
<<set _flavor = 'Someone slides onto the stool next to you, reads your drink like a dare, and leans in without asking first.'>>
<<else>>
<<set _pair = Random(0, 1) == 0 ? "Female\\Male" : "Female\\Female">>
<<set _pick = "Media\\Interactions\\Kiss\\" + _pair + "\\0.webm">>
<<set _flavor = 'Someone slides onto the stool next to you - all confidence, not much sobriety - and kisses you before the bartender can refill your glass.'>>
<</if>>
<<set $locationEventType = _pick>>
<<Video $locationEventType>>
<<ChatMessage _flavor>>
<div class="btn-container padding-top">
<div class="btn"><<button "Laugh it off" $player.info.currentLocation>>
<<run $player.status.horny.increase(5)>>
<<run $player.dailyEvents.registerEvent($player.info.id, "NC_Bar_DrunkPickup", 1)>>
<<unset $locationEventType>>
<</button>></div>
<div class="btn"><<button "Kiss back" $player.info.currentLocation>>
<<run $player.status.horny.increase(18)>>
<<if $player.attributes && $player.attributes.corruption && typeof $player.attributes.corruption.increase === 'function'>>
<<run $player.attributes.corruption.increase(1.5)>>
<</if>>
<<ChatMessage 'You kiss back, hard. They whisper something you do not quite catch, hand you a napkin with a number, and disappear into the crowd before you can count the digits.'>>
<<run $player.dailyEvents.registerEvent($player.info.id, "NC_Bar_DrunkPickup", 1)>>
<<unset $locationEventType>>
<</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if $player.dailyEvents.isEventRegistered($player.info.id, "Slums_StreetWalker")>>
<<goto $player.info.currentLocation>>
<</if>>
<<if $dateTime.hours < 20 && $dateTime.hours >= 5>>
<<goto $player.info.currentLocation>>
<</if>>
<<set _pairs = ["Female\\Female", "Female\\Male", "Male\\Male"]>>
<<set _pg = $player.gender() == "Male" ? "Male\\Male" : ($player.gender() == "Shemale" ? _pairs[Random(0, 2)] : _pairs[Random(0, 1)])>>
<<set $locationEventType = "Media\\Interactions\\Touch Ass\\" + _pg + "\\0.webm">>
<<Video $locationEventType>>
<<ChatMessage 'Down the side street a worker and their client have not bothered with subtlety. The neon from the strip club paints them both in red. They do not see you.'>>
<div class="btn-container padding-top">
<div class="btn"><<button "Keep walking" $player.info.currentLocation>>
<<run $player.status.horny.increase(4)>>
<<run $player.dailyEvents.registerEvent($player.info.id, "Slums_StreetWalker", 1)>>
<<unset $locationEventType>>
<</button>></div>
<div class="btn"><<button "Stop and watch" $player.info.currentLocation>>
<<run $player.status.horny.increase(13)>>
<<if $player.attributes && $player.attributes.corruption && typeof $player.attributes.corruption.increase === 'function'>>
<<run $player.attributes.corruption.increase(1.2)>>
<</if>>
<<ChatMessage 'You stay until the client finishes, pays, and leaves. The worker counts the bills, spots you, and nods once - professional, unsurprised. You move on.'>>
<<run $player.dailyEvents.registerEvent($player.info.id, "Slums_StreetWalker", 1)>>
<<unset $locationEventType>>
<</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if !$player.attributes || !$player.attributes.corruption || $player.attributes.corruption.value < 40>>
<<ChatMessage 'The clerk watches you until you leave. Nothing is offered.'>>
<div class="btn padding-top"><div class="btn"><<button "Back" "SR_Shop">><</button>></div></div>
<<elseif $player.status.energy.value < 15>>
<<ChatMessage 'You are in no state for whatever he is offering.'>>
<div class="btn padding-top"><div class="btn"><<button "Back" "SR_Shop">><</button>></div></div>
<<elseif $player.gender() == "Female" and CheckContentFilter('Male')>>
/* A female player gets the owner himself, and he pays more the further she goes (ShopFavor.twee). */
<<run $player.dailyEvents.registerEvent($player.info.id, "SR_Shop_DiscountFavor", 1)>>
<<set $shopFavor = { day: getCurrentAbsoluteDay(), done: "" }>>
<<goto "SR_Shop_Favor">>
<<else>>
<<SpendTime 15>>
<<SpendEnergy $player 15>>
<<if $player.gender() == "Male">>
<<set _pick = EventMedia.discountClip("masturbate")>>
<<set _pick2 = EventMedia.DISCOUNT_POV_BLOWJOB>>
<<set _flavor = 'The owner\'s wife is in the back office. She locks the door, drops into the desk chair and fingers her pussy with her legs spread over the armrests while you watch. Then she slides to her knees and sucks your cock until you cum in her mouth. When it is over'>>
<<elseif $player.gender() == "Shemale">>
/* A shemale on her knees: never the female oral set, which would show her as a woman. */
<<set _pick = 'Media\\Sex\\Oral\\Shemale\\Male\\' + Random(0, 12, false) + '.mp4'>>
<<set _flavor = 'The clerk beckons you into the storeroom without a word. When it is over'>>
<<else>>
<<set _pick = 'Media\\Sex\\Oral\\Female\\Male\\' + Random(0, 19, false) + '.mp4'>>
<<set _flavor = 'The clerk beckons you into the storeroom. When it is over'>>
<</if>>
<<set _tip = Random(25, 65)>>
<<set $player.money += _tip>>
<<if CheckContentFilter($player.gender() == 'Male' ? 'Female' : 'Male')>><<Video _pick>><<if _pick2>><<Video _pick2>><</if>><</if>>
<<set _cm = _flavor + ' you walk out with $' + _tip + ' in your jacket and nothing on the receipt.'>>
<<ChatMessage _cm>>
<<if typeof $player.attributes.corruption.increase === 'function'>>
<<run $player.attributes.corruption.increase(2)>>
<</if>>
<<run $player.status.horny.decrease(15)>>
<<run $player.dailyEvents.registerEvent($player.info.id, "SR_Shop_DiscountFavor", 1)>>
<div class="btn padding-top"><div class="btn"><<button "Back" "SR_Shop">><</button>></div></div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if !$player.attributes || !$player.attributes.corruption || $player.attributes.corruption.value < 50>>
<<ChatMessage 'The VIP booths are for regulars. You are not one.'>>
<div class="btn padding-top"><div class="btn"><<button "Back" "NC_VIP_Lounge">><</button>></div></div>
<<elseif $dateTime.hours < 22 && $dateTime.hours >= 5>>
<<ChatMessage 'The booths are empty this early. Come back after hours.'>>
<div class="btn padding-top"><div class="btn"><<button "Back" "NC_VIP_Lounge">><</button>></div></div>
<<elseif $player.status.energy.value < 20>>
<<ChatMessage 'You are too drained to perform.'>>
<div class="btn padding-top"><div class="btn"><<button "Back" "NC_VIP_Lounge">><</button>></div></div>
<<else>>
<<SpendTime 30>>
<<SpendEnergy $player 20>>
<<if $player.gender() == "Male">>
<<set _pick = 'Media\\Sex\\JerkOff\\Male\\' + Random(0, 6, false) + '.mp4'>>
<<elseif $player.gender() == "Shemale">>
<<set _pick = 'Media\\Sex\\JerkOff\\Shemale\\0.mp4'>>
<<else>>
<<set _pick = 'Media\\Sex\\JerkOff\\Female\\' + Random(0, 8, false) + '.mp4'>>
<</if>>
<<set _tip = Random(150, 350)>>
<<set $player.money += _tip>>
<<Video _pick>>
<<set _cm = 'A regular in the corner booth waves you over and points to the glass partition. You put on the show - half an hour, no touching, full eye contact. They slide $' + _tip + ' through the slot without looking up from their drink.'>>
<<ChatMessage _cm>>
<<if typeof $player.attributes.corruption.increase === 'function'>>
<<run $player.attributes.corruption.increase(2.5)>>
<</if>>
<<run $player.status.horny.decrease($player.status.horny.max)>>
<<run $player.dailyEvents.registerEvent($player.info.id, "NC_VIP_Lounge_PrivateShow", 1)>>
<div class="btn padding-top"><div class="btn"><<button "Back" "NC_VIP_Lounge">><</button>></div></div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if !$player.attributes || !$player.attributes.corruption || $player.attributes.corruption.value < 35>>
<<ChatMessage 'Someone in the next aisle winks at you. You look away and change in silence.'>>
<div class="btn padding-top"><div class="btn"><<button "Back" "UFG_Locker_Room">><</button>></div></div>
<<elseif $player.status.energy.value < 20>>
<<ChatMessage 'You are too beaten up after today\'s rounds to entertain anything else.'>>
<div class="btn padding-top"><div class="btn"><<button "Back" "UFG_Locker_Room">><</button>></div></div>
<<else>>
<<SpendTime 25>>
<<SpendEnergy $player 20>>
/* EventMedia.UFG_LOCKER_SCENE clips follow the prose beat by beat. The shemale player
tops a woman here, which no locker clip shows, so that branch keeps the generic pick. */
<<set _lockerClips = []>>
<<if $player.gender() == "Shemale">>
<<set _lockerClips = ['Media\\Sex\\Vag\\Female\\Shemale\\' + Random(0, 29, false) + '.mp4']>>
<<set _flavor = 'A rival from the next bout corners you behind the lockers - sweat still on both of you. Neither of you bothers with names.'>>
<<elseif $player.gender() == "Male">>
<<set _lockerClips = [EventMedia.UFG_LOCKER_SCENE.strip, EventMedia.UFG_LOCKER_SCENE.blowjob, EventMedia.UFG_LOCKER_SCENE.standing]>>
<<set _flavor = 'A fighter from the women\'s card catches you wrapping your hands and tugs you into the empty back row. She peels off her sports bra, drops to her knees on the bench to suck your cock for a minute, then hooks a leg around you so you can fuck her against the lockers. Adrenaline does the rest.'>>
<<else>>
<<set _lockerClips = [EventMedia.UFG_LOCKER_SCENE.standing, 'Media\\Sex\\Vag\\Female\\Male\\' + Random(0, 51, false) + '.mp4']>>
<<set _flavor = 'A heavyweight still slick from his last round presses you into the lockers. He lifts you off your feet, pins your back to the cold metal and fucks you hard enough to rattle every door in the row. Adrenaline does the rest.'>>
<</if>>
<<if CheckContentFilter($player.gender() == 'Female' ? 'Male' : 'Female')>><<for _lockerClip range _lockerClips>><<Video _lockerClip>><</for>><</if>>
<<ChatMessage _flavor>>
<<if typeof $player.attributes.corruption.increase === 'function'>>
<<run $player.attributes.corruption.increase(2)>>
<</if>>
<<run $player.status.horny.decrease($player.status.horny.max)>>
<<run $player.dailyEvents.registerEvent($player.info.id, "UFG_LockerRoom_PostFightHookup", 1)>>
<div class="btn padding-top"><div class="btn"><<button "Back" "UFG_Locker_Room">><</button>></div></div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if $player.dailyEvents.isEventRegistered($player.info.id, "EntertainmentDistrict_NightLoiter")>>
<<goto $player.info.currentLocation>>
<</if>>
<<if $dateTime.hours < 22 && $dateTime.hours >= 5>>
<<goto $player.info.currentLocation>>
<</if>>
<<set _kissPairs = ["Female\\Female", "Female\\Male", "Male\\Male"]>>
<<set $locationEventType = "Media\\Interactions\\Kiss\\" + _kissPairs[Random(0, 2)] + "\\0.webm">>
<<Video $locationEventType>>
<<ChatMessage 'Between the bar and the theater a couple has forgotten they are in public - pressed up against a streetlight, hands busy, oblivious to the taxis rolling past.'>>
<div class="btn-container padding-top">
<div class="btn"><<button "Walk by" $player.info.currentLocation>>
<<run $player.status.horny.increase(3)>>
<<run $player.dailyEvents.registerEvent($player.info.id, "EntertainmentDistrict_NightLoiter", 1)>>
<<unset $locationEventType>>
<</button>></div>
<div class="btn"><<button "Take the long way" $player.info.currentLocation>>
<<run $player.status.horny.increase(12)>>
<<if $player.attributes && $player.attributes.corruption && typeof $player.attributes.corruption.increase === 'function'>>
<<run $player.attributes.corruption.increase(1)>>
<</if>>
<<ChatMessage 'You loop the block twice so you can keep them in your peripheral vision. By the time you are back on the main street your face is hot.'>>
<<run $player.dailyEvents.registerEvent($player.info.id, "EntertainmentDistrict_NightLoiter", 1)>>
<<unset $locationEventType>>
<</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<CheckChance 'InviteToPicnic_Success' 'InviteToPicnic_Failed' 'InviteToPicnic_Failed_Twice' 'CharacterInteractions' 'InviteToPicnic' '{createBackButton: true, createTwiceBackButton: true}'>>
<</nobr>><<nobr>>
<<run $player.dailyEvents.registerEvent($player.info.id, "BeachInvite", 1)>>
<<set _acceptPhrases = [
"A day at the beach? That sounds wonderful. Let me grab my things.",
"Sun, sand, and time with you? Count me in!",
"That sounds relaxing. Let's head down to the shore.",
].random()>>
<<Chat $interactionNpc _acceptPhrases>>
<div class="padding-top">
<div class="btn"><<button "Drive to the beach">>
<<set $beachPicnicReturnLocation = $player.info.currentLocation>>
<<set $beachPicnicTargetNpc = $interactionNpc>>
<<set $beachPicnicShowIntro = true>>
<<LeaveInteractionSettings>>
<<goto "BeachPicnic_BeginConversation">>
<</button>></div>
</div>
<</nobr>><<nobr>>
<<set _declinePhrases = [
"I appreciate the invite, but I can't get away right now.",
"That sounds nice, but I have other plans today.",
"Maybe another time. I'm not really in the mood for the beach.",
].random()>>
<<Chat $interactionNpc _declinePhrases>>
<</nobr>><<nobr>>
<<set _firmDeclinePhrases = [
"I already told you no. Please drop it.",
"Seriously, I'm not going to the beach today.",
"Stop pushing, okay? I said I'm not going.",
].random()>>
<<Chat $interactionNpc _firmDeclinePhrases>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _npc = ($Characters.filter((character) => character.info.questInfo.questCharID == 0)[0])>>
<<if !_npc>>
<<ChatMessage "Ethan isn't around to hang out at the beach right now.">>
<div class="btn padding-top"><<button "Back" $player.info.currentLocation>><</button>></div>
<<else>>
<<set $beachPicnicTargetNpc = _npc>>
<<set $beachPicnicMissingMessage = "Ethan isn't around to hang out at the beach right now.">>
<<goto "BeachPicnic_BeginConversation">>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _npc = ($Characters.filter((character) => character.info.questInfo.questCharID == 1)[0])>>
<<if !_npc>>
<<ChatMessage "Robert isn't at the beach right now.">>
<div class="btn padding-top"><<button "Back" $player.info.currentLocation>><</button>></div>
<<else>>
<<set $beachPicnicTargetNpc = _npc>>
<<set $beachPicnicMissingMessage = "Robert isn't at the beach right now.">>
<<goto "BeachPicnic_BeginConversation">>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _npc = ($Characters.filter((character) => character.info.questInfo.questCharID == 2)[0])>>
<<if !_npc>>
<<ChatMessage "Sarah isn't able to make it to the beach right now.">>
<div class="btn padding-top"><<button "Back" $player.info.currentLocation>><</button>></div>
<<else>>
<<set $beachPicnicTargetNpc = _npc>>
<<set $beachPicnicMissingMessage = "Sarah isn't able to make it to the beach right now.">>
<<goto "BeachPicnic_BeginConversation">>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _npc = ($Characters.filter((character) => character.info.questInfo.questCharID == 3)[0])>>
<<if !_npc>>
<<ChatMessage "Amanda is busy for a moment and can't talk.">>
<div class="btn padding-top"><<button "Back" $player.info.currentLocation>><</button>></div>
<<else>>
<<set $beachPicnicTargetNpc = _npc>>
<<set $beachPicnicMissingMessage = "Amanda is busy for a moment and can't talk.">>
<<goto "BeachPicnic_BeginConversation">>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _npc = ($Characters.filter((character) => character.info.questInfo.questCharID == 8)[0])>>
<<if !_npc>>
<<ChatMessage "Alice isn't ready to mingle just yet.">>
<div class="btn padding-top"><<button "Back" $player.info.currentLocation>><</button>></div>
<<else>>
<<set $beachPicnicTargetNpc = _npc>>
<<set $beachPicnicMissingMessage = "Alice isn't ready to mingle just yet.">>
<<goto "BeachPicnic_BeginConversation">>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if !$beachPicnicCurrentNpcId>>
<<ChatMessage "There's no one waiting on the beach right now.">>
<div class="padding-top">
<div class="btn"><<button "Wrap up the picnic">><<goto "BeachPicnic_End">><</button>></div>
</div>
<<else>>
<<set _npc = ($Characters.filter((character) => character.info.id == $beachPicnicCurrentNpcId)[0])>>
<<unset $beachPicnicCurrentNpcId>>
<<if !_npc>>
<<ChatMessage "Your guest seems to have wandered off for now.">>
<div class="btn padding-top"><<button "Wrap up the picnic">><<goto "BeachPicnic_End">><</button>></div>
<<else>>
<<set $beachPicnicTargetNpc = _npc>>
<<set $beachPicnicMissingMessage = "Your guest seems to have wandered off for now.">>
<<goto "BeachPicnic_BeginConversation">>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _npc = $beachPicnicTargetNpc>>
<<set _fallback = $beachPicnicMissingMessage || "No one is ready to talk right now.">>
<<unset $beachPicnicTargetNpc $beachPicnicMissingMessage>>
<<if !_npc>>
<<ChatMessage _fallback>>
<div class="padding-top">
<div class="btn"><<button "Wrap up the picnic">><<goto "BeachPicnic_End">><</button>></div>
</div>
<<else>>
<<set $interactionNpc = _npc>>
<<set $indexNPC = $Characters.indexOf(_npc)>>
<<set $beachPicnicSession = BeachPicnic.startSession(_npc)>>
<<set $beachScore = $beachPicnicSession.score>>
<<goto "BeachPicnic_TopicMenu">>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if !$beachPicnicSession>>
<<goto "BeachPicnic_End">>
<</if>>
<<set _session = $beachPicnicSession>>
<<if _session.npcId != -1 && (!$interactionNpc || $interactionNpc.info.id != _session.npcId)>>
<<set _picnicNpc = ($Characters.filter((character) => character.info.id == _session.npcId)[0])>>
<<if _picnicNpc>>
<<set $interactionNpc = _picnicNpc>>
<<set $indexNPC = $Characters.indexOf(_picnicNpc)>>
<</if>>
<</if>>
<<if typeof $beachScore === 'undefined'>><<set $beachScore = _session.score>><</if>>
<<if $beachPicnicShowIntro>>
<<ChatMessage "You drive to the beach for a relaxing time together.">>
<<unset $beachPicnicShowIntro>>
<</if>>
<<set _topicText = "Round 1 - pick a topic to break the ice with " + _session.npcName + ".">>
<<ChatMessage _topicText>>
<div class="padding-top"><span>Beach points so far: <<print $beachScore>></span></div>
<div class="btn-container padding-top">
<<set _topics = BeachPicnic.getOptions('topics')>>
<<for _topic range _topics>>
<<capture _topic>>
<div class="btn"><<button _topic>><<set $beachPicnicChoice = _topic>><<goto "BeachPicnic_TopicResult">><</button>></div>
<</capture>>
<</for>>
</div>
<div class="padding-top">
<div class="btn"><<button "Wrap up the picnic">><<unset $beachPicnicSession $beachPicnicChoice $beachScore>><<goto "BeachPicnic_End">><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if !$beachPicnicSession || !$beachPicnicChoice>>
<<goto "BeachPicnic_End">>
<</if>>
<<set _session = $beachPicnicSession>>
<<if _session.npcId != -1 && (!$interactionNpc || $interactionNpc.info.id != _session.npcId)>>
<<set _picnicNpc = ($Characters.filter((character) => character.info.id == _session.npcId)[0])>>
<<if _picnicNpc>>
<<set $interactionNpc = _picnicNpc>>
<<set $indexNPC = $Characters.indexOf(_picnicNpc)>>
<</if>>
<</if>>
<<set _choice = $beachPicnicChoice>>
<<set _result = BeachPicnic.evaluateStage('topics', _session, _choice)>>
<<set _session.score += _result.points>>
<<if !_session.history>><<set _session.history = {}>><</if>>
<<set _session.history.topics = {option: _choice, tone: _result.tone, points: _result.points}>>
<<set $beachPicnicSession = _session>>
<<set $beachScore = _session.score>>
<<set _message = BeachPicnic.getStageMessage('topics', _result.tone, _choice, _session.npcName)>>
<<ChatMessage _message>>
<<set _dialogue = BeachPicnic.getStageDialogue('topics', _result.tone, _choice, _session.npcName)>>
<<if _dialogue && _dialogue.length>>
<<ChatMessage _dialogue>>
<</if>>
<<set _pointsText = (_result.points >= 0 ? '+' : '') + _result.points>>
<<set _relations = BeachPicnic.getRelationDelta('topics', _result.tone)>>
<<if _relations.friendship>>
<<IncreaseFriendship $player $interactionNpc _relations.friendship>>
<</if>>
<<if _relations.love>>
<<IncreaseLove $player $interactionNpc _relations.love>>
<</if>>
<<unset $beachPicnicChoice>>
<div class="padding-top">
<div class="btn"><<button "Round 2 - Flirt">><<goto "BeachPicnic_FlirtMenu">><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if !$beachPicnicSession>>
<<goto "BeachPicnic_End">>
<</if>>
<<set _session = $beachPicnicSession>>
<<if _session.npcId != -1 && (!$interactionNpc || $interactionNpc.info.id != _session.npcId)>>
<<set _picnicNpc = ($Characters.filter((character) => character.info.id == _session.npcId)[0])>>
<<if _picnicNpc>>
<<set $interactionNpc = _picnicNpc>>
<<set $indexNPC = $Characters.indexOf(_picnicNpc)>>
<</if>>
<</if>>
<<if typeof $beachScore === 'undefined'>><<set $beachScore = _session.score>><</if>>
<<set _flirtWithText = "Round 2 - choose how to flirt with " + _session.npcName + ".">>
<<ChatMessage _flirtWithText >>
<div class="padding-top"><span>Beach points so far: <<print $beachScore>></span></div>
<div class="btn-container padding-top">
<<set _flirts = BeachPicnic.getOptions('flirt')>>
<<for _flirt range _flirts>>
<<capture _flirt>>
<div class="btn"><<button _flirt>><<set $beachPicnicChoice = _flirt>><<goto "BeachPicnic_FlirtResult">><</button>></div>
<</capture>>
<</for>>
</div>
<div class="padding-top">
<div class="btn"><<button "Wrap up the picnic">><<unset $beachPicnicSession $beachPicnicChoice $beachScore>><<goto "BeachPicnic_End">><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if !$beachPicnicSession || !$beachPicnicChoice>>
<<goto "BeachPicnic_End">>
<</if>>
<<set _session = $beachPicnicSession>>
<<if _session.npcId != -1 && (!$interactionNpc || $interactionNpc.info.id != _session.npcId)>>
<<set _picnicNpc = ($Characters.filter((character) => character.info.id == _session.npcId)[0])>>
<<if _picnicNpc>>
<<set $interactionNpc = _picnicNpc>>
<<set $indexNPC = $Characters.indexOf(_picnicNpc)>>
<</if>>
<</if>>
<<set _choice = $beachPicnicChoice>>
<<set _result = BeachPicnic.evaluateStage('flirt', _session, _choice)>>
<<set _session.score += _result.points>>
<<if !_session.history>><<set _session.history = {}>><</if>>
<<set _session.history.flirt = {option: _choice, tone: _result.tone, points: _result.points}>>
<<set $beachPicnicSession = _session>>
<<set $beachScore = _session.score>>
<<set _message = BeachPicnic.getStageMessage('flirt', _result.tone, _choice, _session.npcName)>>
<<ChatMessage _message>>
<<set _dialogue = BeachPicnic.getStageDialogue('flirt', _result.tone, _choice, _session.npcName)>>
<<if _dialogue && _dialogue.length>>
<<ChatMessage _dialogue>>
<</if>>
<<set _pointsText = (_result.points >= 0 ? '+' : '') + _result.points>>
<<set _relations = BeachPicnic.getRelationDelta('flirt', _result.tone)>>
<<if _relations.friendship>>
<<IncreaseFriendship $player $interactionNpc _relations.friendship>>
<</if>>
<<if _relations.love>>
<<IncreaseLove $player $interactionNpc _relations.love>>
<</if>>
<<unset $beachPicnicChoice>>
<div class="padding-top">
<div class="btn"><<button "Round 3 - Make a move">><<goto "BeachPicnic_ActionMenu">><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if !$beachPicnicSession>>
<<goto "BeachPicnic_End">>
<</if>>
<<set _session = $beachPicnicSession>>
<<if _session.npcId != -1 && (!$interactionNpc || $interactionNpc.info.id != _session.npcId)>>
<<set _picnicNpc = ($Characters.filter((character) => character.info.id == _session.npcId)[0])>>
<<if _picnicNpc>>
<<set $interactionNpc = _picnicNpc>>
<<set $indexNPC = $Characters.indexOf(_picnicNpc)>>
<</if>>
<</if>>
<<if typeof $beachScore === 'undefined'>><<set $beachScore = _session.score>><</if>>
<<set _moveText = "Round 3 - pick a bold move to try with " + _session.npcName + ".">>
<<ChatMessage _moveText>>
<div class="padding-top"><span>Beach points so far: <<print $beachScore>></span></div>
<div class="btn-container padding-top">
<<set _actions = BeachPicnic.getOptions('actions')>>
<<for _action range _actions>>
<<capture _action>>
<<set _chance = BeachPicnic.getActionChance($player, $interactionNpc, $beachPicnicSession, _action)>>
<<set _tone = BeachPicnic.getPreferenceType($beachPicnicSession, 'actions', _action)>>
<<set _toneIcon = (_tone == 'favorite' ? ' ★' : (_tone == 'dislike' ? ' ⚠' : ''))>>
<<set _label = _action + _toneIcon + ' [' + _chance + '%]'>>
<<set _details = BeachPicnic.getActionDetail(_action)>>
<<set _videoPath = BeachPicnic.getActionVideo($player, $interactionNpc, _action)>>
<fieldset class="padding-top beach-action-card">
<legend><<print _label>></legend>
<<if _details>>
<div class="padding-top"><strong>Positive:</strong> <<print _details.positive>></div>
<div class="padding-top"><strong>Negative:</strong> <<print _details.negative>></div>
<</if>>
<<if _videoPath>>
<div class="padding-top"><<Video _videoPath>></div>
<</if>>
<div class="padding-top">
<div class="btn"><<button "Make this move">><<set $beachPicnicChoice = _action>><<goto "BeachPicnic_ActionResult">><</button>></div>
</div>
</fieldset>
<</capture>>
<</for>>
</div>
<div class="padding-top">
<div class="btn"><<button "Wrap up the picnic">><<unset $beachPicnicSession $beachPicnicChoice $beachScore>><<goto "BeachPicnic_End">><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if !$beachPicnicSession || !$beachPicnicChoice>>
<<goto "BeachPicnic_End">>
<</if>>
<<set _session = $beachPicnicSession>>
<<if _session.npcId != -1 && (!$interactionNpc || $interactionNpc.info.id != _session.npcId)>>
<<set _picnicNpc = ($Characters.filter((character) => character.info.id == _session.npcId)[0])>>
<<if _picnicNpc>>
<<set $interactionNpc = _picnicNpc>>
<<set $indexNPC = $Characters.indexOf(_picnicNpc)>>
<</if>>
<</if>>
<<set _action = $beachPicnicChoice>>
<<set _chance = BeachPicnic.getActionChance($player, $interactionNpc, _session, _action)>>
<<set _tone = BeachPicnic.getPreferenceType(_session, 'actions', _action)>>
<<set _success = rollChance(_chance)>>
<<set _message = BeachPicnic.getActionMessage(_action, _tone, _success, _session.npcName)>>
<<ChatMessage _message>>
<<set _description = BeachPicnic.getActionDescription(_action, _success, _session.npcName)>>
<<if _description && _description.length>>
<<ChatMessage _description>>
<</if>>
<<set _relations = BeachPicnic.getActionRelationDelta(_tone, _success)>>
<<if _relations.friendship>>
<<IncreaseFriendship $player $interactionNpc _relations.friendship>>
<</if>>
<<if _relations.love>>
<<IncreaseLove $player $interactionNpc _relations.love>>
<</if>>
<<if _relations.sex>>
<<IncreaseSex $player $interactionNpc _relations.sex>>
<</if>>
<<if _success && _action == "Sex">>
<<unset $beachPicnicSession $beachPicnicChoice $beachScore>>
<<unset $sexType>>
<<goto "ChooseSexType">>
<</if>>
<<unset $beachPicnicChoice>>
<<set $beachPicnicSession = _session>>
<<set $beachScore = _session.score>>
<div class="padding-top">
<div class="btn"><<button "Wrap up the picnic">><<unset $beachPicnicSession $beachScore>><<goto "BeachPicnic_End">><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if $player && $interactionNpc>>
<<set _relationship = $interactionNpc.getRelationship($player.info.id, false)>>
<<if _relationship && _relationship.metrics>>
<<set _metrics = _relationship.metrics>>
<</if>>
<<unset _metrics _relationship>>
<</if>>
<<set _returnLocation = $beachPicnicReturnLocation || $player.info.currentLocation || "Campus">>
<<ChatMessage "You take a final look at the shoreline before packing up your things.">>
<div class="padding-top">
<div class="btn"><<button "Head back">>
<<set $player.info.currentLocation = _returnLocation>>
<<unset $beachPicnicReturnLocation $beachPicnicSession $beachPicnicChoice $beachScore $beachPicnicTargetNpc $beachPicnicMissingMessage $beachPicnicShowIntro $beachPicnicCurrentNpcId $interactionNpc $indexNPC>>
<<goto _returnLocation>>
<</button>></div>
</div>
<</nobr>>/* Hidden cameras (src/scripts/Events/hiddenCameras.ts, window.HiddenCams).
$hiddenCams holds the planted sites; $hiddenCamFeed holds the last check, so
a reload shows the same recording instead of rolling a new one. */
/* _args[0]: site id ("ufg" or "gym"). Shown at the site while a camera is in the bag. */
<<widget "HiddenCamPlantButton">>
<<set _hcSite = _args[0]>>
<<set _hcState = HiddenCams.normalizeHiddenCams($hiddenCams)>>
<<if $player.inventory.hasItem("Hidden Camera") and HiddenCams.canInstallAt(_hcState, _hcSite)>>
<<capture _hcSite>>
<div class="btn"><<button "Plant a hidden camera">>
<<run $player.inventory.removeItem("Hidden Camera", 1)>>
<<set $hiddenCams = HiddenCams.installCamera(HiddenCams.normalizeHiddenCams($hiddenCams), _hcSite, getCurrentAbsoluteDay())>>
<<SpendTime 10>>
<<goto passage()>>
<</button>></div>
<</capture>>
<</if>>
<</widget>>
/* The PC button: checks once a day and opens the recording. */
<<widget "HiddenCamFeedButton">>
<<set _hcState = HiddenCams.normalizeHiddenCams($hiddenCams)>>
<<if HiddenCams.installedSites(_hcState).length gt 0>>
<<if HiddenCams.canCheckFeeds(_hcState, getCurrentAbsoluteDay())>>
<div class="btn"><<button "Hidden camera feeds">>
<<set _hcCheck = HiddenCams.checkFeeds(HiddenCams.normalizeHiddenCams($hiddenCams), getCurrentAbsoluteDay())>>
<<set $hiddenCams = _hcCheck.state>>
<<set $hiddenCamFeed = _hcCheck.result>>
<<goto "HiddenCam_Feed">>
<</button>></div>
<<else>>
<div class="btn non-interacting"><<button "Hidden camera feeds (checked today)">><</button>></div>
<</if>>
<</if>>
<</widget>><<nobr>>
<<include "UpdateAll">>
<<if not $hiddenCamFeed or not $hiddenCamFeed.checked>>
<<goto "ComputerSystem">>
<<else>>
<<set _hcFeed = $hiddenCamFeed>>
<<set _hcLabel = HiddenCams.HIDDEN_CAM_SITES[_hcFeed.site].label>>
<<SpendTime 30>>
<div class="centre-text">Hidden camera feeds</div>
<<set _hcIntro = "You pull up the recordings from the camera in the " + _hcLabel + " and scrub through the day at eight times speed.">>
<<ChatMessage _hcIntro>>
<<if _hcFeed.clips.length is 0>>
<<ChatMessage 'Empty benches, a janitor with a mop, a guy changing his socks. Nothing worth keeping today.'>>
<<else>>
<<if _hcFeed.site is "ufg">>
<<ChatMessage 'There. The fighters drift in after their bouts, strip out of their sweaty gear and forget anyone could be watching.'>>
<<else>>
<<ChatMessage 'There. A woman from the evening class peels off her leggings and sports bra right in front of the lens.'>>
<</if>>
<<EventMedia _hcFeed.clips[0]>>
<<run $player.status.horny.increase(8)>>
<</if>>
<<if _hcFeed.discovered>>
<<set _hcLost = "Halfway through the afternoon the picture shakes, a hand fills the frame and the feed from the " + _hcLabel + " goes black. Somebody found your camera.">>
<<ChatMessage _hcLost>>
<</if>>
<div class="btn-container padding-top">
<<if _hcFeed.clips.length gt 1>>
<div class="btn"><<button "Keep watching" "HiddenCam_Feed_More">><</button>></div>
<</if>>
<<if _hcFeed.clips.length gt 0>>
<<set _hcSellLabel = "Sell the recordings online ($" + HiddenCams.footageValue(_hcFeed.clips.length) + ")">>
<div class="btn"><<button _hcSellLabel>>
<<set _hcPay = HiddenCams.footageValue($hiddenCamFeed.clips.length)>>
<<set $player.money += _hcPay>>
<<if $player.attributes and $player.attributes.corruption and typeof $player.attributes.corruption.increase === "function">><<run $player.attributes.corruption.increase(1)>><</if>>
<<unset $hiddenCamFeed>>
<<goto "ComputerSystem">>
<</button>></div>
<</if>>
<div class="btn"><<button "Close the feeds">><<unset $hiddenCamFeed>><<goto "ComputerSystem">><</button>></div>
</div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if not $hiddenCamFeed or not $hiddenCamFeed.checked or $hiddenCamFeed.clips.length lt 2>>
<<goto "ComputerSystem">>
<<else>>
<<set _hcFeed = $hiddenCamFeed>>
<div class="centre-text">Hidden camera feeds</div>
<<ChatMessage 'You lean closer to the screen and let it play. It only gets better as the day goes on.'>>
<<for _hcClip range _hcFeed.clips.slice(1)>>
<<EventMedia _hcClip>>
<</for>>
<<run $player.status.horny.increase(10)>>
<div class="btn-container padding-top">
<<set _hcSellLabel = "Sell the recordings online ($" + HiddenCams.footageValue(_hcFeed.clips.length) + ")">>
<div class="btn"><<button _hcSellLabel>>
<<set _hcPay = HiddenCams.footageValue($hiddenCamFeed.clips.length)>>
<<set $player.money += _hcPay>>
<<if $player.attributes and $player.attributes.corruption and typeof $player.attributes.corruption.increase === "function">><<run $player.attributes.corruption.increase(1)>><</if>>
<<unset $hiddenCamFeed>>
<<goto "ComputerSystem">>
<</button>></div>
<div class="btn"><<button "Keep them for yourself">><<unset $hiddenCamFeed>><<goto "ComputerSystem">><</button>></div>
</div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if $player.dailyEvents.isEventRegistered($player.info.id, "Library_AfterHoursMakeout")>>
<<goto $player.info.currentLocation>>
<</if>>
<<Video $locationEventType>>
<<ChatMessage 'Two students have tucked themselves into the back reading nook - hands under each other\'s shirts, textbook abandoned. They do not notice you drifting past.'>>
<div class="btn-container padding-top">
<div class="btn"><<button "Pretend you didn\'t see" $player.info.currentLocation>>
<<run $player.status.horny.increase(2)>>
<<run $player.dailyEvents.registerEvent($player.info.id, "Library_AfterHoursMakeout", 1)>>
<<unset $locationEventType>>
<</button>></div>
<div class="btn"><<button "Watch from the aisle" $player.info.currentLocation>>
<<run $player.status.horny.increase(10)>>
<<if $player.attributes && $player.attributes.corruption && typeof $player.attributes.corruption.increase === 'function'>>
<<run $player.attributes.corruption.increase(0.8)>>
<</if>>
<<ChatMessage 'You stay behind the shelf until one of them moans too loud and the other covers their mouth. Then you slip out.'>>
<<run $player.dailyEvents.registerEvent($player.info.id, "Library_AfterHoursMakeout", 1)>>
<<unset $locationEventType>>
<</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if !$player.attributes || !$player.attributes.corruption || $player.attributes.corruption.value < 40>>
<<ChatMessage 'The diner\'s back hallway is quiet. You are not that desperate.'>>
<div class="btn padding-top"><div class="btn"><<button "Back" "Diner">><</button>></div></div>
<<elseif $player.status.energy.value < 20>>
<<ChatMessage 'You are too tired to even consider it.'>>
<div class="btn padding-top"><div class="btn"><<button "Back" "Diner">><</button>></div></div>
<<else>>
<<SpendTime 20>>
<<SpendEnergy $player 20>>
/* The prose is the player working the trucker over - an oral clip, not the
solo JerkOff pool (a solo female clip read as a different scene entirely). */
<<set _pg = $player.gender()>>
<<SetOralPick "Male" _pg>>
<<set _tip = Random(15, 45)>>
<<set $player.money += _tip>>
<<if CheckContentFilter('Male') && _pick>><<Video _pick>><</if>>
<<set _cm = 'A trucker leans against the sink, buckle already open. You are quick and quiet. He slips you $' + _tip + ' and a nod, and the door closes behind him.'>>
<<ChatMessage _cm>>
<<if typeof $player.attributes.corruption.increase === 'function'>>
<<run $player.attributes.corruption.increase(2)>>
<</if>>
<<run $player.status.horny.decrease(20)>>
<<run $player.characterEvents.registerEvent($player.info.id, "Diner_BathroomTip", 1)>>
<div class="btn padding-top"><div class="btn"><<button "Back" "Diner">><</button>></div></div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if !$player.attributes || !$player.attributes.corruption || $player.attributes.corruption.value < 35>>
<<ChatMessage 'You walk past the loading dock without slowing.'>>
<div class="btn padding-top"><div class="btn"><<button "Back" "SR_SkidRow">><</button>></div></div>
<<elseif $player.status.energy.value < 15>>
<<ChatMessage 'You are too tired to even consider it.'>>
<div class="btn padding-top"><div class="btn"><<button "Back" "SR_SkidRow">><</button>></div></div>
<<else>>
<<SpendTime 15>>
<<SpendEnergy $player 15>>
<<if $player.gender() == "Male">>
<<set _pick = 'Media\\Sex\\Oral\\Male\\Female\\' + Random(0, 12, false) + '.mp4'>>
<<set _flavor = 'She is already leaning against the crates when you show. You kneel and get to work. When she finishes she drops $'>>
<<else>>
<<set _pick = 'Media\\Sex\\Titfuck\\Female\\Male\\' + Random(0, 5, false) + '.mp4'>>
<<set _flavor = 'He just wants a minute between your tits. You oblige. When he is done he peels off $'>>
<</if>>
<<set _tip = Random(30, 70)>>
<<set $player.money += _tip>>
<<Video _pick>>
<<set _cm = _flavor + _tip + ' and walks off without another word.'>>
<<ChatMessage _cm>>
<<if typeof $player.attributes.corruption.increase === 'function'>>
<<run $player.attributes.corruption.increase(2)>>
<</if>>
<<run $player.status.horny.increase(8)>>
<<run $player.characterEvents.registerEvent($player.info.id, "SkidRow_AlleyTitfuckTip", 1)>>
<div class="btn padding-top"><div class="btn"><<button "Back" "SR_SkidRow">><</button>></div></div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/Neighborhood/OakStreet/PlayerHome/LivingRoom.jpg">>
<<SpendTime 60>>
<div class="centre-text">Maid service</div>
<<ChatMessage 'The agency sends a girl in a black French maid dress so short that the white frills of her petticoat barely cover her ass, with stockings and garters underneath. She gets to work on the living room without a word.'>>
<<EventMedia `EventMedia.MAID_CLIPS[0]`>>
<<ChatMessage 'She takes her time with the low shelves, bending all the way over with her legs straight, and every time she does you get a clear view of the bare cheeks of her ass and the thin strip of her panties. She catches you looking over her shoulder and keeps dusting the same spot.'>>
<<EventMedia `EventMedia.MAID_CLIPS[1]`>>
<<run $player.status.horny.increase(8)>>
<<ChatWithoutNPC 'Maid' "Media\\Characters\\QuestChars\\Other\\female_unknown.jpg" 'All done. The agency does not have to know if I stay another half hour. One hundred and twenty, cash.'>>
<div class="btn-container padding-top">
<<if $player.money gte 120 and CheckContentFilter('Female')>>
<div class="btn"><<button "Pay her to stay ($120)">><<set $player.money -= 120>><<goto "PlayerHome_MaidService_Extra">><</button>></div>
<<else>>
<div class="btn non-interacting"><<button "Pay her to stay ($120)">><</button>></div>
<</if>>
<div class="btn"><<button "Thank her and see her out" "Living_Room_PHome">><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/Neighborhood/OakStreet/PlayerHome/LivingRoom.jpg">>
<<SpendTime 30>>
<div class="centre-text">Overtime</div>
<<if $player.gender() is "Female">>
<<ChatMessage 'She kneels on the rug in her uniform, pushes your legs apart and licks your pussy, her frilly cap bobbing while she sucks your clit until you cum on her face.'>>
<<SetOralPick "Female" "Female">>
<<elseif $player.gender() is "Shemale">>
<<ChatMessage 'She kneels on the rug in her uniform, pulls your skirt up and sucks your cock with her stockinged knees spread, until you cum in her mouth and she swallows it like part of the job.'>>
<<SetOralPick "Shemale" "Female">>
<<else>>
<<ChatMessage 'She kneels on the rug in her uniform, unzips you and sucks your cock with her ass sticking up behind her, petticoat flipped over her back, until you cum in her mouth.'>>
<<SetOralPick "Male" "Female">>
<</if>>
<<if CheckContentFilter('Female')>><<Video _pick>><</if>>
<<run $player.status.horny.value = $player.status.horny.min>>
<<if $player.attributes and $player.attributes.corruption and typeof $player.attributes.corruption.increase === "function">><<run $player.attributes.corruption.increase(0.5)>><</if>>
<<ChatMessage 'She straightens her apron, pockets the cash and lets herself out.'>>
<div class="btn padding-top"><<button "Back to the living room" "Living_Room_PHome">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if $player.dailyEvents.isEventRegistered($player.info.id, "Mall_ChangingRoomPeek")>>
<<goto "ClothingStore">>
<</if>>
<<if !$player.attributes || !$player.attributes.corruption || $player.attributes.corruption.value < 30>>
<<ChatMessage 'You pull the curtain shut and try things on without incident.'>>
<div class="btn padding-top"><div class="btn"><<button "Back" "ClothingStore">><</button>></div></div>
<<else>>
<<if $player.gender() == "Female">>
<<Video "Media\\Interactions\\Touch boobs\\Female\\Female\\0.webm">>
<<ChatMessage 'You step into the stall half-undressed. A woman two curtains over slips in behind you by mistake - then does not leave. Her hand finds your bra strap before you have decided whether to protest.'>>
<<else>>
<<Video `EventMedia.pickClip(EventMedia.CHANGING_ROOM_PEEK_CLIPS)`>>
<<ChatMessage 'The partitions do not reach the ceiling. One curtain over, a woman is peeling her shorts off to try on lingerie, her bare ass toward the gap. You are staring and she has not noticed.'>>
<</if>>
<div class="btn-container padding-top">
<div class="btn"><<button "Pull back" "ClothingStore">>
<<run $player.status.horny.increase(4)>>
<<run $player.dailyEvents.registerEvent($player.info.id, "Mall_ChangingRoomPeek", 1)>>
<</button>></div>
<div class="btn"><<button "Keep going" "ClothingStore">>
<<run $player.status.horny.increase(15)>>
<<if $player.attributes && $player.attributes.corruption && typeof $player.attributes.corruption.increase === 'function'>>
<<run $player.attributes.corruption.increase(1.5)>>
<</if>>
<<SpendTime 10>>
<<if $player.gender() == "Female">>
<<ChatMessage 'Neither of you says anything. When it is over she smooths her blouse, winks, and is gone by the time you step back out.'>>
<<else>>
<<ChatMessage 'You stay until she catches you, holds your gaze for a second longer than necessary, and slowly draws her curtain. You leave the floor before she finishes.'>>
<</if>>
<<run $player.dailyEvents.registerEvent($player.info.id, "Mall_ChangingRoomPeek", 1)>>
<</button>></div>
</div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if !$player.attributes || !$player.attributes.corruption || $player.attributes.corruption.value < 60>>
<<ChatMessage 'A flyer is taped to the inside of the door - "private training, cash paid, bring nothing". You tear it down and bin it.'>>
<div class="btn padding-top"><div class="btn"><<button "Back" "SR_Motel_Room">><</button>></div></div>
<<elseif $player.status.energy.value < 30>>
<<ChatMessage 'You are in no state to go through with a session like that.'>>
<div class="btn padding-top"><div class="btn"><<button "Back" "SR_Motel_Room">><</button>></div></div>
<<else>>
<<SpendTime 60>>
<<SpendEnergy $player 30>>
<<set _stage = ["Tie up", "Play with a leash", "Lick feet"]>>
<<set _pickStage = _stage[Random(0, _stage.length - 1)]>>
<<set _singleParticipantClip = _pickStage == "Tie up">>
<<set _fee = Random(120, 220)>>
<<set $player.money += _fee>>
<<DominateTrainingShowVideo "Male" $player.gender() _pickStage true true _singleParticipantClip>>
<<set _cm = 'The client is older and takes the leash out of their bag before saying hello. An hour later you are on your knees, in cuffs, counting bills: $' + _fee + '.'>>
<<ChatMessage _cm>>
<<if typeof $player.attributes.corruption.increase === 'function'>>
<<run $player.attributes.corruption.increase(4)>>
<</if>>
<<run $player.status.horny.decrease($player.status.horny.max)>>
<<run $player.characterEvents.registerEvent($player.info.id, "SR_MotelRoom_DomSession_Seen", 1)>>
<<run $player.dailyEvents.registerEvent($player.info.id, "SR_MotelRoom_DomSession", 1)>>
<div class="btn padding-top"><div class="btn"><<button "Back" "SR_Motel_Room">><</button>></div></div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set $drinkGame = {success: 0, arousal: 20}>>
<<include "NightClub_DrinkGame_CreateNPC">>
<<include "NightClub_DrinkGame_CreateNPCName">>
<<set $interactionNpc.status.alcoholIntoxication.increase(Random(0,25))>>
<<set $drinkGame.arousal = (Random(1,20))>>
<<ShowNpcIcon $interactionNpc>>
<<ChatMessage _interactionNpcName>>
<div class="btn padding-top"><<button "Approach" "NightClub_DrinkGame_ApproachToNPC">><</button>></div>
<div class="btn padding-top"><<button "Look for someone else" "NightClub_DrinkGame_Start">><<DeleteCharacter $interactionNpc>><<SpendTimeWithoutUpdate 20>><</button>></div>
<div class="btn padding-top"><<button "Leave" $player.info.currentLocation>><<include "NightClub_DrinkGame_Leave">><</button>></div>
/* <div class="btn padding-top"><<button "Sex (Debug)" "ChooseSexType">><</button>></div> */
<</nobr>><<nobr>>
<<SpendTimeWithoutUpdate 5>>
<<include "UpdateAll">>
<<done>>
<<include "NightClub_DrinkGame_CheckDrunk">>
<<include "NightClub_DrinkGame_TimeCheck">>
<<include "NightClub_DrinkGame_ArouselCheck">>
<</done>>
<<ShowNpcIcon $interactionNpc>>
<<run $drinkGame.arousal = clamp($drinkGame.arousal)>>
<<run _pronounHimHer = $interactionNpc.pronounHimHer().toLowerCase()>>
<<run _pronounHisHer = $interactionNpc.pronounHisHer().toLowerCase()>>
<<set _chanceOfSuccess = $drinkGame.arousal>>
<br>
<<include "NightClub_DrinkGame_DrunkBar">>
<<include "NightClub_DrinkGame_ArousalBar">>
<<if $player.money >= 50>>
<div class="btn padding-top"><<button "Have a drink together ($50)" "NightClub_DrinkGame_DrinkTogether">><</button>></div>
<<else>>
<div class="btn padding-top non-interacting"><<button "Have a drink together ($50)">><</button>></div>
<</if>>
<div class="btn padding-top"><<button "Flirty Behavior" "NightClub_DrinkGame_Flirty_Behavior">><</button>></div>
<<if $player.dailyEvents.isEventRegistered($player.info.id, "RentAMotelRoom") == false>>
<<if $player.money >= 100>>
<div class="btn padding-top"><<button "Suggest going to a motel ($100)" "CalculateAccessChance">>
<<run $player.dailyEvents.registerEvent($player.info.id, "RentAMotelRoom", 1)>>
<<set $player.money -= 100>>
<</button>></div>
<<else>>
<div class="btn non-interacting"><<button "Suggest going to a motel ($100)">><</button>></div>
<</if>>
<<else>>
<div class="btn padding-top"><<button "Suggest going to a motel" "CalculateAccessChance">><</button>></div>
<</if>>
<div class="btn padding-top"><<button "Say goodbye" $player.info.currentLocation>><<include "NightClub_DrinkGame_Leave">><</button>></div>
<div class="btn padding-top"><<button "Info">><<include "NightClub_DrinkGame_Info">><</button>></div>
/* <div class="btn padding-top"><<button "Suggest going to the restroom" "CalculateAccessChance">><<set $NCSexLocation = "restroom">><</button>></div> */
/* <div class="btn padding-top"><<button "Sex (Debug)" "ChooseSexType">><</button>></div> */
<</nobr>><<nobr>>
<<run Dialog.create("Info")>>
<<run Dialog.wiki("In this mini-game, your goal is to maximize the Lust meter. A higher Lust level increases the chances that the NPC will agree to accompany you to the motel. You can influence this by getting the NPC drunk; the more intoxicated they are, the better your chances. However, be cautious: if either your or the NPC’s drunkenness meter maxes out, it will result in vomiting. If the Lust meter depletes to zero, the NPC will depart. Additionally, you have the option to spike the NPC’s drink, but if you’re detected, you’ll be ejected from the club.")>>
<<run Dialog.open();>>
<</nobr>><<nobr>>
<div class="leftbar-menu-attribute" style="width:300px; margin-left: auto; margin-right: auto;">
<span class="leftbar-menu-attribute-name"><<print $interactionNpc.info.firstName>>'s Drunk Level</span>
<div class="leftbar-menu-progress-bar">
<div class="leftbar-menu-progress-fill" id="npc-drunkenness-bar"></div>
</div>
</div>
<<done>>
<<set _npcIntoxication = $interactionNpc.status.alcoholIntoxication>>
<<run UpdateProgressBar("npc-drunkenness-bar", _npcIntoxication.value, _npcIntoxication.max)>>
<<if _npcIntoxication.value > 80>>
<<addclass "#npc-drunkenness-bar" "leftbar-menu-red">>
<<elseif _npcIntoxication.value > 50 && _npcIntoxication.value <= 80>>
<<addclass "#npc-drunkenness-bar" "leftbar-menu-yellow">>
<<elseif _npcIntoxication.value <= 50>>
<<addclass "#npc-drunkenness-bar" "leftbar-menu-green">>
<</if>>
<</done>>
<</nobr>><<nobr>>
<div class="leftbar-menu-attribute" style="width:300px; margin-left: auto; margin-right: auto;">
<span class="leftbar-menu-attribute-name"><<print $interactionNpc.info.firstName>>'s Arousal Level</span>
<div class="leftbar-menu-progress-bar">
<div class="leftbar-menu-progress-fill" id="npc-arousal-bar"></div>
</div>
</div>
<<done>>
<<set _npcIntoxication = $interactionNpc.status.alcoholIntoxication>>
<<run UpdateProgressBar("npc-arousal-bar", clamp($drinkGame.arousal), 100)>>
<</done>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<set $player.money -= 50>>
<<set $player.status.alcoholIntoxication.increase(Random(8,15))>>
<<set $interactionNpc.status.alcoholIntoxication.increase(Random(8,15))>>
<<ChatMessage 'You both take a shot together.'>>
<div class="btn padding-top"><<button "Spike the drink with a drug" "GiveItems">>
<<set $filterType = "Drug">>
<<set $source = "SpikeDrink_NightClub">>
<</button>></div>
<div class="btn padding-top"><<button "Continue" "NightClub_DrinkGame_ApproachToNPC">><</button>></div>
<</nobr>><<nobr>>
<<if $player.status.alcoholIntoxication.value == $player.status.alcoholIntoxication.max>>
<<goto "Nightclub_Puke_Player">>
<<elseif $interactionNpc.status.alcoholIntoxication.value == $interactionNpc.status.alcoholIntoxication.max>>
<<goto "Nightclub_Puke_NPC">>
<</if>>
<</nobr>><<nobr>>
<<include "CharactersData">>
<<run _nightclubVisitor = CreateCharacter({
isPlayer: false,
characterWork: "Citizen",
sexualPreference: "Bi",
age: Random(18, 30),
}, true)>>
<<set $indexNPC = $Characters.indexOf(_nightclubVisitor)>>
<<set $interactionNpc = $Characters[$indexNPC]>>
<<run $interactionNpc.characterEvents.registerEvent($interactionNpc.info.id, "NightclubVisitor", 1)>>
<<unset $maleNames $femaleNames $surnames>>
<</nobr>><<nobr>>
<<DeleteCharacter $interactionNpc>>
<</nobr>><<nobr>>
<<set _gender = $interactionNpc.gender()>>
<<switch _gender>>
<<case "Female">>
<<if $interactionNpc.getAgeText() == "Young">>
<<set _gender = "girl">>
<<else>>
<<set _gender = "woman">>
<</if>>
<<case "Male">>
<<set _gender = "man">>
<<case "Shemale">>
<<if $interactionNpc.getAgeText() == "Young">>
<<set _gender = "shemale">>
<<else>>
<<set _gender = "shemale">>
<</if>>
<</switch>>
<<set _interactionNpcName = "You notice a " + $interactionNpc.getFatText() + " " + ($interactionNpc.info.skin.toLowerCase()) + " " + _gender>>
<</nobr>><<nobr>>
<<SpendTimeWithoutUpdate 20>>
<<DeleteCharacter $interactionNpc>>
<<set $gameSettings.allowSaves = true>>
<<set $canShowStatsBtn = true>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<run _pronoun = $interactionNpc.pronoun().toLowerCase()>>
<<run _pronounHisHer = $interactionNpc.pronounHisHer().toLowerCase()>>
<<run _pronounHimHer = $interactionNpc.pronounHimHer().toLowerCase()>>
<<if rollChance(70)>>
<<set _result = true>>
<<run $interactionNpc.useItem($item, $player)>>
<<else>>
<<set _result = false>>
<</if>>
<<ShowNpcIcon $interactionNpc>>
<<set _npcName = $interactionNpc.info.firstName>>
<<set _calmBtnText = "Try to calm " + _pronounHimHer + " down">>
<<set _spikeMsg = "You spike " + _npcName + "'s drink with a drug.">>
<<ChatMessage _spikeMsg>>
<<run $player.inventory.removeItem($item.name, 1)>>
<<if _result == true>>
<<if $item.name == "Sex change pills (Male)" && $interactionNpc.gender() != "Male">>
<<Chat $interactionNpc 'What the fuck happened to me? Why did I turn into a man?'>>
<<elseif $item.name == "Sex change pills (Female)" && $interactionNpc.gender() != "Female">>
<<Chat $interactionNpc 'What the fuck happened to me? Why did I turn into a woman?'>>
<<else>>
<<set _noticeMsg = _npcName + " doesn't notice anything and continues drinking.">>
<<ChatMessage _noticeMsg>>
<</if>>
<div class="btn padding-top"><<button _calmBtnText "SpikeDrink_NightClub_TryingToCalm">> <<unset $item $filterType>><</button>></div>
<div class="btn padding-top"><<button "Leave" $player.info.currentLocation>><<include "NightClub_DrinkGame_Leave">> <<unset $item $filterType>><</button>></div>
<<else>>
<<set _angryMsg = _npcName + " notices you trying to spike " + _pronounHisHer + " drink and gets angry at you.">>
<<ChatMessage _angryMsg>>
<<set _kickedMsg = _npcName + " calls over the bouncers and they kick you out of the club.">>
<<ChatMessage _kickedMsg>>
<<set $player.info.currentLocation = "RedLightDistrict">>
<div class="btn padding-top"><<button "Leave" $player.info.currentLocation>><<include "NightClub_DrinkGame_Leave">> <<unset $item $filterType>><</button>></div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<run _pronounHimHer = $interactionNpc.pronounHimHer().toLowerCase()>>
<<run _pronounHeShe = $interactionNpc.pronoun().toLowerCase()>>
<<if rollChance(70)>>
<<set _calmSuccessMsg = "You successfully calmed " + _pronounHimHer + " down.">>
<<ChatMessage _calmSuccessMsg>>
<div class="padding-top">
<div class="btn"><<button "Continue" "NightClub_DrinkGame_ApproachToNPC">><</button>></div>
</div>
<<else>>
<<set _calmFailMsg = "You failed to calm " + _pronounHimHer + " down.">>
<<ChatMessage _calmFailMsg>>
<<set _kickMsg = $interactionNpc.info.firstName + " calls over the bouncers and they kick you out of the club.">>
<<ChatMessage _kickMsg>>
<<set $player.info.currentLocation = "RedLightDistrict">>
<div class="btn padding-top"><<button "Continue" $player.info.currentLocation>><<include "NightClub_DrinkGame_Leave">><</button>></div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<run _pronounHeShe = $interactionNpc.pronoun()>>
<<if rollChance(clamp($drinkGame.arousal * 10))>>
<<Chat $interactionNpc 'Alright, let\'s go.'>>
<div class="padding-top">
<div class="btn"><<button "Continue" "ChooseSexType">>
<<set $sexType = "nightclub_sex">>
<<run $player.info.currentLocation = "SR_Motel_Room">>
<<SetBackground "Media/Locations/City/SkidRow/Motel/Room.jpg">>
<</button>></div>
</div>
<<else>>
<<set _refuseMsg = _pronounHeShe + " refuses and leaves.">>
<<ChatMessage _refuseMsg>>
<div class="btn padding-top"><<button "Continue" $player.info.currentLocation>><<include "NightClub_DrinkGame_Leave">><</button>></div>
<</if>>
/* <<ChatMessage 'They refuse to go to motel when they find out you live with your aunt.'>>
<<ChatMessage 'They turn you down.'>>
<<ChatMessage 'You head to the bathroom restroom.'>> */
<</nobr>><<nobr>>
<<run _pronounHimHer = $interactionNpc.pronounHimHer().toLowerCase()>>
<<run _pronounHisHer = $interactionNpc.pronounHisHer().toLowerCase()>>
<<run _pronounHeShe = $interactionNpc.pronoun().toLowerCase()>>
<<run _pronounHeSheNoLower = $interactionNpc.pronoun()>>
<</nobr>><<nobr>>
<<if $dateTime.hours < 18 && $dateTime.hours >= 6>>
<<goto "NightClub_DrinkGame_TimeEnd">>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ChatMessage 'The club party is ending'>>
<<if $interactionNpc != undefined>>
<<DeleteCharacter $interactionNpc>>
<</if>>
<div class="padding-top">
<div class="btn"><<button "Continue" $player.info.currentLocation>>
<<set $gameSettings.allowSaves = true>>
<<set $canShowStatsBtn = true>>
<</button>></div>
</div>
<</nobr>><<nobr>>
<<if $drinkGame.arousal <= 0>>
<<goto "NightClub_DrinkGame_Arousel_End">>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "GetPronouns_DrinkGame">>
<<set _loseInterestMsg = _pronounHeSheNoLower + " loses interest and walks away.">>
<<ChatMessage _loseInterestMsg>>
<<if $interactionNpc != undefined>>
<<DeleteCharacter $interactionNpc>>
<</if>>
<div class="padding-top">
<div class="btn"><<button "Continue" $player.info.currentLocation>>
<<set $gameSettings.allowSaves = true>>
<<set $canShowStatsBtn = true>>
<</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set $gameSettings.allowSaves = false>>
<<set $canShowStatsBtn = false>>
<<Video "Media\\Events\\Nightclub\\party.mp4">>
<div class="btn padding-top"><<button "Find someone" "NightClub_DrinkGame_Start">><</button>></div>
<<if $player.money >= 25>>
<div class="btn padding-top"><<button "Drink ($25)" "Night_Club_Events_Drink">><</button>></div>
<<else>>
<div class="btn padding-top non-interacting"><<button "Drink ($25)">><</button>></div>
<</if>>
<div class="btn padding-top"><<button "Back" $player.info.currentLocation>>
<<set $gameSettings.allowSaves = true>>
<<set $canShowStatsBtn = true>>
<</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ChatMessage 'You go to the bar and have a shot'>>
<<set $player.money -= 25>>
<<set $player.status.alcoholIntoxication.increase(Random(8,15))>>
<<SpendTime 15>>
<div class="btn padding-top"><<button "Continue" "Night_Club_Events">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<run _pronounHimHer = $interactionNpc.pronounHimHer().toLowerCase()>>
<<run _pronounHisHer = $interactionNpc.pronounHisHer().toLowerCase()>>
<<run $drinkGame.arousal = clamp($drinkGame.arousal)>>
<<set _chanceOfSuccess = clamp($drinkGame.arousal)>>
<br>
<<include "NightClub_DrinkGame_DrunkBar">>
<<include "NightClub_DrinkGame_ArousalBar">>
<<done>>
<<include "NightClub_DrinkGame_CheckDrunk">>
<<include "NightClub_DrinkGame_TimeCheck">>
<<include "NightClub_DrinkGame_ArouselCheck">>
<</done>>
<<set _grabButtBtnText = "Grab " + _pronounHisHer + " butt">>
<div class="btn-container padding-top">
<div class="btn"><<button "Flirt" "NightClub_DrinkGame_Flirt">><</button>></div>
<div class="btn"><<button _grabButtBtnText "NightClub_DrinkGame_Butt">><</button>></div>
<<if $interactionNpc.gender() != "Male">>
<<set _touchBreastBtnText = "Touch " + _pronounHisHer + " breast">>
<div class="btn"><<button _touchBreastBtnText "NightClub_DrinkGame_Breast">><</button>></div>
<</if>>
<div class="btn"><<button "Kiss" "NightClub_DrinkGame_Kiss">><</button>></div>
</div>
<div class="btn padding-top"><<button "Back" "NightClub_DrinkGame_ApproachToNPC">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "GetPronouns_DrinkGame">>
<<set _npcIntoxication = $interactionNpc.status.alcoholIntoxication.value>>
<<if rollChance(clamp((($drinkGame.arousal * 0.3) +(_npcIntoxication * 0.3))))>>
<<set $drinkGame.arousal += 10>>
<<set _flirtSuccessMsg = "You're flirting with " + _pronounHimHer + ", and " + _pronounHeShe + " smiles back, flirting in return.">>
<<ChatMessage _flirtSuccessMsg>>
<<else>>
<<set $drinkGame.arousal -= 8>>
<<set _flirtFailMsg = "You try to flirt with " + _pronounHimHer + ", but " + _pronounHeShe + " frowns and looks away.">>
<<ChatMessage _flirtFailMsg>>
<</if>>
<div class="padding-top">
<div class="btn"><<button "Continue" "NightClub_DrinkGame_Flirty_Behavior">><<SpendTimeWithoutUpdate 5>><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "GetPronouns_DrinkGame">>
<<set _npcIntoxication = $interactionNpc.status.alcoholIntoxication.value>>
<<if rollChance(clamp((($drinkGame.arousal * 0.5) +(_npcIntoxication * 0.5))))>>
<<set $drinkGame.arousal += 20>>
<<set _buttSuccessMsg = "The bass thumps through the club as you daringly reach out and touch " + _pronounHimHer + " butt. " + _pronounHeSheNoLower + " spins around, the strobe lights catching " + _pronounHimHer + " playful smirk.">>
<<ChatMessage _buttSuccessMsg>>
<<Chat $interactionNpc 'Hey, you, if you’re gonna do that, at least buy me a drink first.'>>
<<set _buttInviteMsg = _pronounHeSheNoLower + " steps closer, " + _pronounHimHer + " body swaying to the rhythm, clearly inviting more interaction.">>
<<ChatMessage _buttInviteMsg>>
<<else>>
<<set $drinkGame.arousal -= 15>>
<<set _buttFailMsg = "Amidst the pulsing lights and loud music, you try to touch " + _pronounHimHer + " butt, but " + _pronounHeShe + " immediately swats your hand away.">>
<<ChatMessage _buttFailMsg>>
<<Chat $interactionNpc 'What the hell, dude? Keep your hands to yourself.'>>
<</if>>
<div class="padding-top">
<div class="btn"><<button "Continue" "NightClub_DrinkGame_Flirty_Behavior">><<SpendTimeWithoutUpdate 5>><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "GetPronouns_DrinkGame">>
<<set _npcIntoxication = $interactionNpc.status.alcoholIntoxication.value>>
<<if rollChance(clamp((($drinkGame.arousal * 0.6) +(_npcIntoxication * 0.6))))>>
<<set $drinkGame.arousal += 20>>
<<set _breastSuccessMsg = "In the dimly lit corner of the club, you place your hand on " + _pronounHisHer + " chest. " + _pronounHeSheNoLower + " looks up at you, " + _pronounHisHer + " eyes twinkling with amusement.">>
<<ChatMessage _breastSuccessMsg>>
<<Chat $interactionNpc 'You’re quite forward, aren’t you?'>>
<<set _breastPurrMsg = _pronounHeSheNoLower + " purrs, not resisting.">>
<<ChatMessage _breastPurrMsg>>
<<Chat $interactionNpc 'I don’t usually let strangers do that, but maybe you’re an exception'>>
<<set _breastLeanMsg = _pronounHeSheNoLower + " leans into you, " + _pronounHisHer + " perfume intoxicating.">>
<<ChatMessage _breastLeanMsg>>
<<else>>
<<set $drinkGame.arousal -= 20>>
<<set _breastFailMsg = "The club is packed, and as you reach out to touch " + _pronounHisHer + " chest, " + _pronounHeShe + " grabs your arm firmly.">>
<<ChatMessage _breastFailMsg>>
<<Chat $interactionNpc 'Hey! What do you think you’re doing?'>>
<</if>>
<div class="padding-top">
<div class="btn"><<button "Continue" "NightClub_DrinkGame_Flirty_Behavior">><<SpendTimeWithoutUpdate 5>><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "GetPronouns_DrinkGame">>
<<set _npcIntoxication = $interactionNpc.status.alcoholIntoxication.value>>
<<if rollChance(clamp((($drinkGame.arousal * 0.7) +(_npcIntoxication * 0.7))))>>
<<set $drinkGame.arousal += 30>>
<<set _kissSuccessMsg = "You lean in for a kiss. " + _pronounHeSheNoLower + " meets you halfway, " + _pronounHimHer + " lips warm against yours. When you part, " + _pronounHeShe + " grins.">>
<<ChatMessage _kissSuccessMsg>>
<<else>>
<<set $drinkGame.arousal -= 25>>
<<set _kissFailMsg = "Just as you go for the kiss, the lights flash brightly, and " + _pronounHeShe + " pulls back, laughing awkwardly.">>
<<ChatMessage _kissFailMsg>>
<<Chat $interactionNpc 'Whoa, not so fast, let’s not rush things. How about we grab a drink instead?'>>
<</if>>
<div class="padding-top">
<div class="btn"><<button "Continue" "NightClub_DrinkGame_Flirty_Behavior">><<SpendTimeWithoutUpdate 5>><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if $player.gender() == "Male">>
<<set _threwPic = "Media\\Events\\Nightclub\\ThrewUp_Restroom_M.jpg">>
<<else>>
<<set _threwPic = "Media\\Events\\Nightclub\\ThrewUp_Restroom_F.jpg">>
<</if>>
<<set $player.status.alcoholIntoxication.decrease(20)>>
<<SpendEnergy $player 50>>
<<SpendTimeWithoutUpdate 240>>
<img class="chat-image" @src="_threwPic" alt="Avatar">
<<ChatMessage 'You drank too much and threw up.'>>
<div class="btn padding-top"><<button "Continue" $player.info.currentLocation>><<include "NightClub_DrinkGame_Leave">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if $interactionNpc.gender() == "Male">>
<<set _threwPic = "Media\\Events\\Nightclub\\ThrewUp_Restroom_M.jpg">>
<<else>>
<<set _threwPic = "Media\\Events\\Nightclub\\ThrewUp_Restroom_F.jpg">>
<</if>>
<img class="chat-image" @src="_threwPic" alt="Avatar">
<<set _cm = $interactionNpc.info.firstName + ' drank too much and threw up'>>
<<ChatMessage _cm>>
<div class="btn padding-top"><<button "Continue" $player.info.currentLocation>><<include "NightClub_DrinkGame_Leave">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if $player.dailyEvents.isEventRegistered($player.info.id, "ClubRestroom_Quickie")>>
<<goto $player.info.currentLocation>>
<</if>>
<<if $dateTime.hours < 22 && $dateTime.hours >= 5>>
<<goto $player.info.currentLocation>>
<</if>>
<<if !$player.status || !$player.status.horny || $player.status.horny.value < 70>>
<<goto $player.info.currentLocation>>
<</if>>
<<set _loc = $player.info.currentLocation>>
<<set _candidates = $Characters.filter(c => !c.info.isPlayer && c.info.currentLocation == _loc && CheckContentFilter(c))>>
<<if _candidates.length == 0>>
<<ChatMessage 'You scan the restroom. Nobody you would even consider.'>>
<div class="btn padding-top"><div class="btn"><<button "Leave" _loc>>
<<run $player.dailyEvents.registerEvent($player.info.id, "ClubRestroom_Quickie", 1)>>
<</button>></div></div>
<<else>>
<<set $interactionNpc = _candidates[Random(0, _candidates.length - 1)]>>
<<set $indexNPC = $Characters.indexOf($interactionNpc)>>
<<Video "Media\\Interactions\\Kiss\\Female\\Male\\0.webm">>
<<ChatMessage 'Someone pushes into the stall after you. A hand on your hip, breath on your neck. No words - just a question in their eyes.'>>
<div class="btn-container padding-top">
<div class="btn"><<button "Not tonight" _loc>>
<<run $player.dailyEvents.registerEvent($player.info.id, "ClubRestroom_Quickie", 1)>>
<</button>></div>
<div class="btn"><<button "Pull them in" "Sex">>
<<unset $sexType>>
<<set $cuni = false>>
<<set $passiveSex = false>>
<<LockSettings>>
<<run $player.dailyEvents.registerEvent($player.info.id, "ClubRestroom_Quickie", 1)>>
<</button>></div>
</div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if !$player.attributes || !$player.attributes.corruption || $player.attributes.corruption.value < 40>>
<<ChatMessage 'You wash your hands and leave. Whatever rumor this restroom has is not for you.'>>
<div class="btn padding-top"><div class="btn"><<button "Back" "BC_Restroom">><</button>></div></div>
<<elseif $dateTime.hours < 9 || $dateTime.hours >= 17>>
<<ChatMessage 'The floor is empty. Business hours only.'>>
<div class="btn padding-top"><div class="btn"><<button "Back" "BC_Restroom">><</button>></div></div>
<<elseif $player.status.energy.value < 15>>
<<ChatMessage 'You are too drained to deal with this right now.'>>
<div class="btn padding-top"><div class="btn"><<button "Back" "BC_Restroom">><</button>></div></div>
<<else>>
<<SpendTime 15>>
<<SpendEnergy $player 15>>
<<if $player.gender() == "Male">>
<<set _pick = 'Media\\Sex\\Oral\\Male\\Female\\' + Random(0, 12, false) + '.mp4'>>
<<set _flavor = 'A senior from the third floor - silk blouse, heels louder than the fluorescent hum - slips in behind you and locks the stall. Neither of you uses names. Fifteen minutes later she tucks a folded $'>>
<<else>>
<<set _pick = 'Media\\Sex\\Oral\\Female\\Male\\' + Random(0, 19, false) + '.mp4'>>
<<set _flavor = 'A senior from the third floor slips in behind you and locks the stall. Neither of you uses names. Fifteen minutes later he tucks a folded $'>>
<</if>>
<<set _tip = Random(60, 140)>>
<<set $player.money += _tip>>
<<if CheckContentFilter($player.gender() == 'Male' ? 'Female' : 'Male')>><<Video _pick>><</if>>
<<set _cm = _flavor + _tip + ' into your pocket and is out the door before you straighten your collar.'>>
<<ChatMessage _cm>>
<<if typeof $player.attributes.corruption.increase === 'function'>>
<<run $player.attributes.corruption.increase(2)>>
<</if>>
<<run $player.status.horny.decrease(20)>>
<<run $player.dailyEvents.registerEvent($player.info.id, "BC_Restroom_ColleagueHJ", 1)>>
<div class="btn padding-top"><div class="btn"><<button "Back" "BC_Restroom">><</button>></div></div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if $player.dailyEvents.isEventRegistered($player.info.id, "NC_DanceFloor_Grind")>>
<<goto $player.info.currentLocation>>
<</if>>
<<if !$player.attributes || !$player.attributes.corruption || $player.attributes.corruption.value < 15>>
<<goto $player.info.currentLocation>>
<</if>>
<<set _pg = $player.gender() == "Male" ? "Male" : "Female">>
<<set $locationEventType = "Media\\Interactions\\Touch Ass\\" + _pg + "\\Male\\0.webm">>
<<Video $locationEventType>>
<<ChatMessage 'Someone slots in behind you on the floor - hips first, hands later. The bass swallows whatever they might have said.'>>
<div class="btn-container padding-top">
<div class="btn"><<button "Step away" $player.info.currentLocation>>
<<run $player.status.horny.increase(3)>>
<<run $player.dailyEvents.registerEvent($player.info.id, "NC_DanceFloor_Grind", 1)>>
<<unset $locationEventType>>
<</button>></div>
<div class="btn"><<button "Grind back" $player.info.currentLocation>>
<<run $player.status.horny.increase(15)>>
<<if $player.attributes && $player.attributes.corruption && typeof $player.attributes.corruption.increase === 'function'>>
<<run $player.attributes.corruption.increase(1)>>
<</if>>
<<ChatMessage 'You lean into it. By the time you look back they are gone, and your pulse is still matching the drop.'>>
<<run $player.dailyEvents.registerEvent($player.info.id, "NC_DanceFloor_Grind", 1)>>
<<unset $locationEventType>>
<</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<ChatMessage 'As you step into the studio, you see the photographer setting up his equipment. He greet you with a smile and explain the theme of the shoot he have in mind. As the shoot begins, you notice that the photographer is flirting subtly, making light sexual remarks and touching your shoulders or arms while discussing the next pose.'>>
<div class="padding-top">
<div class="btn-container">
<div class="btn"><<button "Flirt" "PhotoShoot_Event_01_02_Flirt">><</button>></div>
<div class="btn"><<button "Continue the photoshoot" "EroticPhotoSession">><</button>></div>
</div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<ChatMessage "You catch yourself blushing at the photographer's advance, but you return the flirtation, bantering back and forth as you try out different poses. The photographer responds by becoming more emboldened, even going so far as to touch and guide you in ways that are slightly more intimate than before. You find yourself enjoying the attention and becoming much more relaxed in front of the camera.">>
<<ChatMessage "As you were posing for the photographer's camera, you noticed a bulge growing in his pants. Your heart raced as you realized what was happening - the photographer was getting turned on by you.">>
<div class="padding-top">
<div class="btn-container">
<div class="btn"><<button "Suggest a blowjob" "PhotoShoot_Event_01_02_SuggestBlowjob">><</button>></div>
<div class="btn"><<button "Try to turn him on even more" "PhotoShoot_Event_01_02_Sex">><</button>></div>
<div class="btn"><<button "Continue the photoshoot" "PhotoShoot_Event_01_02_BeProfessional">><</button>></div>
</div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<ChatMessage "You licked your lips in anticipation and shifted your weight, pressing your thighs together as you felt a heat building between them.">>
<<ChatMessage "But instead of feeling uncomfortable, you felt an electricity between you. Instead of ignoring the photographer's arousal, you decided to embrace it. You paused in front of the camera, allowing yourself to ponder what you were about to do. In that split second, you considered the possibilities and consequences of offering him a blowjob.">>
<<ChatMessage "The thought sent shivers up your spine, and you couldn't resist the temptation any longer. Moving closer to the photographer, you bit your lip, feeling your pulse quicken as you reached for his pant zipper. You imagined what he would taste like, and the thought made you all the more eager.">>
<<ChatMessage "Your heart pounded in your chest as you looked up at him again, watching his expression change from surprise to pleasure.">>
<<ChatMessage "You wasted no time in taking him into your mouth, savoring the salty taste of his pre-cum as it coated your tongue. You took him deep into your throat, feeling his hands grip your hair as he thrust into your mouth. Your fingers trailed up and down his thighs, feeling his muscles twitching under your touch.">>
<<SetOralPick $interactionNpc.gender() $player.gender()>>
<<Video _pick>>
<<ChatMessage "It didn't take long until he came, spurting hotly into your mouth. You swallowed him down, feeling the wet heat seeping down your throat. When you looked up at him again, he was smiling down at you, his eyes filled with lust and admiration.">>
<<SetOralCumInPick $interactionNpc.gender() $player.gender()>>
<<Video _pick>>
<<ChatMessage "Grinning, you got back to your feet, brushing back your hair and taking a playful stance.">>
<<Chat $player "I think we're done for the day. Unless, of course, you have another photography job for me...">>
<<SpendTime 60>>
<<SpendEnergy $player 25>>
<<run $player.money += Random(300, 500)>>
<div class="padding-top">
<div class="btn"><<button "Continue" "CharacterInteractions">><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<ChatMessage "As you posed for the photographer's camera, you couldn't help but notice how his gaze lingered on your curves and how his breathing quickened. You felt a warm, sensual energy between you, one that promised pleasure and excitement.">>
<<ChatMessage "A mischievous idea crossed your mind as you leaned against the wall, arching your back to enhance your curves. You licked your lips seductively, watching the photographer's pupils dilate in response. Your skin prickled with anticipation as you thought about how far you could push this.">>
<<Chat $player 'Do you like what you see?'>>
<<ChatMessage "You purred, enjoying the way the photographer's eyes darkened as he nodded.">>
<<Chat $player 'Do you want to touch me?'>>
<<ChatMessage 'You whispered, feeling his fingers twitch with desire.'>>
<<ChatMessage 'He nodded again, and you reached for his hand, leading him across the room to a plush couch. You sat down, crossing your legs in front of him, loving the power you had over him. You could feel his gaze on your every movement, watching as you leaned forward to brush your lips against his neck.'>>
<<Chat $player 'Take your clothes off'>>
<<ChatMessage 'You commanded, and he obeyed eagerly, undressing to reveal a toned, muscular body.'>>
<<ChatMessage 'You smiled at the sight before you, feeling yourself grow more aroused with each passing moment. You could see how turned on he was, how he was waiting for your next move.'>>
<<Chat $player "You're so sexy">>
<<ChatMessage 'You murmured, running your hands over his chest and down to his waist. You pressed your hips against his, feeling his cock hardening against you.'>>
<<ChatMessage 'In a sudden movement, you straddled him, taking him into your mouth. Your tongue traced his cock, tasting the salty precum that dripped from his tip.'>>
/* Blowjob Video */
<<SetOralPick $interactionNpc.gender() $player.gender()>>
<<Video _pick>>
<<ChatMessage 'You thought about how good he would feel inside you, how he would stretch you open and fill you up.'>>
<<Chat $player 'Fuck me'>>
<<SpendTime 60>>
<<SpendEnergy $player 25>>
<<run $player.money += Random(300, 500)>>
<div class="padding-top">
<div class="btn"><<button "Continue" "PassiveSex">><<set $sexType = "OneSex">><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<ChatMessage "While the photographer's touches and comments make you feel uncomfortable, you decide to maintain a professional attitude and focus on the task at hand. However, you can't shake the feeling of unease that comes from being nudged towards more provocative poses than you originally agreed upon. As the session progresses, the photographer keeps pushing the boundaries, until finally you find yourself unable to take it anymore.">>
<<Chat $player "Look, I think we've gone as far as we needed to go. Let's just stick to the original plan and wrap this shoot up.">>
<<ChatMessage "The photographer grumbles and changes back to the planned shots, but the feeling of discomfort lingers long after the shoot has ended.">>
<div class="padding-top">
<div class="btn"><<button "Continue" "EroticPhotoSession">><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<div class="enhanced-interaction-panel">
<div class="categories-row">
<div class="interaction-category">
<div class="category-header">
<span class="category-icon">📸</span>
<span class="category-title">Photo Services</span>
</div>
<div class="category-buttons">
<div class="interaction-btn" data-category="job">
<<button "❓ Ask about the photo shoot" "Photographer_01_Intro">><</button>>
</div>
<<if $player.characterEvents.isEventRegistered($player.info.id, "Photoshoot") == true>>
<div class="interaction-btn" data-category="job">
<<button "📷 Standard photo shoot" "RegularPhotoSession">><</button>>
</div>
<<if $player.info.reputation.photoModel.value >= 50>>
<div class="interaction-btn" data-category="job">
<<button "🔞 Erotic photo shoot" "EroticPhotoSession">><</button>>
</div>
<<else>>
<div class="interaction-btn disabled" title="Requires reputation 50+">
<<button "🔞 Erotic photo shoot">><</button>>
</div>
<</if>>
<</if>>
</div>
</div>
</div>
<div class="categories-row">
<div class="interaction-btn" data-category="friendly">
<<button "⬅ Back" "enhanced_interaction_system">><</button>>
</div>
</div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if $player.money < 50000>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<Chat $interactionNpc "You don't have enough money.">>
<<else>>
<<set $player.money -= 50000>>
<<run $player.characterEvents.registerEvent($player.info.id, "Buy a photo studio", 1)>>
<<run SetNpcScriptedRole($interactionNpc, "None")>>
<<Chat $interactionNpc "Fine, the studio is yours.">>
<<ChatMessage "You are buying a photo studio. Now you can shoot models yourself.">>
<</if>>
<div class="padding-top">
<div class="btn"><<button "Continue" $player.info.currentLocation>>
<<SetSaveBtn true>>
<<unset $interactionNpc $indexNPC>>
<</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ChatMessage "Not enough energy (25).">>
<div class="padding-top">
<div class="interaction-btn" data-category="friendly">
<<button "⬅ Back" "Photographer">><</button>>
</div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<Chat $interactionNpc "Today there is no more work for you, come back tomorrow.">>
<div class="padding-top">
<div class="interaction-btn" data-category="friendly">
<<button "⬅ Back" "Photographer">><</button>>
</div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<Chat $interactionNpc "Hi, are you new here? Then let me tell you about working as a model. We have jobs for women/trans individuals and men. Women and trans individuals are paid more, so some men decide to undergo feminization to earn more.">>
<<Chat $interactionNpc "Your weight must not exceed (45) and must not be less than (10).">>
<<Chat $interactionNpc "The higher your reputation, the more lucrative jobs you can get. Initially, only standard photo shoots will be available to you, but once you become famous enough(50), you can participate in erotic photo shoots.">>
<<Chat $interactionNpc "Usually, you will have no more than one photoshoot per day.">>
<<if $player.characterEvents.isEventRegistered($player.info.id, "Photoshoot") == false>>
<<run $player.characterEvents.registerEvent($player.info.id, "Photoshoot", 1)>>
<</if>>
<div class="padding-top">
<div class="interaction-btn" data-category="friendly">
<<button "⬅ Back" "Photographer">><</button>>
</div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if $player.status.energy.value < 25>>
<<goto "NotEnoughEnergyPhoto">>
/* <<goto>> does not stop the passage, so the daily cap is a branch of its own:
nested inside the shoot it still paid and cost energy. */
<<elseif $player.dailyEvents.isEventRegistered($player.info.id, "Photoshoot") && $dailyPhotoShootCount <= 0>>
<<goto "MaxPhotoShootCount">>
<<else>>
<<if $player.dailyEvents.isEventRegistered($player.info.id, "Photoshoot") == false>>
<<set $dailyPhotoShootCount = Random(1, 3)>>
<<run $player.dailyEvents.registerEvent($player.info.id, "Photoshoot", 1)>>
<</if>>
<<set $dailyPhotoShootCount -= 1>>
<<if $player.gender() == "Male">>
<<set _gender = "Male">>
<<set _randPic = 0>>
<<set _gain = Random(100, 200)>>
<<else>>
<<set _gender = "Female">>
<<set _randPic = Random(0,3)>>
<<set _gain = Random(200, 350)>>
<</if>>
<<run _pic = "Media\\Jobs\\Photo\\" + _gender + "\\" + "regular" + "\\" + _randPic + ".mp4">>
<<Video _pic>>
<<set _gainText = "$" + _gain>>
<<set _photoMsg = "You were photographed for the latest fashion magazine for an hour. You earned " + _gainText + ".">>
<<ChatMessage _photoMsg>>
<<run $player.info.reputation.photoModel.increase(Random(1, 4, true))>>
<<SpendTime 60>>
<<SpendEnergy $player 25>>
<<run $player.money += _gain>>
<div class="padding-top">
<div class="interaction-btn" data-category="friendly">
<<button "⬅ Back" "Photographer">><</button>>
</div>
</div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if $player.status.energy.value < 25>>
<<goto "NotEnoughEnergyPhoto">>
/* The cap comes before the event roll: with no work left there is no shoot to
turn into an event either. */
<<elseif $player.dailyEvents.isEventRegistered($player.info.id, "Photoshoot") && $dailyPhotoShootCount <= 0>>
<<goto "MaxPhotoShootCount">>
<<elseif Random(0,100) > 70 && $player.dailyEvents.isEventRegistered($player.info.id, "PhotographerEventStart") == false>>
<<run $player.dailyEvents.registerEvent($player.info.id, "PhotographerEventStart", 1)>>
<<goto "PhotoShoot_Event_01_01_Start">>
<<else>>
<<if $player.dailyEvents.isEventRegistered($player.info.id, "Photoshoot") == false>>
<<set $dailyPhotoShootCount = Random(1, 3)>>
<<run $player.dailyEvents.registerEvent($player.info.id, "Photoshoot", 1)>>
<</if>>
<<set $dailyPhotoShootCount -= 1>>
<<if $player.gender() == "Male">>
<<set _gender = "Male">>
<<set _gain = Random(300, 500)>>
<<else>>
<<set _gender = "Female">>
<<set _gain = Random(500, 850)>>
<</if>>
<<run _pic = "Media\\Jobs\\Photo\\" + _gender + "\\erotic\\0.mp4">>
<<Video _pic>>
<<set _gainText = "$" + _gain>>
<<set _photoMsg = "You are being photographed for an hour for an erotic magazine. You earned " + _gainText + ".">>
<<ChatMessage _photoMsg>>
<<run $player.info.reputation.photoModel.increase(Random(5, 10, true))>>
<<SpendTime 60>>
<<SpendEnergy $player 25>>
<<run $player.money += _gain>>
<div class="padding-top">
<div class="interaction-btn" data-category="friendly">
<<button "⬅ Back" "Photographer">><</button>>
</div>
</div>
<</if>>
<</nobr>><<nobr>>
<<EachLoc>>
<<SaveLocation>>
<<SetBackground "Media/Locations/City/RedLightDistrict/Basement.jpg">>
<<set $canShowStatsBtn = false>>
<<set $gameSettings.allowSaves = false>>
<<set _eventType = Random(1, 2, false)>>
<<run _pimps = $Characters.filter(
(character) => character.info.characterWork == "Pimp")>>
<<if _pimps.length == 0>>
<<ChatMessage "Nothing happens.">>
<div class="btn padding-top"><<button "Continue" $player.info.currentLocation>><<SetSaveBtn true>><</button>></div>
<<else>>
<<run _pimp = _pimps[0]>>
<<set $interactionNpc = _pimp>>
<<set $indexNPC = $Characters.indexOf(_pimp)>>
<<if _eventType == 1 && _pimp.dailyEvents.isEventRegistered(_pimp.info.id, "SlutTraining Player") == false && CheckContentFilter(_pimp)>>
<<run _pimp.dailyEvents.registerEvent(_pimp.info.id, "SlutTraining Player", 1)>>
<<ChatMessage 'The metallic door of your room creaks open, and a pimp enters.'>>
<<Chat $interactionNpc "Hey, whore, did you miss me?">>
<<Chat $interactionNpc "Let's test your skills.">>
<div class="padding-top">
<div class="btn"><<button "Sex" "PassiveSex">><<set $sexType = "hookerWork">><<set _pimp.status.horny.value = 95>><<set $isPimpSex = true>><</button>></div>
</div>
<<else>>
<<ChatMessage 'You hear sighs and shouts from the neighboring rooms.'>>
<div class="padding-top">
<div class="btn"><<button "Continue" "PimpRoom">><<SetSaveBtn true>><</button>></div>
</div>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<run $player.dailyEvents.registerEvent($player.info.id, "BeingFeminizedByPimp", 1)>>
<<if $gameSettings.contentFilter.PlayerFeminization == true>>
<<run $player.body.face.increase(Random(0.1, 0.3, true))>>
<<run $player.body.breastSize.increase(Random(0.1, 0.3, true))>>
<<run $player.body.buttSize.increase(Random(0.1, 0.3, true))>>
<<if $player.body.penisSize.value > 2>>
<<run $player.body.penisSize.decrease(Random(0.1, 0.3, true))>>
<</if>>
<<run $player.info.characterWork = "Hooker">>
<<run $player.info.clothesPreference = "women">>
<<run $player.AddCloth(true)>>
<</if>>
<<for _i = 0; _i < $Characters.length; _i++>>
<<set _character = $Characters[_i]>>
<<if $pimp_Whores && $pimp_Whores.includes(_character.info.id) == true>>
<<run _character.body.face.increase(Random(0.1, 0.3, true))>>
<<run _character.body.breastSize.increase(Random(0.1, 0.3, true))>>
<<run _character.body.buttSize.increase(Random(0.1, 0.3, true))>>
<<if _character.body.penisSize.value > 2>>
<<run _character.body.penisSize.decrease(Random(0.1, 0.3, true))>>
<<elseif Random(0,100) > 90>>
<<run _character.body.vaginaSize.increase(1)>>
<<run _character.body.penisSize.decrease(30)>>
<</if>>
<</if>>
<</for>>
<<ChatMessage 'You were administered female hormones to make you more attractive to clients.'>>
<<ChatMessage 'Your debt has been increased by 100.'>>
<<run $playerDebt += 100>>
<<run _debtIncrease = Math.floor(percentOfNumber(1, $playerDebt))>>
<<run $playerDebt += _debtIncrease>>
<<ChatMessage 'Your debt has been increased by 1%(_debtIncrease).'>>
<div class="padding-top">
<div class="btn"><<button "Continue" "PimpRoom">><<SetSaveBtn true>><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ChatMessage 'You come to a casting session. The director asks you to undress and show your body.'>>
<<if $player.gender() == "Male">>
<<include "PornCasting_MalePlayer">>
<<else>>
<<include "PornCasting_FemalePlayer">>
<</if>>
<</nobr>><<nobr>>
<<if $player.body.penisSize.value < 15>>
<<Chat $interactionNpc 'Your dick is too small, you should go to the clinic. (15)'>>
<<else>>
<<Chat $interactionNpc 'Excellent. Come to me when you want to work.'>>
<<if $player.characterEvents.isEventRegistered($player.info.id, "CanWorkPornoActorAsMale") == false>>
<<run $player.characterEvents.registerEvent($player.info.id, "CanWorkPornoActorAsMale", 1)>>
<</if>>
<</if>>
<div class="padding-top">
<div class="interaction-btn" data-category="friendly">
<<button "⬅ Back" "enhanced_interaction_system">><</button>>
</div>
</div>
<</nobr>><<nobr>>
/* The casting clips show a woman being examined: the female player only. A shemale
player reaches this passage too and gets her own prose without them. */
<<if $player.gender() is "Female">>
<<ChatMessage 'You undress, and the director examines your body. He circles you, has you turn around and bend over, then tells you to pull your ass cheeks apart so the camera gets a good look.'>>
<<EventMedia `EventMedia.CASTING_CLIPS[0]`>>
<<ChatMessage 'Still naked, you answer his questions about your sexual life while he squeezes your tits and checks how wet you are.'>>
<<EventMedia `EventMedia.CASTING_CLIPS[1]`>>
<<else>>
<<ChatMessage 'You undress, and the director examines your body. He circles you, weighs your tits in his hands, then has you turn around and bend over so the camera gets a good look at your ass and your hanging cock.'>>
<<ChatMessage 'Still naked, you answer his questions about your sexual life while he strokes your cock to see how hard it gets.'>>
<</if>>
<<Chat $interactionNpc 'Let\'s see what you can do'>>
<div class="padding-top">
<div class="btn"><<button "Continue" "PassiveSex">>
<<set $sexType = "Porn Shoot (PlayerCasting)">>
<</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<Chat $interactionNpc 'Excellent. Come to me when you want to work.'>>
<<run gainSexExp($player, "exhibitionism", Random(3,5))>>
<<run gainSexExp($player, "sexualKnowledge", Random(2,4))>>
<<run gainSexExp($player, "disinhibition", Random(2,3))>>
<<if $player.characterEvents.isEventRegistered($player.info.id, "CanWorkPornoActorAsFemale") == false>>
<<run $player.characterEvents.registerEvent($player.info.id, "CanWorkPornoActorAsFemale", 1)>>
<</if>>
<div class="padding-top">
<div class="interaction-btn" data-category="friendly">
<<button "⬅ Continue" "enhanced_interaction_system">><</button>>
</div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<div class="enhanced-interaction-panel">
<div class="categories-row">
<div class="interaction-category">
<div class="category-header">
<span class="category-icon">🎬</span>
<span class="category-title">Porn Services</span>
</div>
<div class="category-buttons">
<<if ($player.gender() == "Male" && $player.characterEvents.isEventRegistered($player.info.id, "CanWorkPornoActorAsMale") == true)
|| ($player.gender() != "Male" && $player.characterEvents.isEventRegistered($player.info.id, "CanWorkPornoActorAsFemale") == true)>>
<div class="interaction-btn" data-category="job">
<<button "🎥 Start shooting" "ChoosePartner">>
<<if $player.dailyEvents.isEventRegistered($player.info.id, "Looked up porn actors") == false>>
<<run $player.dailyEvents.registerEvent($player.info.id, "Looked up porn actors", 1)>>
<<set $stillPhotoShoots = Random(1,5)>>
<</if>>
<</button>>
</div>
/* Solana Arrieta, the studio's star (Quests/Solana/SolanaArrieta.twee). */
<<SolanaPornButtons>>
<<else>>
<div class="interaction-btn" data-category="job">
<<button "🎭 Casting" "PornCastingInterview_Player">><</button>>
</div>
<</if>>
</div>
</div>
</div>
<div class="categories-row">
<div class="interaction-btn" data-category="friendly">
<<button "⬅ Back" "enhanced_interaction_system">><</button>>
</div>
</div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ChatMessage 'You lack energy (30).'>>
<div class="padding-top">
<div class="interaction-btn" data-category="friendly">
<<button "⬅ Back" "enhanced_interaction_system">><</button>>
</div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ChatMessage 'You lack sexual stamina (3).'>>
<div class="padding-top">
<div class="interaction-btn" data-category="friendly">
<<button "⬅ Back" "enhanced_interaction_system">><</button>>
</div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<Chat $interactionNpc 'There are no more shootings for today, come back tomorrow.'>>
<div class="padding-top">
<div class="interaction-btn" data-category="friendly">
<<button "⬅ Back" "PornShooting">><</button>>
</div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if $stillPhotoShoots <= 0>>
<<goto "NoPornShoots">>
<<elseif $player.status.potency.value < 3>>
<<goto "NotEnoughtPotency_PornShoot">>
<<elseif $player.status.energy.value < 30>>
<<goto "NotEnoughtEnergy_PornShoot">>
<<elseif Random(0,100) > 75 && $player.gender() == "Male">>
<<goto "PornShootEvent_01_Intro">>
<<else>>
<<set $stillPhotoShoots -= 1>>
<<include "CharactersData">>
<<run _actor = CreateCharacter({
isPlayer: false,
characterWork: "external",
lust: 10,
gender: ["Male", "Female", "Trans"].random(),
sexualPreference: "Bi",
age: Random(18,30),
}, true, false)>>
<<if _actor && _actor.info>>
<<ShowNpcIcon _actor>>
<<if Random(0,100) > 50>>
<<set _passageTo = "PassiveSex">>
<<set _sexRole = "Active">>
<<else>>
<<set _passageTo = "Sex">>
<<set _sexRole = "Passive">>
<</if>>
<<set _msg = "Name: " + _actor.info.firstName + ". <br> Gender: " + _actor.gender() + ". <br> Age: " + _actor.info.age.value + " <br> Sex Role: " + _sexRole>>
<<ChatMessage _msg>>
<<set _remainingActorsMsg = "The remaining actors: " + $stillPhotoShoots>>
<<ChatMessage _remainingActorsMsg>>
<div class="padding-top" style="display: flex; gap: 8px; flex-wrap: wrap;">
<div class="interaction-btn" data-category="job">
<<button "✅ Accept" _passageTo>>
<<set $sexType = "Porn Shoot">>
<<set $indexNPC = $Characters.indexOf(_actor)>>
<<set $interactionNpc = $Characters[$indexNPC]>>
<<SpendEnergy $player 30>>
<</button>>
</div>
<div class="interaction-btn" data-category="job">
<<button "⏭ Next" "ChoosePartner">>
<<set _indexChar = $Characters.indexOf(_actor)>>
<<if _indexChar >= 0>>
<<run $Characters.splice(_indexChar, 1)>>
<</if>>
<</button>>
</div>
<div class="interaction-btn" data-category="friendly">
<<button "⬅ Back" "PornShooting">>
<<set _indexChar = $Characters.indexOf(_actor)>>
<<if _indexChar >= 0>>
<<run $Characters.splice(_indexChar, 1)>>
<</if>>
<</button>>
</div>
</div>
<<else>>
<<set $stillPhotoShoots += 1>>
<<ChatMessage "No actor is available right now. Try again in a moment.">>
<div class="padding-top">
<div class="interaction-btn" data-category="friendly">
<<button "Back" "PornShooting">><</button>>
</div>
</div>
<</if>>
<<unset $maleNames $femaleNames $surnames>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _playerName = $player.info.firstName>>
<<ChatMessage 'As you arrived on set for another shoot, you were met by the director who had some unexpected news'>>
<<set _directorRequestMsg = _playerName + ", one of our female actresses didn't show up. I was wondering if you would be willing to replace her?">>
<<Chat $interactionNpc _directorRequestMsg>>
<<Chat $player 'A girl? I''m not sure about that'>>
<<Chat $interactionNpc 'Well, I have an idea that might make it more appealing for you,'>>
<<Chat $interactionNpc 'We have a special pill that can turn you into a girl for the duration of the shoot. We''re short-handed, and I know you won''t let us down.'>>
<<ChatMessage 'You hesitated for a moment, contemplating your options. On the one hand, you were nervous about the idea of becoming a girl. '>>
<div class="padding-top">
<div class="btn"><<button "Accept" "PornShootEvent_02_AceptPills">><</button>></div>
</div>
<div class="padding-top">
<div class="btn"><<button "Convince the director that the second actor should take the pill">>
<<if $player.attributes.dominance.value < 7>>
<<goto "PornShootEvent_02_NotEnoughDominance">>
<<else>>
<<goto "PornShootEvent_02_SecondActerFeminization">>
<</if>>
<</button>></div>
</div>
<div class="padding-top">
<div class="btn"><<button "Refuse" "PornShooting">><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ChatMessage 'But on the other hand, you didn\'t want to let down your colleagues. Finally, you relented and agreed to take the pill.'>>
<<ChatMessage 'With a few swallows of water, the pill was down the hatch, and the changes began. Your body started to tingle as your muscles shifted, your bones contorted, and your skin stretched. Your hair lengthened and thickened into long, golden locks. Your voice became higher and more feminine.'>>
<<set $savePlayerBody = {
face: $player.body.face.value,
breastSize: $player.body.breastSize.value,
buttSize: $player.body.buttSize.value,
penisSize: $player.body.penisSize.value,
vaginaSize: $player.body.vaginaSize.value,
}>>
<<run $player.body.face.value = 6>>
<<run $player.body.breastSize.value = 4>>
<<run $player.body.buttSize.value = 4>>
<<run $player.body.penisSize.value = 0>>
<<run $player.body.vaginaSize.value = 1>>
<<run $player.invalidateCache()>>
<<include "CharactersData">>
<<run _testChar = CreateCharacter({
isPlayer: false,
characterWork: "external",
dominance: 10,
lust: 10,
SexRole: "Active",
gender: "Male",
sexualPreference: "Bi",
clothesPreference: "men",
age: Random(18,30),
}, true, false)>>
<<set $indexNPC = $Characters.indexOf(_testChar)>>
<<set $interactionNpc = $Characters[$indexNPC]>>
<<ChatMessage 'When the transformation was complete, the new "actress" stepped out onto set. You looked in the mirror and gasped - you couldn\'t believe what you saw. It was like looking at a perfect actress in the mirror.'>>
<<Chat $interactionNpc 'Damn, you look so hot as a girl! Look at those curves and that pretty face...I can\'t wait to get my hands on you'>>
<<ChatMessage 'He couldn\'t help but tease and taunt you, who was now a beautiful woman thanks to the special pill.'>>
<<Chat $interactionNpc 'You better get ready, because I\'m going to fuck that tight little pussy of yours so hard that you won\'t be able to walk for days!'>>
<div class="padding-top">
<div class="btn"><<button "Start" "PassiveSex">>
<<unset $maleNames $femaleNames $surnames>>
<<SpendEnergy $player 45>>
<<set $indexNPC = $Characters.indexOf(_testChar)>>
<<set $interactionNpc = $Characters[$indexNPC]>>
<<set $sexType = "Porn Shoot (PlayerTransform)">>
<</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "CharactersData">>
<<ChatMessage 'After talking to the director, you managed to convince him that the second actor, who was already on set, should take the pill and play the part.'>>
<<ChatMessage 'The director was initially hesitant, but eventually agreed to your suggestion. The second actor was given the pill with a few swallows of water, and the transformation began.'>>
<<run _testChar = CreateCharacter({
isPlayer: false,
characterWork: "external",
dominance: 0,
lust: 10,
SexRole: "Active",
gender: "Male",
sexualPreference: "Bi",
clothesPreference: "men",
age: Random(18,30),
}, true, false)>>
<<ShowNpcIcon _testChar>>
<<run _testChar.body.face.value = 6>>
<<run _testChar.body.breastSize.value = 4>>
<<run _testChar.body.buttSize.value = 4>>
<<run _testChar.body.penisSize.value = 0>>
<<run _testChar.body.vaginaSize.value = 1>>
<<ChatMessage ' His body started to tingle as his muscles shifted, his bones contorted, and his skin stretched. His hair lengthened and thickened into long, blond locks. His voice became higher and more feminine until he became an actress.'>>
<<ChatMessage 'When the transformation was complete, the new "actress" stepped out onto set. You watched in amazement - he looked like a perfect actress in every way imaginable!'>>
<<ShowNpcIcon _testChar>>
<div class="padding-top">
<div class="btn"><<button "Start" "Sex">>
<<unset $maleNames $femaleNames $surnames>>
<<set $sexType = "Porn Shoot">>
<<SpendEnergy $player 45>>
<<set $indexNPC = $Characters.indexOf(_testChar)>>
<<set $interactionNpc = $Characters[$indexNPC]>>
<</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ChatMessage 'You are trying to convince the director that the second actor should take the pill, but you don\'t seem very persuasive, and the director decides that you should take the pill after all'>>
<<ChatMessage 'You lack dominance (7)'>>
<div class="padding-top">
<div class="btn-container">
<div class="btn"><<button "Acept" "PornShootEvent_02_AceptPills">><</button>></div>
<div class="btn"><<button "Refuse" "PornShooting">><</button>></div>
</div>
</div>
<</nobr>>/* Skid Row shop, female player: the owner pays cash for a show in his back
office and more for each step after it. Clips from EventMedia.discountClip,
pay from EventMedia.shopFavorPay (src/scripts/Events/eventMedia.ts).
SR_Shop_DiscountFavor registers the daily event and opens $shopFavor. */
/* _args[0]: the step that must have just been done. $shopFavor.done moves one
step per visit, so a revisit through history cannot pay twice. */
<<widget "ShopFavorValid">>
<<set _sfValid = $player.gender() is "Female" and CheckContentFilter('Male') and $shopFavor and $shopFavor.day is getCurrentAbsoluteDay() and $shopFavor.done is _args[0]>>
<<if not _sfValid>><<goto "SR_Shop">><</if>>
<</widget>>
<<widget "ShopFavorOwner">>
<<ChatWithoutNPC 'Owner' "Media\\Characters\\QuestChars\\Other\\guy.jpg" _args[0]>>
<</widget>>
/* Pays for the favor just done, once, and shows the take-it-and-go button. */
<<widget "ShopFavorPayout">>
<<set _sfPay = EventMedia.shopFavorPay(_args[0])>>
<<set $player.money += _sfPay>>
<<set _sfPayMsg = 'He counts $' + _sfPay + ' out of the register and tucks it into your hand.'>>
<<ChatMessage _sfPayMsg>>
<</widget>><<nobr>>
<<include "UpdateAll">>
<<ShopFavorValid "">>
<<if _sfValid>>
<<set $shopFavor.done = "show">>
<<SetBackground "Media/Locations/City/SkidRow/SR_Shop.jpg">>
<<SpendTime 10>>
<<SpendEnergy $player 5>>
<div class="centre-text">The back office</div>
<<ChatMessage 'The owner leans over the counter while you pretend to look at the junk under the glass. He has been eyeing you since you walked in.'>>
<<EventMedia `EventMedia.discountClip("haggle")`>>
<<ShopFavorOwner 'Short on cash, sweetheart? I pay for a little show in the back. Just looking, nothing else.'>>
<<ChatMessage 'His office is a cluttered room with a desk, a rolling chair and a wall of framed junk. He locks the door, drops into the chair and waves for you to start.'>>
<<EventMedia `EventMedia.discountClip("backOffice")`>>
<<ChatMessage 'You pull your top over your head, unhook your bra and let him see your tits. The shorts come next, and you turn around slowly so he can watch you peel your thong down over your ass.'>>
<<EventMedia `EventMedia.discountClip("strip")`>>
<<ShopFavorOwner 'Sit on the desk. Spread them. Show me how you touch that pussy.'>>
<<ChatMessage 'You sit back on his desk with your legs wide and rub your clit while he watches, two fingers sliding inside you until you are wet and breathing hard.'>>
<<EventMedia `EventMedia.discountClip("masturbate")`>>
<<run $player.status.horny.increase(10)>>
<<if typeof $player.attributes.corruption.increase === 'function'>><<run $player.attributes.corruption.increase(1)>><</if>>
<<ShopFavorPayout "show">>
<<ShopFavorOwner 'Double that if you suck my cock.'>>
<div class="btn-container padding-top">
<div class="btn"><<button "Get on your knees" "SR_Shop_Favor_Blowjob">><</button>></div>
<div class="btn"><<button "Get dressed and go" "SR_Shop">><</button>></div>
</div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShopFavorValid "show">>
<<if _sfValid>>
<<set $shopFavor.done = "blowjob">>
<<SetBackground "Media/Locations/City/SkidRow/SR_Shop.jpg">>
<<SpendTime 10>>
<<SpendEnergy $player 5>>
<div class="centre-text">On your knees</div>
<<ChatMessage 'You kneel between his knees. He opens his pants, pulls out his cock and guides your head down. You suck him slow at first, then faster when he grabs your hair and starts fucking your mouth.'>>
<<EventMedia `EventMedia.discountClip("blowjob")`>>
<<run gainSexExp($player, "oralSkill", Random(1, 3))>>
<<if typeof $player.attributes.corruption.increase === 'function'>><<run $player.attributes.corruption.increase(1)>><</if>>
<<ShopFavorPayout "blowjob">>
<<ShopFavorOwner 'Bend over that desk and I will empty the register for you.'>>
<div class="btn-container padding-top">
<div class="btn"><<button "Bend over the desk" "SR_Shop_Favor_Sex">><</button>></div>
<div class="btn"><<button "Wipe your mouth and go" "SR_Shop">><</button>></div>
</div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShopFavorValid "blowjob">>
<<if _sfValid>>
<<set $shopFavor.done = "sex">>
<<SetBackground "Media/Locations/City/SkidRow/SR_Shop.jpg">>
<<SpendTime 15>>
<<SpendEnergy $player 10>>
<div class="centre-text">Over the desk</div>
<<ChatMessage 'He sweeps the papers off the desk and lays you back on it. He fucks you on your back first, holding your ankles apart, then flips you over and pounds your pussy from behind. When he drops back into his chair you climb on and ride his cock until he grunts that he is close.'>>
<<EventMedia `EventMedia.discountClip("sex")`>>
<<ChatMessage 'He pushes you off onto your knees, jerks his cock in your face and cums on your tongue and chin.'>>
<<EventMedia `EventMedia.discountClip("facial")`>>
<<run gainSexExp($player, "vaginalSkill", Random(2, 4))>>
<<run $player.status.horny.value = $player.status.horny.min>>
<<if typeof $player.attributes.corruption.increase === 'function'>><<run $player.attributes.corruption.increase(1.5)>><</if>>
<<ShopFavorPayout "sex">>
<<ShopFavorOwner 'Come back whenever you need money.'>>
<div class="btn padding-top"><<button "Get dressed and go" "SR_Shop">><</button>></div>
<</if>>
<</nobr>>/* Caught shoplifting at the mall: the loss-prevention guard takes the thief to the
back office instead of calling the police. Each step can end in a fine, the
police or one more step. One scene per body, never shared:
Shoplift_BackRoom* - female thief, male guard, the shoplifting clips
(EventMedia.shopliftClip) of exactly that;
Shoplift_BackRoomM* - male thief, female guard, generic picks of a man and a woman;
Shoplift_BackRoomT* - shemale thief, male guard, generic picks of a man and a shemale.
$shopliftBackRoom = { day, gender } is set by the caught branch of Crime_Shoplift. */
/* _args[0]: the body the passage is written for. Anyone else is sent back to the mall. */
<<widget "ShopliftBackRoomValid">>
<<set _sbrBody = _args[0]>>
<<set _sbrGuardGender = (_sbrBody is "Male") ? "Female" : "Male">>
<<set _sbrValid = $shopliftBackRoom and $shopliftBackRoom.day is getCurrentAbsoluteDay() and $shopliftBackRoom.gender is _sbrBody and $player.gender() is _sbrBody and CheckContentFilter(_sbrGuardGender, $player)>>
<<if not _sbrValid>>
<<unset $shopliftBackRoom>>
<<LeaveInteractionSettings>>
<<goto "Mall">>
<</if>>
<</widget>>
<<widget "ShopliftBackRoomGuard">>
<<ChatWithoutNPC 'Guard' "Media\\Characters\\QuestChars\\Other\\guy.jpg" _args[0]>>
<</widget>>
<<widget "ShopliftBackRoomGuardF">>
<<ChatWithoutNPC 'Guard' "Media\\Characters\\QuestChars\\Other\\female_unknown.jpg" _args[0]>>
<</widget>>
/* The guard keeps his word: the tape is wiped and the charge never reaches the police. */
<<widget "ShopliftBackRoomRelease">>
<<if typeof clearWarrant === "function">><<run clearWarrant($police, "shoplifting")>><</if>>
<<if typeof adjustWanted === "function">><<run adjustWanted($police, -10)>><</if>>
<<unset $shopliftBackRoom>>
<<LeaveInteractionSettings>>
<<goto "Mall">>
<</widget>>
<<widget "ShopliftBackRoomCallPolice">>
<<unset $shopliftBackRoom>>
<<set $policeStopCrime = "shoplifting">>
<<set $policeReturnPassage = "Mall">>
<<goto "Police_Stop">>
<</widget>>
<<widget "ShopliftBackRoomFineButton">>
<<if $player.money gte 150>>
<div class="btn"><<button "Pay for it and a $150 fine">>
<<set $player.money -= 150>>
<<ShopliftBackRoomRelease>>
<</button>></div>
<<else>>
<div class="btn non-interacting"><<button "Pay for it and a $150 fine">><</button>></div>
<</if>>
<</widget>><<nobr>>
<<include "UpdateAll">>
<<LockSettings>>
<<ShopliftBackRoomValid "Female">>
<<if _sbrValid>>
<<SpendTime 10>>
<div class="centre-text">Loss prevention</div>
<<ChatMessage 'The guard marches you past the fitting rooms into a cramped office stacked with shopping bags and confiscated junk. He dumps your bag on the desk, lines up what you took next to it and turns his monitor so you can watch yourself stuff it into your jacket.'>>
<<EventMedia `EventMedia.shopliftClip("questioning")`>>
<<ShopliftBackRoomGuard 'That is a theft charge, sweetheart. I call it in, the cops come, you get printed. Or you pay for it, plus a fine, and walk out of here.'>>
<<ChatMessage 'He leans back in his chair and looks you up and down, slowly, taking his time over your chest.'>>
<<ShopliftBackRoomGuard 'Unless you had something else in mind.'>>
<div class="btn-container padding-top">
<<ShopliftBackRoomFineButton>>
<div class="btn"><<button "Ask what he has in mind" "Shoplift_BackRoom_Search">><</button>></div>
<div class="btn"><<button "Let him call the police">><<ShopliftBackRoomCallPolice>><</button>></div>
</div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<LockSettings>>
<<ShopliftBackRoomValid "Female">>
<<if _sbrValid>>
<<SpendTime 10>>
<div class="centre-text">Strip search</div>
<<ShopliftBackRoomGuard 'First I need to know you are not hiding anything else. Strip. All of it.'>>
<<ChatMessage 'Your face burns as you shrug off your jacket and unbutton your top. He watches without blinking while you step out of your pants, then waves a hand when you stop at your underwear. The bra goes, then the panties, and you stand naked in front of his desk with your arms at your sides.'>>
<<EventMedia `EventMedia.shopliftClip("undress")`>>
<<EventMedia `EventMedia.shopliftClip("naked")`>>
<<run $player.status.horny.increase(5)>>
<<if $player.attributes and $player.attributes.corruption and typeof $player.attributes.corruption.increase === "function">><<run $player.attributes.corruption.increase(0.5)>><</if>>
<<ShopliftBackRoomGuard 'Good girl. Now bend over the desk and spread yourself. I said all of it.'>>
<div class="btn-container padding-top">
<div class="btn"><<button "Bend over the desk" "Shoplift_BackRoom_Inspect">><</button>></div>
<div class="btn"><<button "Grab your clothes and tell him to call the cops">><<ShopliftBackRoomCallPolice>><</button>></div>
</div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<LockSettings>>
<<ShopliftBackRoomValid "Female">>
<<if _sbrValid>>
<<SpendTime 10>>
<div class="centre-text">Inspection</div>
<<ChatMessage 'You fold over the desk and reach back to pull your ass cheeks apart. He crouches behind you and takes a long look at your pussy and your asshole, then spreads you wider with his thumbs.'>>
<<EventMedia `EventMedia.shopliftClip("inspection")`>>
<<ChatMessage 'His breath is hot on your skin. Without a word he buries his face between your legs and licks your pussy from behind until your knees shake and you are moaning into the desk blotter.'>>
<<EventMedia `EventMedia.shopliftClip("lickedByGuard")`>>
<<run $player.status.horny.increase(12)>>
<<ShopliftBackRoomGuard 'You are soaking wet, you little thief. Get on your knees. You suck my cock and I might forget that tape exists.'>>
<div class="btn-container padding-top">
<div class="btn"><<button "Get on your knees" "Shoplift_BackRoom_Blowjob">><</button>></div>
<div class="btn"><<button "Push him off and make him call the police">><<ShopliftBackRoomCallPolice>><</button>></div>
</div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<LockSettings>>
<<ShopliftBackRoomValid "Female">>
<<if _sbrValid>>
<<SpendTime 15>>
<div class="centre-text">On your knees</div>
<<ChatMessage 'You kneel on the cheap carpet. He unzips, pulls out his cock and slaps it against your cheek before he feeds it into your mouth. You suck him with his hand fisted in your hair while he grunts and pushes deeper.'>>
<<EventMedia `EventMedia.shopliftClip("blowjob")`>>
<<run gainSexExp($player, "oralSkill", Random(1, 3))>>
<<if $player.attributes and $player.attributes.corruption and typeof $player.attributes.corruption.increase === "function">><<run $player.attributes.corruption.increase(1)>><</if>>
<<ShopliftBackRoomGuard 'Fuck, you are good at this. Stand up and bend over. I want that pussy before I let you go.'>>
<div class="btn-container padding-top">
<div class="btn"><<button "Bend over for him" "Shoplift_BackRoom_Fuck">><</button>></div>
<div class="btn"><<button "Finish him with your mouth">>
<<set $shopliftBackRoomEnd = "mouth">>
<<goto "Shoplift_BackRoom_End">>
<</button>></div>
</div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<LockSettings>>
<<ShopliftBackRoomValid "Female">>
<<if _sbrValid>>
<<SpendTime 20>>
<div class="centre-text">Over the desk</div>
<<ChatMessage 'He bends you over the desk, kicks your feet apart and shoves his cock into your wet pussy in one stroke. The desk rattles as he fucks you hard, one hand on your hip and the other pinning your shoulder to the papers.'>>
<<EventMedia `EventMedia.shopliftClip("sex")`>>
<<ChatMessage 'When he is close he pulls out, spins you around and pushes you back down to your knees. He jerks his cock in your face and cums across your cheeks and lips, groaning, while you hold still and take it.'>>
<<EventMedia `EventMedia.shopliftClip("facial")`>>
<<run gainSexExp($player, "vaginalSkill", Random(2, 4))>>
<<run $player.status.horny.value = $player.status.horny.min>>
<<if $player.attributes and $player.attributes.corruption and typeof $player.attributes.corruption.increase === "function">><<run $player.attributes.corruption.increase(1.5)>><</if>>
<<set $shopliftBackRoomEnd = "fucked">>
<div class="btn padding-top"><<button "Clean up" "Shoplift_BackRoom_End">><</button>></div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<LockSettings>>
<<ShopliftBackRoomValid "Female">>
<<if _sbrValid>>
<<if $shopliftBackRoomEnd is "fucked">>
<<ChatMessage 'He tosses you a box of tissues and deletes the clip while you wipe his cum off your face. Then he pushes the stolen things across the desk.'>>
<<ShopliftBackRoomGuard 'Keep them. Call it a tip. Come steal from us again sometime.'>>
<<set _sbrTake = Random(25, 90)>>
<<AddMoney _sbrTake>>
<<else>>
<<ChatMessage 'He holds your head down and cums in your mouth with a long groan. You swallow, wipe your lips with the back of your hand and get dressed while he deletes the clip.'>>
<<run gainSexExp($player, "oralSkill", 1)>>
<<ShopliftBackRoomGuard 'Get out of here before I change my mind.'>>
<</if>>
<<unset $shopliftBackRoomEnd>>
<div class="btn padding-top"><<button "Leave the mall">><<ShopliftBackRoomRelease>><</button>></div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<LockSettings>>
<<ShopliftBackRoomValid "Male">>
<<if _sbrValid>>
<<SpendTime 10>>
<div class="centre-text">Loss prevention</div>
<<ChatMessage 'The guard who stopped you is a tall woman in a tight security polo, hair scraped back, a radio on her hip. She walks you into a cramped office full of confiscated junk, dumps your bag on the desk and plays the tape of you stuffing things into your jacket.'>>
<<ShopliftBackRoomGuardF 'That is a theft charge. I call it in, the cops come, you get printed. Or you pay for it, plus a fine.'>>
<<ChatMessage 'She perches on the edge of the desk, legs apart, and lets her eyes drop to your crotch.'>>
<<ShopliftBackRoomGuardF 'Or you make my shift a lot more fun and I lose the tape.'>>
<div class="btn-container padding-top">
<<ShopliftBackRoomFineButton>>
<div class="btn"><<button "Ask what she has in mind" "Shoplift_BackRoomM_Lick">><</button>></div>
<div class="btn"><<button "Let her call the police">><<ShopliftBackRoomCallPolice>><</button>></div>
</div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<LockSettings>>
<<ShopliftBackRoomValid "Male">>
<<if _sbrValid>>
<<SpendTime 15>>
<div class="centre-text">On your knees</div>
<<ChatMessage 'She unbuckles her uniform pants and shoves them down with her panties, then hooks a leg over your shoulder and pulls your face into her pussy.'>>
<<ShopliftBackRoomGuardF 'Make me cum and we can talk.'>>
<<ChatMessage 'You lick her slit and suck her clit while she grinds on your mouth, one hand on the back of your head, her thighs clamping around your ears until she shudders and cums on your tongue.'>>
<<SetOralPick "Female" "Male">><<Video _pick>>
<<run $player.status.horny.increase(12)>>
<<run gainSexExp($player, "oralSkill", Random(1, 3))>>
<<if $player.attributes and $player.attributes.corruption and typeof $player.attributes.corruption.increase === "function">><<run $player.attributes.corruption.increase(0.5)>><</if>>
<<ShopliftBackRoomGuardF 'Not bad. Now get that cock out and fuck me over the desk.'>>
<div class="btn-container padding-top">
<div class="btn"><<button "Bend her over the desk" "Shoplift_BackRoomM_Fuck">><</button>></div>
<div class="btn"><<button "Back off and make her call the police">><<ShopliftBackRoomCallPolice>><</button>></div>
</div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<LockSettings>>
<<ShopliftBackRoomValid "Male">>
<<if _sbrValid>>
<<SpendTime 20>>
<div class="centre-text">Over the desk</div>
<<ChatMessage 'She bends over the desk with her pants around her ankles and reaches back to spread herself. You push your cock into her wet pussy and fuck her hard, the desk rattling, her radio crackling on the floor where it fell.'>>
<<SetVagPick "Male" "Female">><<Video _pick>>
<<ChatMessage 'When you are close she snaps at you to pull out. You cum across her ass while she laughs into the paperwork.'>>
<<SetVagCumOutPick "Male" "Female">><<Video _pick>>
<<run gainSexExp($player, "penetrativeSkill", Random(2, 4))>>
<<run $player.status.horny.value = $player.status.horny.min>>
<<run $player.status.potency.decrease(1)>>
<<if $player.attributes and $player.attributes.corruption and typeof $player.attributes.corruption.increase === "function">><<run $player.attributes.corruption.increase(1)>><</if>>
<<ChatMessage 'She wipes herself off with a handful of tissues, deletes the clip and pushes the stolen things back across the desk.'>>
<<ShopliftBackRoomGuardF 'Keep them. And come shoplift on my shift again.'>>
<<set _sbrTake = Random(25, 90)>>
<<AddMoney _sbrTake>>
<div class="btn padding-top"><<button "Leave the mall">><<ShopliftBackRoomRelease>><</button>></div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<LockSettings>>
<<ShopliftBackRoomValid "Shemale">>
<<if _sbrValid>>
<<SpendTime 10>>
<div class="centre-text">Loss prevention</div>
<<ChatMessage 'The guard marches you into a cramped office full of confiscated junk, dumps your bag on the desk and turns his monitor so you can watch yourself stuff it into your jacket.'>>
<<ShopliftBackRoomGuard 'That is a theft charge, sweetheart. I call it in, the cops come, you get printed. Or you pay for it, plus a fine.'>>
<<ChatMessage 'He leans back in his chair and looks you over, from your tits to the bulge under your skirt, and smiles.'>>
<<ShopliftBackRoomGuard 'Or we settle this between us.'>>
<div class="btn-container padding-top">
<<ShopliftBackRoomFineButton>>
<div class="btn"><<button "Ask how" "Shoplift_BackRoomT_Blowjob">><</button>></div>
<div class="btn"><<button "Let him call the police">><<ShopliftBackRoomCallPolice>><</button>></div>
</div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<LockSettings>>
<<ShopliftBackRoomValid "Shemale">>
<<if _sbrValid>>
<<SpendTime 15>>
<div class="centre-text">Strip search</div>
<<ShopliftBackRoomGuard 'First I check you are not hiding anything else. Strip.'>>
<<ChatMessage 'You undress in front of his desk. When your panties come down your cock swings free, half hard, and he laughs and tells you to get on your knees.'>>
<<ChatMessage 'He unzips and feeds you his cock. You suck him with his hand fisted in your hair while your own cock stiffens between your thighs.'>>
<<SetOralPick "Male" "Shemale">><<Video _pick>>
<<run $player.status.horny.increase(12)>>
<<run gainSexExp($player, "oralSkill", Random(1, 3))>>
<<if $player.attributes and $player.attributes.corruption and typeof $player.attributes.corruption.increase === "function">><<run $player.attributes.corruption.increase(0.5)>><</if>>
<<ShopliftBackRoomGuard 'Good. Now bend over the desk.'>>
<div class="btn-container padding-top">
<div class="btn"><<button "Bend over the desk" "Shoplift_BackRoomT_Fuck">><</button>></div>
<div class="btn"><<button "Finish him with your mouth">>
<<set $shopliftBackRoomEnd = "mouth">>
<<goto "Shoplift_BackRoomT_End">>
<</button>></div>
</div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<LockSettings>>
<<ShopliftBackRoomValid "Shemale">>
<<if _sbrValid>>
<<SpendTime 20>>
<div class="centre-text">Over the desk</div>
<<ChatMessage 'He bends you over the desk, spits on your asshole and pushes his cock into your ass. He fucks you hard, the desk rattling, your cock slapping against the drawer with every thrust.'>>
<<SetAnalPick "Male" "Shemale">><<Video _pick>>
<<ChatMessage 'He drives deep one last time and cums in your ass, holding you down until he is done.'>>
<<SetAnalCumInPick "Male" "Shemale">><<Video _pick>>
<<run gainSexExp($player, "analSkill", Random(2, 4))>>
<<run $player.status.horny.value = $player.status.horny.min>>
<<if $player.attributes and $player.attributes.corruption and typeof $player.attributes.corruption.increase === "function">><<run $player.attributes.corruption.increase(1.5)>><</if>>
<<set $shopliftBackRoomEnd = "fucked">>
<div class="btn padding-top"><<button "Clean up" "Shoplift_BackRoomT_End">><</button>></div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<LockSettings>>
<<ShopliftBackRoomValid "Shemale">>
<<if _sbrValid>>
<<if $shopliftBackRoomEnd is "fucked">>
<<ChatMessage 'He tosses you a box of tissues and deletes the clip while his cum runs down your thighs. Then he pushes the stolen things across the desk.'>>
<<ShopliftBackRoomGuard 'Keep them. Call it a tip.'>>
<<set _sbrTake = Random(25, 90)>>
<<AddMoney _sbrTake>>
<<else>>
<<ChatMessage 'He holds your head down and cums in your mouth with a long groan. You swallow, wipe your lips and get dressed while he deletes the clip.'>>
<<run gainSexExp($player, "oralSkill", 1)>>
<<ShopliftBackRoomGuard 'Get out of here before I change my mind.'>>
<</if>>
<<unset $shopliftBackRoomEnd>>
<div class="btn padding-top"><<button "Leave the mall">><<ShopliftBackRoomRelease>><</button>></div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if $player.status.horny.value < 40>>
<<ChatMessage 'You are not in the mood.'>>
<div class="btn padding-top"><div class="btn"><<button "Back" "Player_Bedroom_PHome">><</button>></div></div>
<<else>>
<<SpendTime 20>>
<<SpendEnergy $player 8>>
<<if $player.gender() == "Shemale">>
<<set _useAnal = Random(0, 2) == 0>>
<<if _useAnal>>
<<set _pick = 'Media\\Sex\\JerkOff\\Shemale\\Cum\\' + Random(0, 2, false) + '.mp4'>>
<<else>>
<<set _pick = 'Media\\Sex\\JerkOff\\Shemale\\0.mp4'>>
<</if>>
<<elseif $player.gender() == "Male">>
<<set _useCum = Random(0, 2) == 0>>
<<if _useCum>>
<<set _pick = 'Media\\Sex\\JerkOff\\Male\\Cum\\' + Random(0, 2, false) + '.mp4'>>
<<else>>
<<set _pick = 'Media\\Sex\\JerkOff\\Male\\' + Random(0, 6, false) + '.mp4'>>
<</if>>
<<else>>
<<set _useAnal = Random(0, 3) == 0>>
<<if _useAnal>>
<<set _pick = 'Media\\Sex\\Dildo\\Female\\Anal\\' + Random(0, 8, false) + '.mp4'>>
<<else>>
<<set _pick = 'Media\\Sex\\Dildo\\Female\\' + Random(0, 11, false) + '.mp4'>>
<</if>>
<</if>>
<<Video _pick>>
<<ChatMessage 'You lock the door. It does not take long with the curtains drawn and no one expected back for hours.'>>
<<run $player.status.horny.decrease($player.status.horny.max)>>
<<if $player.attributes && $player.attributes.corruption && typeof $player.attributes.corruption.increase === 'function'>>
<<run $player.attributes.corruption.increase(0.3)>>
<</if>>
<<run $player.dailyEvents.registerEvent($player.info.id, "Player_Bedroom_SoloPlay", 1)>>
<div class="btn padding-top"><div class="btn"><<button "Back" "Player_Bedroom_PHome">><</button>></div></div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if $player.dailyEvents.isEventRegistered($player.info.id, "UFG_ShowerRoom_Peek")>>
<<goto $player.info.currentLocation>>
<</if>>
<<Video $locationEventType>>
<<if EventMedia.LOCKER_ROOM_PEEK_CLIPS.includes($locationEventType)>>
<<ChatMessage 'Steam rolls across the tiles. On the far side of the lockers the women fighters are peeling off their gear, tits out, joking with each other, towels nowhere near where they should be. You have not been noticed.'>>
<<else>>
<<ChatMessage 'Steam drifts out of the showers. Past the end of the lockers two fighters who think the room is empty are kissing, slow and hungry, hands all over each other. You have not been noticed.'>>
<</if>>
<div class="btn-container padding-top">
<div class="btn"><<button "Turn the other way" $player.info.currentLocation>>
<<run $player.status.horny.increase(3)>>
<<run $player.dailyEvents.registerEvent($player.info.id, "UFG_ShowerRoom_Peek", 1)>>
<<unset $locationEventType>>
<</button>></div>
<div class="btn"><<button "Stay and watch" $player.info.currentLocation>>
<<run $player.status.horny.increase(14)>>
<<if $player.attributes && $player.attributes.corruption && typeof $player.attributes.corruption.increase === 'function'>>
<<run $player.attributes.corruption.increase(1.2)>>
<</if>>
<<ChatMessage 'You hold the corner of the partition until one of them notices and smirks. You step back, heart pounding, before they decide to invite you in.'>>
<<run $player.dailyEvents.registerEvent($player.info.id, "UFG_ShowerRoom_Peek", 1)>>
<<unset $locationEventType>>
<</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _notice = (typeof window.consumeBreakupNoticeForLocation === 'function')
? window.consumeBreakupNoticeForLocation($player.info.currentLocation)
: null>>
<<if !_notice>>
<<goto $player.info.currentLocation>>
<</if>>
<<set _bA = (typeof window.findById === 'function') ? window.findById(_notice.npc1) : null>>
<<set _bB = (typeof window.findById === 'function') ? window.findById(_notice.npc2) : null>>
<<if !_bA || !_bB>>
<<goto $player.info.currentLocation>>
<</if>>
<<set _bondLabel = _notice.wasSoulmate ? 'soulmate bond' : 'relationship'>>
<<set _msg = _bA.info.firstName + " and " + _bB.info.firstName + " are standing apart, both staring at the floor. Whatever the " + _bondLabel + " was, it's not anymore. " + _bA.info.firstName + " walks past you without a word.">>
<<ChatMessage _msg>>
<div class="btn-container padding-top">
<div class="btn"><<button "Walk away" $player.info.currentLocation>><</button>></div>
<div class="btn"><<button "Comfort them" $player.info.currentLocation>>
<<set _comfortDelta = { friendship: 4, love: 1 }>>
<<run $player.setRelationship(_bA.info.id, _comfortDelta, true)>>
<<run $player.setRelationship(_bB.info.id, _comfortDelta, true)>>
<<run _bA.setRelationship($player.info.id, _comfortDelta, true)>>
<<run _bB.setRelationship($player.info.id, _comfortDelta, true)>>
<<SpendTime 10>>
<<ChatMessage 'You sit with them in turn. Neither of them really talks. They both notice that you stayed.'>>
<</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if $player.dailyEvents.isEventRegistered($player.info.id, "StreetFight_Ambient")>>
<<goto $player.info.currentLocation>>
<</if>>
<<EventMedia $locationEventType>>
<<ChatMessage 'Two men trade punches outside the alley. The bigger one has blood on his knuckles; the other is already limping.'>>
<div class="btn-container padding-top">
<div class="btn"><<button "Walk by" $player.info.currentLocation>>
<<run $player.dailyEvents.registerEvent($player.info.id, "StreetFight_Ambient", 1)>>
<<unset $locationEventType>>
<</button>></div>
<div class="btn"><<button "Shout at them" $player.info.currentLocation>>
<<SpendTime 5>>
<<if $player.attributes && $player.attributes.corruption && typeof $player.attributes.corruption.increase === 'function'>>
<<run $player.attributes.corruption.increase(0.5)>>
<</if>>
<<ChatMessage 'You shout - they scatter before it gets worse. Your pulse hammers.'>>
<<run $player.dailyEvents.registerEvent($player.info.id, "StreetFight_Ambient", 1)>>
<<unset $locationEventType>>
<</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if $player.dailyEvents.isEventRegistered($player.info.id, "Downtown_GropeStranger")>>
<<goto $player.info.currentLocation>>
<</if>>
<<if !$player.attributes || !$player.attributes.corruption || $player.attributes.corruption.value < 25>>
<<goto $player.info.currentLocation>>
<</if>>
<<set _pg = $player.gender() == "Male" ? "Male" : "Female">>
<<set $locationEventType = "Media\\Interactions\\Touch Ass\\" + _pg + "\\Male\\0.webm">>
<<Video $locationEventType>>
<<ChatMessage 'The sidewalk is packed. A stranger behind you presses closer than the crowd requires. A hand drifts - deliberate, not accidental.'>>
<div class="btn-container padding-top">
<div class="btn"><<button "Elbow them away" $player.info.currentLocation>>
<<if typeof $player.attributes.corruption.increase === 'function'>>
<<run $player.attributes.corruption.increase(0.5)>>
<</if>>
<<run $player.dailyEvents.registerEvent($player.info.id, "Downtown_GropeStranger", 1)>>
<<unset $locationEventType>>
<</button>></div>
<div class="btn"><<button "Stay still" $player.info.currentLocation>>
<<if typeof $player.attributes.corruption.increase === 'function'>>
<<run $player.attributes.corruption.increase(2)>>
<</if>>
<<run $player.status.horny.increase(10)>>
<<ChatMessage 'You let it happen. When you finally step away, the stranger is already gone.'>>
<<run $player.dailyEvents.registerEvent($player.info.id, "Downtown_GropeStranger", 1)>>
<<unset $locationEventType>>
<</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if $player.dailyEvents.isEventRegistered($player.info.id, "ParkVoyeur_Makeout")>>
<<goto $player.info.currentLocation>>
<</if>>
<<Video $locationEventType>>
<<ChatMessage 'Behind a tree two silhouettes are tangled up - hands, mouths, nothing shy about it. They have not noticed you.'>>
<div class="btn-container padding-top">
<div class="btn"><<button "Look away" $player.info.currentLocation>>
<<run $player.status.horny.increase(3)>>
<<run $player.dailyEvents.registerEvent($player.info.id, "ParkVoyeur_Makeout", 1)>>
<<unset $locationEventType>>
<</button>></div>
<div class="btn"><<button "Keep watching" $player.info.currentLocation>>
<<run $player.status.horny.increase(12)>>
<<if $player.attributes && $player.attributes.corruption && typeof $player.attributes.corruption.increase === 'function'>>
<<run $player.attributes.corruption.increase(1)>>
<</if>>
<<ChatMessage 'You stay in the shadow until they finish. Your pulse is still loud when you walk away.'>>
<<run $player.dailyEvents.registerEvent($player.info.id, "ParkVoyeur_Makeout", 1)>>
<<unset $locationEventType>>
<</button>></div>
</div>
<</nobr>><<widget "GangBaseScreen">>
<<set _siteId = _args[0]>>
<<if $gangBaseRoomSite !== _siteId>>
<<set $gangBaseRoomSite = _siteId>>
<<set $gangBaseRoom = "door">>
<</if>>
<<set _bv = gangBaseView(_siteId)>>
<<if _bv>>
<<SetBackground _bv.bg>>
<<if not _bv.inside and $gangBaseRoom !== "door">><<set $gangBaseRoom = "door">><</if>>
/* A room you can no longer enter (you left the crew, the audience ended) drops you back in the hall. */
<<if _bv.inside and $gangBaseRoom !== "door" and not _bv.rooms.includes($gangBaseRoom)>><<set $gangBaseRoom = "hall">><</if>>
<<timed 0.2s>>
<div class="centre-text"><<print _bv.label>></div>
<<print _bv.headerHtml>>
<<GangStreetMsg>>
<div class="grid-row-twice gang-base-screen">
<fieldset>
<legend>Rooms</legend>
<div class="btn-container">
<<if _bv.inside>>
<div class="btn"><<button "Main hall" _siteId>><<set $gangBaseRoom = "hall">><</button>></div>
<<if _bv.audience>>
<div class="btn"><<button "The boss's office" _siteId>><<set $gangBaseRoom = "office">><</button>></div>
<</if>>
<<if _bv.mode === "covert" or _bv.mode === "forced" or _bv.mode === "guest">>
<div class="btn"><<button "Storeroom and till" _siteId>><<set $gangBaseRoom = "stash">><</button>></div>
<div class="btn"><<button "Back room" _siteId>><<set $gangBaseRoom = "back">><</button>></div>
<</if>>
<<set _lblSpecial = _bv.specialLabel>>
<div class="btn"><<button _lblSpecial _siteId>><<set $gangBaseRoom = "special">><</button>></div>
<</if>>
</div>
<div class="btn padding-top"><<button "Back to the street" _bv.street>><<run baseLeave()>><<set $gangBaseRoom = "door">><</button>></div>
</fieldset>
<fieldset>
<<if _bv.vacant>>
<legend>Abandoned</legend>
<div class="btn-container">
<<if !streetActionDone(getGangWorld(), "search:" + _siteId)>>
<div class="btn"><<button "Search the place" _siteId>><<set $gangStreetMsg = baseSearchAbandoned(_siteId)>><<SpendTime 30>><</button>></div>
<</if>>
</div>
<div class="gang-hint">An empty base is an opportunity for whoever moves in first.</div>
<<elseif $gangBaseRoom === "door" and not _bv.inside>>
<legend>At the door</legend>
<div class="gang-hint"><<print _bv.doorLine>></div>
<div class="btn-container">
<<set _lblBribe = "Bribe the bouncer ($" + _bv.bribeCost + ")">>
<div class="btn"><<button _lblBribe _siteId>><<set $gangStreetMsg = baseBribeDoor(_siteId)>><</button>></div>
<<if _bv.canSneak>>
<div class="btn"><<button "Slip in through the back" _siteId>><<set $gangStreetMsg = baseSneakIn(_siteId)>><<SpendTime 20>><</button>></div>
<</if>>
<<if _bv.access === "enemy" or _bv.access === "cold">>
<div class="btn"><<button "Force your way in">>
<<set _guard = baseDoorGuard(_siteId)>>
<<if _guard>>
<<set $gangBaseForce = _siteId>>
<<set $interactionNpc = createGangCharacter(_guard)>>
<<set _gfControls = { attack: true, seduce: false, items: false, actions: true, forcePhysical: true }>>
<<SpendTime 10>>
<<StartFight $player $interactionNpc _gfControls "GangBaseForceWon" "GangBaseForceLost" "Fight" true>>
<</if>>
<</button>></div>
<div class="btn"><<button "Pay the street tax ($200)" _siteId>><<set $gangStreetMsg = basePayTax(_siteId)>><</button>></div>
<div class="btn"><<button "Pass a message: no trouble" _siteId>><<set $gangStreetMsg = basePassMessage(_siteId)>><</button>></div>
<</if>>
</div>
<<elseif $gangBaseRoom === "office">>
<legend>The boss's office</legend>
<<if _bv.officeLine>><div class="gang-street-lines"><p><<print _bv.officeLine>></p></div><</if>>
<<print _bv.peopleHtml>>
<div class="btn-container">
<<if !streetActionDone(getGangWorld(), "talk:" + _siteId) and _bv.access !== "owner">>
<div class="btn"><<button "Talk business" _siteId>><<set $gangStreetMsg = baseTalkLeader(_siteId)>><<SpendTime 20>><</button>></div>
<</if>>
<<GangBaseOfficeExtras _siteId>>
</div>
<<elseif $gangBaseRoom === "stash">>
<legend>Storeroom and till</legend>
<div class="gang-hint"><<print _bv.stashLine>></div>
<div class="btn-container">
<<if !streetActionDone(getGangWorld(), "steal:" + _siteId)>>
<div class="btn"><<button "Lift cash from the till" _siteId>><<set $gangStreetMsg = baseSteal(_siteId)>><<SpendTime 10>><</button>></div>
<</if>>
<<if !streetActionDone(getGangWorld(), "torch:" + _siteId)>>
<div class="btn"><<button "Torch the stock" _bv.street>><<set $gangStreetMsg = baseTorch(_siteId)>><<set $gangBaseRoom = "door">><<SpendTime 10>><</button>></div>
<</if>>
</div>
<<elseif $gangBaseRoom === "back">>
<legend>Back room</legend>
<<if _bv.backLine>><div class="gang-street-lines"><p><<print _bv.backLine>></p></div><</if>>
<div class="btn-container">
<<if !streetActionDone(getGangWorld(), "papers:" + _siteId)>>
<div class="btn"><<button "Go through their papers" _siteId>><<set $gangStreetMsg = baseReadPapers(_siteId)>><<SpendTime 20>><</button>></div>
<</if>>
<<set _frames = leverFrameView(_siteId)>>
<<for _fi, _fr range _frames>>
<<capture _fr>>
<<set _frLbl = _fr.label>>
<div class="btn"><<button _frLbl _siteId>><<set $gangStreetMsg = leverFrame(_siteId, _fr.id)>><<SpendTime 10>><</button>></div>
<</capture>>
<</for>>
<<if !streetActionDone(getGangWorld(), "bug:" + _siteId)>>
<div class="btn"><<button "Plant a bug under the table" _siteId>><<set $gangStreetMsg = basePlantBug(_siteId)>><<SpendTime 10>><</button>></div>
<</if>>
</div>
<<if _bv.captives.length gt 0>>
<div class="gang-hint">Someone is tied to a chair in the corner.</div>
<</if>>
<<elseif $gangBaseRoom === "special">>
<legend><<print _bv.specialLabel>></legend>
<<set _specialLine = baseSpecialLine(_siteId)>>
<div class="gang-street-lines"><p><<print _specialLine>></p></div>
<<else>>
<legend>Main hall</legend>
<<if _bv.hallLine>><div class="gang-street-lines"><p><<print _bv.hallLine>></p></div><</if>>
<<print _bv.peopleHtml>>
<div class="btn-container">
<<if !streetActionDone(getGangWorld(), "listen:" + _siteId) and _bv.access !== "owner">>
<div class="btn"><<button "Listen to the talk" _siteId>><<set $gangStreetMsg = baseListen(_siteId)>><<SpendTime 30>><</button>></div>
<</if>>
<<if !streetActionDone(getGangWorld(), "cards:" + _siteId) and _bv.state !== "mourning" and _bv.access !== "owner">>
<div class="btn"><<button "Sit in on a card game ($50)" _siteId>><<set $gangStreetMsg = basePlayCards(_siteId, 50)>><<SpendTime 45>><</button>></div>
<</if>>
<<if not _bv.audience>>
<<set _lblAud = (_bv.audienceCost gt 0) ? "Ask to see the boss ($" + _bv.audienceCost + ")" : "Ask to see the boss">>
<div class="btn"><<button _lblAud _siteId>><<set $gangStreetMsg = baseAskAudience(_siteId)>><<set $gangBaseRoom = "office">><</button>></div>
<</if>>
<<for _i, _fs range _bv.forSale>>
<<capture _fs>>
<<set _lblBuy = "Buy " + _fs.label + " ($" + _fs.price + " each)">>
<div class="btn"><<button _lblBuy _siteId>><<set $gangStreetMsg = baseBuy(_siteId, _fs.good, 1)>><</button>></div>
<</capture>>
<</for>>
<<for _i, _wg range _bv.wanted>>
<<capture _wg>>
<<set _lblSell = "Sell them your " + _wg.label + " ($" + (_wg.qty * _wg.price) + ")">>
<div class="btn"><<button _lblSell _siteId>><<set $gangStreetMsg = baseSell(_siteId, _wg.good)>><</button>></div>
<</capture>>
<</for>>
<<GangBaseHallExtras _siteId>>
</div>
<</if>>
</fieldset>
</div>
<</timed>>
<</if>>
<</widget>>
/* Working for the gang that holds the base (GNG7). The player's own base (GNG8)
adds its buttons here as well. */
<<widget "GangBaseHallExtras">>
<<set _hq = hqBaseView(_args[0])>>
<<if _hq.owner>>
<<set _sgv = bossWarView()>>
<<if _sgv and _sgv.siegeTonight>>
<div class="btn"><<button "Stand at the door: face their champion">>
<<set _champ = bossPrepareSiegeDuel()>>
<<if _champ>>
<<set $interactionNpc = _champ>>
<<set _gfControls = { attack: true, seduce: false, items: false, actions: true, forcePhysical: true }>>
<<StartFight $player $interactionNpc _gfControls "GangSiegeWon" "GangSiegeLost" "Fight" true>>
<<else>>
<<set $gangStreetMsg = "<p>You already stood at the door tonight.</p>">>
<<GangSidebarOn>><<goto $player.info.currentLocation>>
<</if>>
<</button>></div>
<</if>>
<div class="btn"><<button "Your people" "GangHQ">><<set $gangHqTab = "crew">><</button>></div>
<div class="btn"><<button "New faces" "GangHQ">><<set $gangHqTab = "recruits">><</button>></div>
<</if>>
<<set _hx = careerBaseView(_args[0])>>
<<if _hx.askWork>>
<div class="btn"><<button "Ask a lieutenant for work">>
<<set $gangRecruitId = _hx.gangId>>
<<run careerAskForWork(_hx.gangId)>>
<<goto "GangRecruit">>
<</button>></div>
<</if>>
<<if _hx.mine>>
<div class="btn"><<button "Look at the job board" "GangHub">><<set $gangHubTab = "crew">><</button>></div>
<<if _hx.envelope gt 0>>
<<set _hxEnv = "Collect your envelope ($" + _hx.envelope + ")">>
<div class="btn"><<button _hxEnv _args[0]>><<set $gangStreetMsg = careerCollectEnvelope()>><</button>></div>
<</if>>
<<if _hx.canInitiate or _hx.initiating>>
<<set _hxInit = _hx.initiating ? "Your initiation" : "Ask to be made">>
<div class="btn"><<button _hxInit "GangInitiation">><</button>></div>
<</if>>
/* A hangaround or an ally owes nobody an audience to stop showing up. */
<<if _hx.hangaround>>
<div class="btn"><<button "Stop working for them" "GangLeave">><</button>></div>
<</if>>
<</if>>
<</widget>>
<<widget "GangBaseOfficeExtras">>
<<set _hqo = hqBaseView(_args[0])>>
<<if _hqo.owner>>
<div class="btn"><<button "Run the crew" "GangHQ">><</button>></div>
<div class="btn"><<button "The building" "GangHQ">><<set $gangHqTab = "base">><</button>></div>
<div class="btn"><<button "The treasury" "GangHQ">><<set $gangHqTab = "money">><</button>></div>
<</if>>
<<set _ox = careerBaseView(_args[0])>>
<<GangPowerOffice _args[0]>>
<<if bossFavoriteOffered(_args[0])>><<GangSceneButton "Stay for a drink with the boss" "bossFavorite">><</if>>
<<if leverInformView(_args[0])>>
<div class="btn"><<button "Offer to sell them your own crew's plans" _args[0]>><<set $gangStreetMsg = leverInform(_args[0])>><</button>></div>
<</if>>
<<if _ox.mine>>
<<if _ox.titlePending>>
<div class="btn"><<button "Become an Enforcer" _args[0]>><<set $gangStreetMsg = careerChooseTitle("enforcer")>><</button>></div>
<div class="btn"><<button "Become an Earner" _args[0]>><<set $gangStreetMsg = careerChooseTitle("earner")>><</button>></div>
<</if>>
<<if _ox.canAskBlock>>
<div class="btn"><<button "Ask for a block of your own" _args[0]>><<set $gangStreetMsg = careerAskBlock()>><<SpendTime 20>><</button>></div>
<</if>>
<<if not _ox.hangaround>>
<div class="btn"><<button "Leave the crew" "GangLeave">><</button>></div>
<</if>>
<</if>>
<</widget>><<nobr>>
<<include "UpdateAll">>
<<set _site = $gangBaseForce>>
<<set _msg = baseForceResult(_site, true)>>
<<unset $gangBaseForce>>
<<unset $interactionNpc>>
<<set $gangBaseRoom = "hall">>
<<SetBackground>>
<div class="gang-screen gang-ui">
<div class="gang-street-msg"><<print _msg>></div>
<div class="btn padding-top"><<button "Go inside" _site>><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _site = $gangBaseForce>>
<<set _msg = baseForceResult(_site, false)>>
<<set _street = siteStreet(_site)>>
<<unset $gangBaseForce>>
<<unset $interactionNpc>>
<<SetBackground>>
<div class="gang-screen gang-ui">
<div class="gang-street-msg"><<print _msg>></div>
<div class="btn padding-top"><<button "Crawl away" _street>><</button>></div>
</div>
<</nobr>><<nobr>><<include "UpdateAll">><<SaveLocation>><<EachLoc>><<GangBaseScreen "GB_DiveBar">><</nobr>><<nobr>><<include "UpdateAll">><<SaveLocation>><<EachLoc>><<GangBaseScreen "GB_Tenement">><</nobr>><<nobr>><<include "UpdateAll">><<SaveLocation>><<EachLoc>><<GangBaseScreen "GB_Chapel">><</nobr>><<nobr>><<include "UpdateAll">><<SaveLocation>><<EachLoc>><<GangBaseScreen "GB_Laundromat">><</nobr>><<nobr>><<include "UpdateAll">><<SaveLocation>><<EachLoc>><<GangBaseScreen "GB_RailDepot">><</nobr>><<nobr>><<include "UpdateAll">><<SaveLocation>><<EachLoc>><<GangBaseScreen "GB_Garage">><</nobr>><<nobr>><<include "UpdateAll">><<SaveLocation>><<EachLoc>><<GangBaseScreen "GB_Docks">><</nobr>><<nobr>><<include "UpdateAll">><<SaveLocation>><<EachLoc>><<GangBaseScreen "GB_Foundry">><</nobr>><<nobr>><<include "UpdateAll">><<SaveLocation>><<EachLoc>><<GangBaseScreen "GB_Salon">><</nobr>><<nobr>><<include "UpdateAll">><<SaveLocation>><<EachLoc>><<GangBaseScreen "GB_Arcade">><</nobr>><<nobr>><<include "UpdateAll">><<SaveLocation>><<EachLoc>><<GangBaseScreen "GB_Penthouse">><</nobr>><<nobr>><<include "UpdateAll">><<SaveLocation>><<EachLoc>><<GangBaseScreen "GB_Mansion">><</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _sgMsg = bossFinishSiegeDuel(true)>>
<<unset $interactionNpc>>
<<SetBackground>>
<div class="gang-screen gang-ui">
<<if _sgMsg>><div class="gang-street-msg"><<print _sgMsg>></div><</if>>
<div class="btn padding-top"><<button "Back inside" $player.info.currentLocation>><<GangSidebarOn>><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _sgMsg = bossFinishSiegeDuel(false)>>
<<unset $interactionNpc>>
<<SetBackground>>
<div class="gang-screen gang-ui">
<<if _sgMsg>><div class="gang-street-msg"><<print _sgMsg>></div><</if>>
<div class="btn padding-top"><<button "Get up" $player.info.currentLocation>><<GangSidebarOn>><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground>>
<<set _fv = foundView()>>
<div class="gang-found gang-ui">
<div class="centre-text">Your own crew</div>
<<GangStreetMsg>>
<<if not _fv>>
<<GangSidebarOn>><<goto $player.info.currentLocation>>
<<elseif _fv.blocker>>
<div class="gang-street-msg"><p><<print _fv.blocker>></p></div>
<div class="btn padding-top"><<button "Back" "GangHub">><</button>></div>
<<else>>
<<if !$gangFoundName>><<set $gangFoundName = "">><</if>>
<fieldset>
<legend>Name</legend>
<div class="gang-found-name">
<<textbox "$gangFoundName" $gangFoundName>>
<div class="btn"><<button "Suggest a name" "GangFound">><<run foundSuggestName()>><</button>></div>
</div>
</fieldset>
<fieldset>
<legend>What you stand for</legend>
<div class="btn-container">
<<for _i, _id range _fv.ideologies>>
<<capture _id>>
<<set _idLbl = _id.label>>
<<set _idCls = _id.selected ? "btn is-picked" : "btn">>
<<if _id.allowed>>
<div @class="_idCls"><<button _idLbl "GangFound">><<run foundPick("ideology", _id.id)>><</button>></div>
<</if>>
<</capture>>
<</for>>
</div>
<<if _fv.ideologyHtml>><div class="gang-street-lines"><<print _fv.ideologyHtml>></div><</if>>
</fieldset>
<fieldset>
<legend>Colors</legend>
<div class="btn-container">
<<for _i, _c range _fv.colors>>
<<capture _c>>
<<set _cLbl = _c.label>>
<<set _cCls = _c.selected ? "btn is-picked" : "btn">>
<div class="gang-found-color"><<print _c.swatch>><div @class="_cCls"><<button _cLbl "GangFound">><<run foundPick("color", _c.hex)>><</button>></div></div>
<</capture>>
<</for>>
</div>
</fieldset>
<fieldset>
<legend>Headquarters</legend>
<<for _i, _s range _fv.sites>>
<<capture _s>>
<<set _sRow = _s.selected ? "gang-job-row gang-job-row--picked" : "gang-job-row">>
<div @class="_sRow">
<<set _sLine = _s.label + " · up to level " + _s.cap + " · " + _s.held>>
<div><<print _sLine>></div>
<div class="btn-container">
<<if _s.rent gt 0>>
<<set _sRent = "Rent ($" + _s.rent + " a week)">>
<div class="btn"><<button _sRent "GangFound">><<run foundPick("site", _s.id)>><<run foundPick("mode", "rent")>><</button>></div>
<</if>>
<<set _sBuy = "Buy ($" + _s.price + ")">>
<div class="btn"><<button _sBuy "GangFound">><<run foundPick("site", _s.id)>><<run foundPick("mode", "buy")>><</button>></div>
</div>
</div>
<</capture>>
<</for>>
</fieldset>
<div class="gang-street-lines"><<print _fv.summaryHtml>></div>
<<if _fv.issue>>
<div class="gang-hint"><<print _fv.issue>></div>
<div class="btn"><<button "Check again" "GangFound">><</button>></div>
<<else>>
<<set _fCost = "Found the crew ($" + _fv.cost + ")">>
<div class="btn"><<button _fCost "GangCrewResult">>
<<set $gangCareerMsg = foundCommit()>>
<<set $gangCareerNext = "GangHub">>
<<set $gangHubTab = "crew">>
<</button>></div>
<</if>>
<div class="btn padding-top"><<button "Back" "GangHub">><</button>></div>
<</if>>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground>>
<<if !$gangHqTab>><<set $gangHqTab = "crew">><</if>>
<<set _hv = hqView()>>
<<if not _hv>>
<<GangSidebarOn>><<goto $player.info.currentLocation>>
<<else>>
<div class="gang-hq gang-ui">
<div class="centre-text"><<print _hv.name>></div>
<div class="gang-tabs">
<<GangTab "Your people" "GangHQ" "gangHqTab" "crew">>
<<GangTab "Orders" "GangHQ" "gangHqTab" "orders">>
<<GangTab "New faces" "GangHQ" "gangHqTab" "recruits">>
<<GangTab "The building" "GangHQ" "gangHqTab" "base">>
<<GangTab "Treasury" "GangHQ" "gangHqTab" "money">>
<<GangTab "The code" "GangHQ" "gangHqTab" "code">>
<<GangTab "Report" "GangHQ" "gangHqTab" "report">>
<div class="btn gang-tabs__back"><<button "Back" $player.info.currentLocation>><<GangSidebarOn>><<set $gangHqSel = 0>><</button>></div>
</div>
<<GangStreetMsg>>
<<GangWarPanel>>
<<if $gangHqTab === "crew">>
<<set _hcLine = "People: " + _hv.crewCount + " of " + _hv.cap>>
<p class="gang-hint"><<print _hcLine>></p>
<<if _hv.sel>>
<<set _selName = "Orders for " + _hv.sel.name>>
<fieldset>
<legend><<print _selName>></legend>
<div class="btn-container">
<<for _i, _g range _hv.sel.guard>>
<<capture _g>>
<<set _gLbl = _g.label>>
<div class="btn"><<button _gLbl "GangHQ">><<set $gangStreetMsg = hqSetPost(_hv.sel.id, "guard", _g.turf)>><</button>></div>
<</capture>>
<</for>>
<<for _i, _w range _hv.sel.watch>>
<<capture _w>>
<<set _wLbl = _w.label>>
<div class="btn"><<button _wLbl "GangHQ">><<set $gangStreetMsg = hqSetPost(_hv.sel.id, "watch", _w.turf)>><</button>></div>
<</capture>>
<</for>>
<div class="btn"><<button "Find new people" "GangHQ">><<set $gangStreetMsg = hqSetPost(_hv.sel.id, "recruit")>><</button>></div>
<div class="btn"><<button "Train" "GangHQ">><<set $gangStreetMsg = hqSetPost(_hv.sel.id, "train")>><</button>></div>
<div class="btn"><<button "Rest" "GangHQ">><<set $gangStreetMsg = hqSetPost(_hv.sel.id, "rest")>><</button>></div>
<div class="btn"><<button "Watch my back" "GangHQ">><<set $gangStreetMsg = hqSetPost(_hv.sel.id, "bodyguard")>><</button>></div>
<<set _lo = loungeOffers(_hv.sel.id)>>
<<if _lo.company>><div class="btn"><<button "Spend the evening with them" "GangHQ">><<set $gangStreetMsg = spendTimeWith(_hv.sel.id)>><<SpendTime 60>><</button>></div><</if>>
<<set _loRefs = { memberId: _hv.sel.id }>>
<<if _lo.lover>><<GangSceneButton "Spend the night with them" "crewLover" _loRefs>><</if>>
<<if _lo.victory>><<GangSceneButton "Celebrate the win with them" "victoryNight" _loRefs>><</if>>
<<for _i, _pk range _hv.sel.perks>>
<<capture _pk>>
<<set _pkLbl = _pk.label>>
<div class="btn"><<button _pkLbl "GangHQ">><<set $gangStreetMsg = hqChoosePerk(_hv.sel.id, _pk.id)>><</button>></div>
<div class="gang-hint"><<print _pk.text>></div>
<</capture>>
<</for>>
<<if _hv.sel.status === "post">>
<div class="btn"><<button "Stand down" "GangHQ">><<set $gangStreetMsg = hqStandDown(_hv.sel.id)>><<set $gangHqSel = 0>><</button>></div>
<</if>>
<div class="btn"><<button "Let them go" "GangHQ">><<set $gangStreetMsg = hqLetGo(_hv.sel.id)>><</button>></div>
<div class="btn"><<button "Close" "GangHQ">><<set $gangHqSel = 0>><</button>></div>
</div>
</fieldset>
<</if>>
<<if _hv.crew.length is 0>><p class="gang-hint">Nobody works for you. Find new faces.</p><</if>>
<div class="gang-people">
<<for _i, _m range _hv.crew>>
<<capture _m>>
<div class="gang-crew-slot">
<<print _m.html>>
<<if _m.canOrder and _hv.atHq>>
<div class="btn"><<button "Orders" "GangHQ">><<set $gangHqSel = _m.id>><</button>></div>
<</if>>
</div>
<</capture>>
<</for>>
</div>
<<if not _hv.atHq>><p class="gang-hint">Orders are given at the HQ, face to face.</p><</if>>
<<set _jailed = jailedCrew()>>
<<for _i, _jl range _jailed>>
<<capture _jl>>
<<set _jlLbl = _jl.label>>
<div class="btn"><<button _jlLbl "GangHQ">><<set $gangStreetMsg = hqBail(_jl.id)>><</button>></div>
<</capture>>
<</for>>
<<if _hv.atHq>><<GangCaptivesPanel>><</if>>
<<elseif $gangHqTab === "orders">>
<<GangOrdersPanel _hv.atHq>>
<<elseif $gangHqTab === "code">>
<<GangCodePanel _hv.atHq>>
<<GangCopPanel _hv.atHq>>
<<elseif $gangHqTab === "report">>
<<set _rep = reportHtml()>>
<div class="gang-street-lines"><<print _rep>></div>
<<elseif $gangHqTab === "recruits">>
<<if _hv.atHq>>
<<set _rfLbl = "Put the word out for new faces ($" + _hv.refreshCost + ")">>
<div class="btn"><<button _rfLbl "GangHQ">><<set $gangStreetMsg = hqRefreshPool()>><</button>></div>
<</if>>
<div class="gang-people">
<<for _i, _r range _hv.pool>>
<<capture _r>>
<div class="gang-crew-slot">
<<print _r.html>>
<<if _hv.atHq>>
<<set _rLbl = "Take them on ($" + _r.cost + ")">>
<div class="btn"><<button _rLbl "GangHQ">><<set $gangStreetMsg = hqHire(_r.id)>><</button>></div>
<</if>>
</div>
<</capture>>
<</for>>
</div>
<p class="gang-hint">New faces change after you sleep. People on "Find new people" bring more.</p>
<<elseif $gangHqTab === "base">>
<div class="gang-street-lines"><<print _hv.baseHtml>></div>
<<if _hv.atHq>>
<<if _hv.upgrade.blocked>>
<p class="gang-hint"><<print _hv.upgrade.blocked>></p>
<<else>>
<<set _upLbl = "Grow the HQ ($" + _hv.upgrade.cost + ")">>
<div class="btn"><<button _upLbl "GangHQ">><<set $gangStreetMsg = hqUpgrade()>><</button>></div>
<</if>>
<div class="gang-rooms">
<<for _i, _md range _hv.modules>>
<<capture _md>>
<<set _mdCls = (_md.level gt 0) ? "gang-room gang-room--built" : "gang-room">>
<div @class="_mdCls">
<div class="gang-room__head"><b><<print _md.name>></b><span class="gang-room__pips"><<print _md.pips>></span></div>
<div class="gang-room__line"><<print _md.nowLine>></div>
<<if _md.nextLine>><div class="gang-room__line gang-room__line--next"><<print _md.nextLine>></div><</if>>
<div class="gang-room__upkeep">Upkeep <<print _md.upkeep>></div>
<<if _md.blocked>>
<div class="gang-hint"><<print _md.blocked>></div>
<<else>>
<<set _mdLbl = ((_md.level gt 0) ? "Expand" : "Build") + " ($" + _md.cost + ")">>
<div class="btn"><<button _mdLbl "GangHQ">><<set $gangStreetMsg = hqBuild(_md.id)>><</button>></div>
<</if>>
</div>
<</capture>>
<</for>>
</div>
<</if>>
<<if not _hv.hasHq>>
<<for _i, _mv range _hv.moves>>
<<capture _mv>>
<div class="gang-job-row">
<div><<print _mv.label>></div>
<div class="btn-container">
<<if _mv.rent gt 0>>
<<set _mvRent = "Rent ($" + _mv.rent + " a week)">>
<div class="btn"><<button _mvRent "GangHQ">><<set $gangStreetMsg = hqRelocate(_mv.id, "rent")>><</button>></div>
<</if>>
<<set _mvBuy = "Buy ($" + _mv.price + ")">>
<div class="btn"><<button _mvBuy "GangHQ">><<set $gangStreetMsg = hqRelocate(_mv.id, "buy")>><</button>></div>
</div>
</div>
<</capture>>
<</for>>
<</if>>
<<else>>
<div class="gang-treasury"><<print _hv.treasuryHtml>></div>
<<if _hv.atHq>>
<div class="btn-container gang-pair-grid">
<div class="btn"><<button "Put $500 in" "GangHQ">><<set $gangStreetMsg = hqDeposit(500)>><</button>></div>
<div class="btn"><<button "Put $2000 in" "GangHQ">><<set $gangStreetMsg = hqDeposit(2000)>><</button>></div>
<div class="btn"><<button "Take $500 out through a fence" "GangHQ">><<set $gangStreetMsg = hqWithdraw(500)>><</button>></div>
<div class="btn"><<button "Take $2000 out through a fence" "GangHQ">><<set $gangStreetMsg = hqWithdraw(2000)>><</button>></div>
</div>
<p class="gang-hint">A fence keeps 30 cents of every dirty dollar he cleans for you.</p>
<<if _hv.cleanReady gt 0>>
<<set _clLbl = "Collect clean money ($" + _hv.cleanReady + ")">>
<div class="btn"><<button _clLbl "GangHQ">><<set $gangStreetMsg = hqCollectClean()>><</button>></div>
<</if>>
<fieldset>
<legend>Storeroom</legend>
<<for _i, _st range _hv.stock>>
<<capture _st>>
<div class="gang-stock-row">
<<set _stQty = _st.qty + " in store">>
<<set _stPrice = "buy $" + _st.buy + ", sell $" + _st.sell + " each">>
<div class="gang-stock-row__name"><b><<print _st.label>></b><span><<print _stQty>></span><span class="gang-hint"><<print _stPrice>></span></div>
<div class="btn-container">
<<set _stBuy = "Buy 5 ($" + (_st.buy * 5) + ")">>
<div class="btn"><<button _stBuy "GangHQ">><<set $gangStreetMsg = hqBuyGood(_st.good, 5)>><</button>></div>
<<if _st.qty gt 0>>
<<set _stSell = "Sell all ($" + (_st.sell * _st.qty) + ")">>
<div class="btn"><<button _stSell "GangHQ">><<set $gangStreetMsg = hqSellGood(_st.good)>><</button>></div>
<</if>>
</div>
</div>
<</capture>>
<</for>>
<<if _hv.bag>>
<div class="btn"><<button "Empty your bag into the storeroom" "GangHQ">><<set $gangStreetMsg = hqHandOverBag()>><</button>></div>
<</if>>
</fieldset>
<<set _spv = spotsViewNow()>>
<<if _spv>>
<fieldset>
<legend>Your spots</legend>
<<if _spv.spots.length is 0 and _spv.open.length is 0>>
<div class="gang-hint">Your crew runs no spots yet. Take a block and you can open one there.</div>
<</if>>
<<for _i, _sp range _spv.spots>>
<<capture _sp>>
<div class="gang-stock-row">
<<set _spLvl = "Level " + _sp.level + " of 3">>
<div class="gang-stock-row__name"><b><<print _sp.label>></b><span class="gang-hint"><<print _spLvl>></span></div>
<<if _sp.cost gt 0>>
<<set _spLbl = "Expand ($" + _sp.cost + ")">>
<div class="btn"><<button _spLbl "GangHQ">><<set $gangStreetMsg = spotExpand(_sp.turf, _sp.venueId)>><</button>></div>
<<else>>
<div class="gang-hint">As big as it gets.</div>
<</if>>
</div>
<</capture>>
<</for>>
<<for _i, _op range _spv.open>>
<<capture _op>>
<div class="gang-stock-row">
<<set _opLine = "Room for a new spot on " + _op.label>>
<div class="gang-stock-row__name"><b><<print _opLine>></b></div>
<<set _opLbl = "Open one ($" + _op.cost + ")">>
<div class="btn"><<button _opLbl "GangHQ">><<set $gangStreetMsg = spotOpen(_op.turf)>><</button>></div>
</div>
<</capture>>
<</for>>
</fieldset>
<</if>>
<</if>>
<</if>>
</div>
<</if>>
<</nobr>>/* War, demands and a storm coming at the HQ (GNG11). */
<<widget "GangWarPanel">>
<<set _wv = bossWarView()>>
<<if _wv>>
<<if _wv.warHtml or _wv.siege or _wv.ultimatums.length gt 0>>
<div class="gang-war-panel">
<<if _wv.warHtml>>
<<print _wv.warHtml>>
<<if _wv.canSuePeace>>
<div class="btn"><<button "Send a messenger: ask for peace" `passage()`>><<set $gangStreetMsg = leverSuePeace(0)>><</button>></div>
<</if>>
<</if>>
<<if _wv.siege>><div class="gang-promotion gang-war-panel__siege"><<print _wv.siege>></div><</if>>
<<for _i, _ul range _wv.ultimatums>>
<<capture _ul>>
<div class="gang-job-row">
<div><<print _ul.text>></div>
<div class="btn-container">
<div class="btn"><<button "Give them what they want" `passage()`>><<set $gangStreetMsg = bossAnswerUltimatum(_ul.id, true)>><</button>></div>
<div class="btn"><<button "Tell them where to go" `passage()`>><<set $gangStreetMsg = bossAnswerUltimatum(_ul.id, false)>><</button>></div>
<div class="btn"><<button "Haggle at a sit-down" `passage()`>><<set $gangStreetMsg = leverHaggle(_ul.id)>><<SpendTime 60>><</button>></div>
<<set _swRefs = { ultimatumId: _ul.id }>>
<<GangSceneButton "Sweeten the deal in private" "sweeten" _swRefs>>
<div class="btn"><<button "Wreck the sit-down">>
<<set _wrc = leverPrepareWreck(_ul.id)>>
<<if _wrc>>
<<set $interactionNpc = _wrc>>
<<set _gfControls = { attack: true, seduce: false, items: false, actions: true, forcePhysical: true }>>
<<StartFight $player $interactionNpc _gfControls "GangWreckWon" "GangWreckLost" "Fight" true>>
<</if>>
<</button>></div>
</div>
</div>
<</capture>>
<</for>>
</div>
<</if>>
<</if>>
<</widget>>
/* The order board: pick a job, how to do it and who goes (plan §9.1). */
<<widget "GangOrdersPanel">>
<<set _ov = ordersView()>>
<<set _ovAtHq = _args[0]>>
<<if _ov>>
<<set _ovLine = "Jobs running: " + _ov.runningCount + " of " + _ov.limit>>
<p class="gang-hint"><<print _ovLine>></p>
<<if _ov.runningHtml>><div class="gang-street-lines"><<print _ov.runningHtml>></div><</if>>
<<if not _ovAtHq>>
<p class="gang-hint">Orders are given at the HQ.</p>
<<else>>
<<for _i, _ob range _ov.board>>
<<capture _ob>>
<<set _obRow = _ob.selected ? "gang-job-row gang-job-row--picked" : "gang-job-row">>
<div @class="_obRow">
<<print _ob.html>>
<<set _obLbl = _ob.selected ? "Planning this one" : "Plan it">>
<div class="btn"><<button _obLbl "GangHQ">><<run orderPick(_ob.id)>><</button>></div>
</div>
<</capture>>
<</for>>
<<if _ov.board.length is 0>><p class="gang-hint">No new work until tomorrow.</p><</if>>
<<if _ov.job>>
<fieldset>
<legend><<print _ov.job.title>></legend>
<div class="gang-subhead">How</div>
<div class="btn-container">
<<for _i, _oa range _ov.job.approaches>>
<<capture _oa>>
<<set _oaLbl = _oa.label>>
<<set _oaCls = _oa.selected ? "btn is-picked" : "btn">>
<div @class="_oaCls"><<button _oaLbl "GangHQ">><<run orderApproach(_oa.id)>><</button>></div>
<</capture>>
<</for>>
</div>
<div class="gang-subhead">Who goes</div>
<div class="btn-container">
<<for _i, _oc range _ov.crew>>
<<capture _oc>>
<<set _ocLbl = _oc.label>>
<<set _ocCls = _oc.picked ? "btn is-picked" : "btn">>
<div @class="_ocCls"><<button _ocLbl "GangHQ">><<run orderToggle(_oc.id)>><</button>></div>
<</capture>>
<</for>>
</div>
<<if _ov.risk>>
<<set _ovRisk = "Odds: " + _ov.risk + "; " + _ov.heat + ".">>
<p class="gang-hint"><<print _ovRisk>></p>
<</if>>
<<if _ov.issue>>
<p class="gang-hint"><<print _ov.issue>></p>
<<else>>
<div class="btn"><<button "Send them" "GangHQ">><<set $gangStreetMsg = orderSend()>><</button>></div>
<</if>>
</fieldset>
<</if>>
<</if>>
<</if>>
<</widget>>
/* The detective on the payroll (plan §12.3). */
<<widget "GangCopPanel">>
<<set _copv = copView()>>
<<if _copv>>
<fieldset>
<legend>Your detective</legend>
<<if not _copv.has>>
<p class="gang-hint">A detective on the payroll warns you before a raid, makes a jailed member's file disappear once a week and reads you the police file on any crew. Only while the crew pays the police.</p>
<<if _args[0]>>
<<if _copv.onPayroll>>
<<set _copLbl = "Pay the police again and call your detective">>
<<else>>
<<set _copLbl = "Put a detective on the payroll ($" + _copv.cost + ")">>
<</if>>
<div class="btn"><<button _copLbl "GangHQ">><<set $gangStreetMsg = cityHireCop()>><</button>></div>
<</if>>
<<else>>
<p class="gang-hint">Your detective answers on the second ring. Ask about a crew from its dossier.</p>
<<for _i, _cj range _copv.jailed>>
<<capture _cj>>
<<set _cjLbl = _cj.label>>
<div class="btn"><<button _cjLbl "GangHQ">><<set $gangStreetMsg = cityCopFree(_cj.id)>><</button>></div>
<</capture>>
<</for>>
<</if>>
</fieldset>
<</if>>
<</widget>>
/* The crew's code (plan §9.4). */
<<widget "GangCodePanel">>
<<set _cdv = codeView()>>
<<set _cdAtHq = _args[0]>>
<<if _cdv>>
<<for _i, _pol range _cdv>>
<<capture _pol>>
<div class="gang-job-row">
<<set _polLine = _pol.label + ": " + _pol.current>>
<div><b><<print _polLine>></b></div>
<div class="gang-hint"><<print _pol.hint>></div>
<<if _cdAtHq>>
<div class="btn-container">
<<for _j, _po range _pol.options>>
<<capture _po>>
<<set _poLbl = _po.label>>
<<set _poCls = _po.selected ? "btn is-picked" : "btn">>
<div @class="_poCls"><<button _poLbl "GangHQ">><<set $gangStreetMsg = codeSet(_pol.id, _po.id)>><</button>></div>
<</capture>>
<</for>>
</div>
<</if>>
</div>
<</capture>>
<</for>>
<</if>>
<</widget>>
/* The boss half of the "My crew" tab. */
<<widget "GangBossPanel">>
<<set _bp = bossPanelView()>>
<<if _bp>>
<<print _bp.html>>
<<GangWarPanel>>
<div class="btn-container">
<<if _bp.atHq>>
<div class="btn"><<button "Run the crew" "GangHQ">><</button>></div>
<<elseif _bp.hq>>
<div class="btn"><<button "Go to your HQ">><<run bossGoHq()>><</button>></div>
<div class="btn"><<button "Look at your people" "GangHQ">><</button>></div>
<<else>>
<div class="btn"><<button "Find a new HQ" "GangHQ">><<set $gangHqTab = "base">><</button>></div>
<</if>>
</div>
<</if>>
<</widget>><<nobr>>
<<include "UpdateAll">>
<<SetBackground>>
<<set _jv = careerJobView($gangJobId)>>
<div class="gang-screen gang-ui">
<<if not _jv>>
<div class="gang-street-msg"><p>That job is not yours anymore.</p></div>
<div class="btn padding-top"><<button "Back" $player.info.currentLocation>><<GangSidebarOn>><</button>></div>
<<else>>
<<print _jv.html>>
<<if not _jv.atPlace>>
<div class="gang-hint">You are not where this job is done.</div>
<<elseif _jv.stage === "stop">>
<div class="gang-hint">The police are still waiting on you.</div>
<div class="btn"><<button "Face them" "GangJobResult">><</button>></div>
<<else>>
<div class="btn-container">
<<for _i, _ap range _jv.approaches>>
<<capture _ap>>
<<set _apLbl = _ap.label>>
<<if _ap.disabled>>
<div class="btn non-interacting"><<button _apLbl>><</button>></div>
<div class="gang-hint"><<print _ap.disabled>></div>
<<elseif _ap.fight>>
<div class="btn gang-risk--fight"><<button _apLbl>>
<<set _gjf = careerPrepareJobFight($gangJobId)>>
<<if _gjf>>
<<set $interactionNpc = _gjf>>
<<set _gfControls = { attack: true, seduce: false, items: false, actions: true, forcePhysical: true }>>
<<SpendTime 15>>
<<StartFight $player $interactionNpc _gfControls "GangJobFightWon" "GangJobFightLost" "Fight" true>>
<</if>>
<</button>></div>
<<else>>
<<set _apCls = "btn gang-risk--" + _ap.band>>
<div @class="_apCls"><<button _apLbl "GangJobResult">>
<<set _gjMin = careerDoJob($gangJobId, _ap.id)>>
<<if _gjMin gt 0>><<SpendTime _gjMin>><</if>>
<</button>></div>
<</if>>
<</capture>>
<</for>>
</div>
<<if _jv.honeytrap>>
<<set _htRefs = { jobId: $gangJobId }>>
<<GangSceneButton "Take them to the back room" "honeytrap" _htRefs>>
<</if>>
<</if>>
<div class="btn padding-top"><<button "Not now" $player.info.currentLocation>><<GangSidebarOn>><</button>></div>
<</if>>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground>>
<<set _jr = $gangJobResult>>
<div class="gang-screen gang-ui">
<<if not _jr>>
<<GangSidebarOn>><<goto $player.info.currentLocation>>
<<else>>
<div class="gang-street-msg"><<print _jr.html>></div>
<<if _jr.stop>>
<<set _jsv = careerJobView(_jr.jobId)>>
<<if _jsv and _jsv.stage === "stop">>
<div class="btn-container">
<<for _i, _so range _jsv.stopOptions>>
<<capture _so>>
<<set _soLbl = _so.label>>
<<if _so.disabled>>
<div class="btn non-interacting"><<button _soLbl>><</button>></div>
<<else>>
<div class="btn"><<button _soLbl "GangJobResult">>
<<set _soMin = careerStopChoice(_jr.jobId, _so.id)>>
<<if _soMin gt 0>><<SpendTime _soMin>><</if>>
<</button>></div>
<</if>>
<</capture>>
<</for>>
</div>
<<else>>
<div class="btn padding-top"><<button "Continue" $player.info.currentLocation>><<GangSidebarOn>><<unset $gangJobResult>><</button>></div>
<</if>>
<<elseif _jr.offer>>
<<set _pkRefs = { jobId: _jr.jobId }>>
<<GangSceneButton "Accept the arrangement" "payInKind" _pkRefs>>
<div class="btn"><<button "Give them three days" "GangJobResult">><<run careerPostponeJob(_jr.jobId)>><</button>></div>
<div class="btn"><<button "Money or nothing: the job is blown" "GangJobResult">><<run careerRefuseOffer(_jr.jobId)>><</button>></div>
<<elseif _jr.next === "Police_Stop">>
<div class="btn padding-top"><<button "Face the police" "Police_Stop">><<unset $gangJobResult>><</button>></div>
<<else>>
<<set _jrNext = _jr.next || $player.info.currentLocation>>
<div class="btn padding-top"><<button "Continue" _jrNext>><<GangSidebarOn _jrNext>><<unset $gangJobResult>><</button>></div>
<</if>>
<</if>>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<run careerFinishFight(true)>>
<<unset $interactionNpc>>
<<goto "GangJobResult">>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<run careerFinishFight(false)>>
<<unset $interactionNpc>>
<<goto "GangJobResult">>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _gcfNext = careerFinishFight(true)>>
<<unset $interactionNpc>>
<<if _gcfNext>><<goto _gcfNext>><<else>><<goto "GangCrewResult">><</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _gcfNext = careerFinishFight(false)>>
<<unset $interactionNpc>>
<<if _gcfNext>><<goto _gcfNext>><<else>><<goto "GangCrewResult">><</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground>>
/* Shown once: the message must not leak into the next career screen. */
<<set _gcMsg = $gangCareerMsg>>
<<set $gangCareerMsg = "">>
<div class="gang-screen gang-ui">
<<if _gcMsg>><div class="gang-street-msg"><<print _gcMsg>></div><</if>>
<<set _gcNext = $gangCareerNext || $player.info.currentLocation>>
<<set _soForced = gangSceneOfferForced()>>
<<GangSceneOffer>>
<<if not _soForced>><div class="btn padding-top"><<button "Continue" _gcNext>><<GangSidebarOn _gcNext>><</button>></div><</if>>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground>>
<<set _rv = careerRecruitView($gangRecruitId)>>
<div class="gang-screen gang-ui">
<<if not _rv>>
<<GangSidebarOn>><<goto $player.info.currentLocation>>
<<else>>
<div class="centre-text">A word on the street</div>
<div class="gang-street-msg"><<print _rv.html>></div>
<div class="btn-container">
<<if _rv.canJoin>>
<<set _rvLbl = _rv.ally ? "Work with them as an ally" : "Start as a hangaround">>
<div class="btn"><<button _rvLbl "GangCrewResult">>
<<set $gangCareerMsg = careerJoin($gangRecruitId)>>
<<set $gangCareerNext = $player.info.currentLocation>>
<</button>></div>
<</if>>
<div class="btn"><<button "Maybe later" $player.info.currentLocation>><<GangSidebarOn>><</button>></div>
</div>
<<if _rv.offerOpen>><div class="gang-hint">An offer stays open for a week. You can take it from the Streets page of your phone.</div><</if>>
<</if>>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground>>
<<set _tw = careerTurfWarnView($gangTurfWarn)>>
<div class="gang-screen gang-ui">
<<if not _tw>>
<<GangSidebarOn>><<goto $player.info.currentLocation>>
<<else>>
<div class="centre-text">Their street</div>
<div class="gang-street-msg"><<print _tw.html>></div>
<div class="btn-container">
<<set _twPay = "Pay the cut ($" + _tw.cut + ")">>
<div class="btn"><<button _twPay "GangCrewResult">><<run careerTurfPay($gangTurfWarn)>><</button>></div>
<div class="btn"><<button "Fight the collector">>
<<set _twf = careerPrepareTurfFight($gangTurfWarn)>>
<<if _twf>>
<<set $interactionNpc = _twf>>
<<set _gfControls = { attack: true, seduce: false, items: false, actions: true, forcePhysical: true }>>
<<SpendTime 10>>
<<StartFight $player $interactionNpc _gfControls "GangCareerFightWon" "GangCareerFightLost" "Fight" true>>
<</if>>
<</button>></div>
<<if _tw.canJoin>>
<<set _twJoin = _tw.ally ? "Offer to work with them" : "Offer to work for them">>
<div class="btn"><<button _twJoin "GangCrewResult">><<run careerTurfJoin($gangTurfWarn)>><</button>></div>
<</if>>
<div class="btn"><<button "Walk past them" "GangCrewResult">><<run careerTurfWalk($gangTurfWarn)>><</button>></div>
</div>
<</if>>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground>>
<<set _iv = careerInitiationView()>>
<div class="gang-screen gang-ui">
<<if not _iv>>
<<GangSidebarOn>><<goto $player.info.currentLocation>>
<<else>>
<div class="centre-text"><<print _iv.title>></div>
<<set _ivFresh = false>>
<<if $gangCareerMsg>><div class="gang-street-msg"><<print $gangCareerMsg>></div><<set $gangCareerMsg = "">><<set _ivFresh = true>><</if>>
<<if _iv.member>>
<div class="gang-hint">You are one of them now.</div>
<<elseif not _iv.started>>
<div class="gang-street-msg"><<print _iv.intro>></div>
<<if _iv.canStart>>
<<set _ivLbl = (_iv.kind === "buyIn") ? "Put the buy-in on the table ($" + _iv.buyIn + ")" : "Tell them you are ready">>
<div class="btn"><<button _ivLbl "GangInitiation">><<set $gangCareerMsg = careerStartInitiation()>><</button>></div>
<<if _iv.id === "communion">><<GangSceneButton "Kneel for the communion instead" "communion">><</if>>
<<if _iv.id === "sisters">>
<<GangSceneButton "Spend the night with the sisters instead" "sisters">>
<<if not gangNightHours()>><div class="gang-hint">The night with the sisters starts after dark.</div><</if>>
<</if>>
<<else>>
<div class="gang-hint"><<print _iv.reason>></div>
<</if>>
<<elseif _iv.kind === "fights">>
<<set _ivRound = "Round " + (_iv.progress + 1) + " of " + _iv.rounds>>
<div class="gang-hint"><<print _ivRound>></div>
<div class="btn"><<button "Step into the circle">>
<<set _jf = careerPrepareJumpIn()>>
<<if _jf>>
<<set $interactionNpc = _jf>>
<<set _gfControls = { attack: true, seduce: false, items: false, actions: true, forcePhysical: true }>>
<<SpendTime 10>>
<<StartFight $player $interactionNpc _gfControls "GangCareerFightWon" "GangCareerFightLost" "Fight" true>>
<</if>>
<</button>></div>
<<elseif _iv.kind === "buyIn">>
<div class="btn-container">
<div class="btn"><<button "Leave the envelope alone" "GangCrewResult">><<run careerBuyInTest("leave")>><</button>></div>
<div class="btn"><<button "Hand it to the first suit who comes in" "GangCrewResult">><<run careerBuyInTest("return")>><</button>></div>
<div class="btn"><<button "Slip a few bills into your pocket" "GangCrewResult">><<run careerBuyInTest("take")>><</button>></div>
</div>
<<elseif not _ivFresh>>
/* Right after the start the message above already says where to go. */
<div class="gang-hint">It is under way. Your crew page in the Streets screen shows what is left to do.</div>
<</if>>
<div class="btn padding-top"><<button "Back" $player.info.currentLocation>><<GangSidebarOn>><</button>></div>
<</if>>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground>>
<<set _lv = careerLeaveView()>>
<div class="gang-screen gang-ui">
<<if not _lv>>
<<GangSidebarOn>><<goto $player.info.currentLocation>>
<<else>>
<div class="centre-text">Walking out</div>
<<if $gangCareerMsg>><div class="gang-street-msg"><<print $gangCareerMsg>></div><<set $gangCareerMsg = "">><</if>>
<div class="btn-container">
<<if _lv.round gt 0>>
<div class="btn"><<button "Face the next one">>
<<set _bo = careerPrepareBloodOut()>>
<<if _bo>>
<<set $interactionNpc = _bo>>
<<set _gfControls = { attack: true, seduce: false, items: false, actions: true, forcePhysical: true }>>
<<StartFight $player $interactionNpc _gfControls "GangCareerFightWon" "GangCareerFightLost" "Fight" true>>
<</if>>
<</button>></div>
<<elseif _lv.hangaround>>
<div class="gang-hint">Nobody made you anything, so nobody will stop you.</div>
<div class="btn"><<button "Stop showing up" "GangCrewResult">><<run careerLeave()>><</button>></div>
<<else>>
<div class="gang-hint">You can buy your way out, or walk through them. Either way, you do not come back.</div>
<<set _lvBuy = "Buy your way out ($" + _lv.cost + ")">>
<div class="btn"><<button _lvBuy "GangCrewResult">><<run careerLeave()>><</button>></div>
<<set _lvBlood = "Blood out: fight " + _lv.rounds + " of them in a row">>
<div class="btn"><<button _lvBlood>>
<<set _bo = careerPrepareBloodOut()>>
<<if _bo>>
<<set $interactionNpc = _bo>>
<<set _gfControls = { attack: true, seduce: false, items: false, actions: true, forcePhysical: true }>>
<<SpendTime 10>>
<<StartFight $player $interactionNpc _gfControls "GangCareerFightWon" "GangCareerFightLost" "Fight" true>>
<</if>>
<</button>></div>
<</if>>
</div>
<<if _lv.round is 0>><div class="btn padding-top"><<button "Stay" $player.info.currentLocation>><<GangSidebarOn>><</button>></div><</if>>
<</if>>
</div>
<</nobr>><<widget "GangDebtCollector">>
<<set _dc = debtCollectorHere()>>
<<if _dc>>
<div class="gang-encounters"><div class="gang-encounter gang-encounter--debt">
<p><<print _dc.line>></p>
<<set _dcLine = "You owe $" + _dc.owed + ", plus a tenth for the trouble: $" + _dc.total + ".">>
<p class="gang-hint"><<print _dcLine>></p>
<div class="btn-container gang-pair-grid">
<<set _dcPay = "Pay $" + _dc.total>>
<div class="btn"><<button _dcPay `passage()`>><<set $gangStreetMsg = debtPay()>><</button>></div>
<<if _dc.canDelay>>
<div class="btn"><<button "Ask for three more days" `passage()`>><<set $gangStreetMsg = debtDelay()>><</button>></div>
<</if>>
<div class="btn"><<button "Put the collector on the ground">>
<<set _dcf = debtPrepareFight()>>
<<if _dcf>>
<<set $interactionNpc = _dcf>>
<<set _gfControls = { attack: true, seduce: false, items: false, actions: true, forcePhysical: true }>>
<<SpendTime 10>>
<<StartFight $player $interactionNpc _gfControls "GangDebtFightWon" "GangDebtFightLost" "Fight" true>>
<</if>>
<</button>></div>
</div>
</div></div>
<</if>>
<</widget>><<nobr>>
<<include "UpdateAll">>
<<set _dfMsg = debtFinishFight(true)>>
<<unset $interactionNpc>>
<<SetBackground>>
<div class="gang-screen gang-ui">
<<if _dfMsg>><div class="gang-street-msg"><<print _dfMsg>></div><</if>>
<div class="btn padding-top"><<button "Walk away" $player.info.currentLocation>><<GangSidebarOn>><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _dfMsg = debtFinishFight(false)>>
<<unset $interactionNpc>>
<<SetBackground>>
<div class="gang-screen gang-ui">
<<if _dfMsg>><div class="gang-street-msg"><<print _dfMsg>></div><</if>>
<div class="btn padding-top"><<button "Get up" $player.info.currentLocation>><<GangSidebarOn>><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground>>
<<if !$gangHubTab>><<set $gangHubTab = "map">><</if>>
<<if !$gangMapLayer>><<set $gangMapLayer = "owners">><</if>>
<<if !$gangMapZoom>><<set $gangMapZoom = "city">><</if>>
<div class="gang-hub gang-ui">
<div class="gang-hub__top">
<div class="centre-text">Streets</div>
<div class="gang-tabs">
<<GangTab "City map" "GangHub" "gangHubTab" "map">>
<<GangTab "Street Chronicle" "GangHub" "gangHubTab" "chronicle">>
<<GangTab "Dossiers" "GangHub" "gangHubTab" "dossiers">>
<<GangTab "My crew" "GangHub" "gangHubTab" "crew">>
<div class="btn gang-tabs__back"><<button "Back" $player.info.currentLocation>><<set $canShowStatsBtn = true>><<set $gameSettings.allowSaves = true>><</button>></div>
</div>
</div>
<<GangStreetMsg>>
<<if $gangHubTab === "map">>
<div class="gang-tabs gang-tabs--sub">
<<GangTab "Who holds what" "GangHub" "gangMapLayer" "owners">>
<<GangTab "Deals and wars" "GangHub" "gangMapLayer" "diplomacy">>
<<GangTab "Police heat" "GangHub" "gangMapLayer" "heat">>
<<GangTab "Rackets" "GangHub" "gangMapLayer" "rackets">>
<<if $gangMapZoom === "city">>
<div class="btn gang-tabs__back"><<button "Zoom: Skid Row" "GangHub">><<set $gangMapZoom = "skidrow">><</button>></div>
<<else>>
<div class="btn gang-tabs__back"><<button "Zoom: whole city" "GangHub">><<set $gangMapZoom = "city">><</button>></div>
<</if>>
</div>
<<if $gangMapLayer === "rackets">>
<div class="gang-hint">P protection · G gambling · S sex work · D product · L loans · F fencing · X smuggling · C chop shop</div>
<<elseif $gangMapLayer === "diplomacy">>
<div class="gang-hint">Red: war · green: alliance · grey: truce · purple: tribute · yellow dots: trade you know about</div>
<</if>>
<div class="gmap-host">
<div class="gmap-svg-host"></div>
<div class="gmap-side">
<div class="gmap-card-host"><p class="gang-hint">Pick a block on the map.</p></div>
<<set _legend = gangMapLegendHtml()>>
<<print _legend>>
</div>
</div>
<<done>><<run mountGangMap($gangMapLayer, $gangMapZoom)>><</done>>
<<elseif $gangHubTab === "chronicle">>
<div class="gang-tabs gang-tabs--sub">
<<GangTab "Everyone" "GangHub" "gangChronicleGang" "">>
<<set _ids = gangDossierIds()>>
<<for _i, _g range _ids>>
<<set _gtName = _g.name>>
<<set _gtId = _g.id>>
<<GangTab _gtName "GangHub" "gangChronicleGang" _gtId>>
<</for>>
</div>
<<set _chron = gangChronicleHtml($gangChronicleGang)>>
<div class="gang-chronicle"><<print _chron>></div>
<<elseif $gangHubTab === "crew">>
<<GangCrewPanel>>
<<else>>
<<set _ids = gangDossierIds()>>
<div class="gang-tabs gang-tabs--sub">
<<for _i, _g range _ids>>
<<set _gtName = _g.name>>
<<set _gtId = _g.id>>
<<GangTab _gtName "GangHub" "gangDossierId" _gtId>>
<</for>>
</div>
<<if $gangDossierId>>
<<set _dossier = gangDossierHtml($gangDossierId)>>
<<print _dossier>>
<<GangDossierActions $gangDossierId>>
<<else>>
<<set _list = gangDossierListHtml()>>
<div class="gang-dossier-list"><<print _list>></div>
<</if>>
<</if>>
</div>
<</nobr>><<nobr>>
<<set _dest = $gangMapTravel>>
<<unset $gangMapTravel>>
<<set $canShowStatsBtn = true>>
<<set $gameSettings.allowSaves = true>>
<<if $travelMode == "car" and ($carGasDay === getCurrentAbsoluteDay() or $player.money gte 12)>>
/* Gas is $12 a calendar day, shared with normal travel. */
<<if $carGasDay !== getCurrentAbsoluteDay()>>
<<set $player.money -= 12>>
<<set $carGasDay = getCurrentAbsoluteDay()>>
<</if>>
<<SpendTime 5>>
<<elseif $travelMode == "bus" and $player.money gte 10>>
<<set $player.money -= 10>>
<<SpendTime 10>>
<<else>>
<<SpendTime 30>>
<</if>>
<<if _dest>><<goto _dest>><<else>><<goto $player.info.currentLocation>><</if>>
<</nobr>>/* The sidebar's Streets and Phone buttons hide the sidebar; a street screen
that sends the player back to their location brings it back. Pass the
destination when it may be another street screen. */
<<widget "GangSidebarOn">>
<<if _args.length is 0 or _args[0] is $player.info.currentLocation>><<set $canShowStatsBtn = true>><</if>>
<</widget>>
/* The "My crew" tab: who you work for, your rank, your jobs and the board. */
<<widget "GangCrewPanel">>
<<set _cv = careerView()>>
<div class="gang-crew">
<<if _cv.notesHtml>><div class="gang-crew-notes"><b>From the street</b><<print _cv.notesHtml>></div><</if>>
<<set _cvBag = streetBagLine()>>
<<if _cvBag>><div class="gang-hint"><<print _cvBag>></div><</if>>
<<if _cv.debt>>
<<set _cvDebt = "Pay " + _cv.debt + " what you owe ($" + _cv.debtAmount + ")">>
<div class="btn"><<button _cvDebt "GangHub">><<set $gangStreetMsg = careerPayDebt()>><</button>></div>
<<if debtWorkOffered()>><<GangSceneButton "Work it off another way" "debtWork">><</if>>
<</if>>
<<GangHandoverPanel>>
<<set _brv = brothelView()>>
<<if _brv>>
<div class="gang-job-row">
<<print _brv.html>>
<<if _brv.demand gt 0>>
<<set _brLbl = "Pay for the brothel ($" + _brv.demand + ")">>
<div class="btn"><<button _brLbl "GangHub">><<set $gangStreetMsg = cityPayBrothel()>><</button>></div>
<</if>>
</div>
<</if>>
<<if _cv.boss>>
<<GangBossPanel>>
<<if kingEpilogueReady()>><div class="btn"><<button "Epilogue: the city is yours" "GangKing">><</button>></div><</if>>
<<elseif not _cv.affiliated>>
<p class="gang-hint">You work for nobody. Crews find people who get noticed: win a fight on Bar Row, become a regular at their bar, ring, card table or pawn counter, or walk into a base and ask for work.</p>
<<for _i, _inv range _cv.invites>>
<<capture _inv>>
<<set _invLbl = "Answer " + _inv.name>>
<div class="btn"><<button _invLbl "GangRecruit">><<set $gangRecruitId = _inv.id>><</button>></div>
<</capture>>
<</for>>
<<set _fb = foundBlockerNow()>>
<<if not _fb>>
<div class="btn"><<button "Found your own crew" "GangFound">><</button>></div>
<<else>>
<p class="gang-hint">Your own crew: <<print _fb>></p>
<</if>>
<<else>>
<<print _cv.headerHtml>>
<p class="gang-hint"><<print _cv.perk>></p>
<<if _cv.block>><p>Your block: <b><<print _cv.block>></b>. A quarter of what it earns waits for you at the base.</p><</if>>
<<if _cv.titlePending>><p class="gang-promotion">Go to the boss's office at their base and choose your road: Enforcer or Earner.</p><</if>>
<<if _cv.envelope gt 0>><p class="gang-hint">An envelope with $<<print _cv.envelope>> is waiting for you at the base.</p><</if>>
<<if _cv.hangaround and not _cv.ally>>
<<if _cv.initiating>>
<div class="btn"><<button "Your initiation" "GangInitiation">><</button>></div>
<<elseif _cv.canInitiate>>
<p class="gang-hint"><<print _cv.initTitle>></p>
<div class="btn"><<button "Ask to be made" "GangInitiation">><</button>></div>
<<else>>
<p class="gang-hint"><<print _cv.initReason>></p>
<</if>>
<</if>>
<h4>Your jobs</h4>
<<if _cv.jobs.length is 0>><p class="gang-hint">Nothing on your plate.</p><</if>>
<<for _i, _j range _cv.jobs>>
<<capture _j>>
<div class="gang-job-row">
<<print _j.html>>
<<if _j.entry>>
<<set _jGo = "Go to " + _j.where>>
<div class="btn"><<button _jGo>><<run gangMapGo(_j.entry)>><</button>></div>
<</if>>
</div>
<</capture>>
<</for>>
<h4>The board</h4>
<<if _cv.board.length is 0>><p class="gang-hint">Nothing new. The board fills up again after you sleep.</p><</if>>
<<for _i, _b range _cv.board>>
<<capture _b>>
<div class="gang-job-row">
<<print _b.html>>
<div class="btn"><<button "Take it" "GangHub">><<set $gangStreetMsg = careerAccept(_b.id)>><</button>></div>
</div>
<</capture>>
<</for>>
/* A made member (rank 3+) may walk out and start a rival crew (plan §5.6). */
<<set _fb = foundBlockerNow()>>
<<if not _fb>>
<h4>Your own crew</h4>
<p class="gang-hint">You are made. You can walk out and start a crew of your own. Your people will not forgive it.</p>
<div class="btn"><<button "Found your own crew" "GangFound">><</button>></div>
<</if>>
<</if>>
</div>
<</widget>>/* Under a gang's dossier: deals, peace, a broker's table. */
<<widget "GangDossierActions">>
<<set _ofv = offerFromView(_args[0])>>
<<if _ofv>>
<div class="gang-job-row gang-job-row--picked">
<div><<print _ofv.text>></div>
<div class="btn-container gang-pair-grid">
<div class="btn"><<button "Shake on it" "GangHub">><<set $gangStreetMsg = offerAnswer($gangDossierId, true)>><</button>></div>
<div class="btn"><<button "Send them away" "GangHub">><<set $gangStreetMsg = offerAnswer($gangDossierId, false)>><</button>></div>
</div>
</div>
<</if>>
<<set _dv = leverDossierView(_args[0])>>
<<if _dv>>
<div class="btn-container gang-dossier-actions">
<<for _i, _pr range _dv.proposals>>
<<capture _pr>>
<<set _prLbl = _pr.label>>
<div class="btn"><<button _prLbl "GangHub">><<set $gangStreetMsg = leverPropose(_dv.gangId, _pr.kind)>><</button>></div>
<</capture>>
<</for>>
<<if _dv.suePeace>>
<div class="btn"><<button "Send a messenger: ask for peace" "GangHub">><<set $gangStreetMsg = leverSuePeace(0)>><</button>></div>
<<set _pcCost = leverPeaceCost()>>
<<set _pcLbl = "Ask for peace with $" + _pcCost + " on the table">>
<div class="btn"><<button _pcLbl "GangHub">><<set $gangStreetMsg = leverSuePeace(_pcCost)>><</button>></div>
<</if>>
<<if _dv.declare>>
<<if _dv.declare.ok>>
<<set _dwLbl = _dv.declare.label>>
<div class="btn gang-btn--danger"><<button _dwLbl "GangHub">><<set $gangStreetMsg = leverDeclareWar(_dv.gangId)>><</button>></div>
<<else>>
<<set _dwWhy = "War: " + _dv.declare.reason>>
<div class="gang-hint"><<print _dwWhy>></div>
<</if>>
<</if>>
<<GangRatAction _dv.gangId>>
<<if cityCopAvailable()>>
<div class="btn"><<button "Ask your detective about them" "GangHub">><<set $gangStreetMsg = cityCopTip(_dv.gangId)>><</button>></div>
<</if>>
<<for _i, _md range _dv.mediate>>
<<capture _md>>
<<set _mdLbl = _md.label>>
<div class="btn"><<button _mdLbl "GangHub">><<set $gangStreetMsg = leverMediate(_md.warId)>><<SpendTime 120>><</button>></div>
<</capture>>
<</for>>
</div>
<</if>>
<<set _sec = secretOffersView(_args[0])>>
<<if _sec.length gt 0>>
<fieldset class="gang-secret-moves">
<legend>What you know</legend>
<div class="gang-hint">Each secret can be spent once.</div>
<<for _si, _so range _sec>>
<div class="gang-job-row">
<<set _soText = "Secret: " + _so.text>>
<div><<print _soText>></div>
<div class="btn-container gang-pair-grid">
<<for _mi, _mv range _so.moves>>
<<capture _so _mv>>
<<set _mvLbl = _mv.label>>
<div class="btn"><<button _mvLbl "GangHub">><<set $gangStreetMsg = secretUse($gangDossierId, _so.index, _mv.move)>><</button>></div>
<</capture>>
<</for>>
</div>
</div>
<</for>>
</fieldset>
<</if>>
<</widget>>
/* Bar Row: tell the right people the wrong story. */
<<widget "GangRumorLever">>
<<if !streetActionDone(getGangWorld(), "rumor")>>
<<set _rv = leverRumorView()>>
<<if _rv.gangs.length gt 1>>
<<if not _rv.about>>
<div class="gang-hint">Spread a story about a crew:</div>
<<for _i, _rg range _rv.gangs>>
<<capture _rg>>
<<set _rgLbl = "About " + _rg.name>>
<div class="btn"><<button _rgLbl "SR_BarRow">><<set $gangRumorAbout = _rg.id>><</button>></div>
<</capture>>
<</for>>
<<else>>
<div class="gang-hint">Who should hear it?</div>
<<for _i, _rg range _rv.gangs>>
<<capture _rg>>
<<if _rg.id !== _rv.about>>
<<set _rgLbl = "Make sure " + _rg.name + " hear it">>
<div class="btn"><<button _rgLbl "SR_BarRow">><<set $gangStreetMsg = leverRumor(_rg.id)>><<SpendTime 30>><</button>></div>
<</if>>
<</capture>>
<</for>>
<div class="btn"><<button "Never mind" "SR_BarRow">><<set $gangRumorAbout = "">><</button>></div>
<</if>>
<</if>>
<</if>>
<</widget>>
/* Rail Yard: a truck under somebody's trade deal. */
<<widget "GangShipmentLever">>
<<set _sv = leverShipmentView()>>
<<if _sv and ($dateTime.hours gte 21 or $dateTime.hours lt 5)>>
<div class="gang-hint"><<print _sv.text>></div>
<div class="btn"><<button "Stop the truck" "SR_RailYard">><<set $gangStreetMsg = leverHitShipment(_sv.id)>><<SpendTime 40>><</button>></div>
<</if>>
<</widget>>
/* The HQ back room: anyone tied to a chair. */
<<widget "GangCaptivesPanel">>
<<set _cps = leverCaptives()>>
<<if _cps.length gt 0>>
<fieldset>
<legend>The back room</legend>
<<for _i, _cp range _cps>>
<<capture _cp>>
<div class="gang-job-row">
<div><<print _cp.label>></div>
<div class="btn-container">
<div class="btn"><<button "Ask for ransom" "GangHQ">><<set $gangStreetMsg = leverCaptive(_cp.index, "ransom")>><</button>></div>
<div class="btn"><<button "Make them talk" "GangHQ">><<set $gangStreetMsg = leverCaptive(_cp.index, "ask")>><<SpendTime 60>><</button>></div>
<div class="btn"><<button "Let them go" "GangHQ">><<set $gangStreetMsg = leverCaptive(_cp.index, "free")>><</button>></div>
</div>
</div>
<</capture>>
<</for>>
</fieldset>
<</if>>
<</widget>><<nobr>>
<<include "UpdateAll">>
<<set _wrMsg = leverFinishWreck(true)>>
<<unset $interactionNpc>>
<<SetBackground>>
<div class="gang-screen gang-ui">
<<if _wrMsg>><div class="gang-street-msg"><<print _wrMsg>></div><</if>>
<div class="btn padding-top"><<button "Walk out" $player.info.currentLocation>><<GangSidebarOn>><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _wrMsg = leverFinishWreck(false)>>
<<unset $interactionNpc>>
<<SetBackground>>
<div class="gang-screen gang-ui">
<<if _wrMsg>><div class="gang-street-msg"><<print _wrMsg>></div><</if>>
<div class="btn padding-top"><<button "Limp out" $player.info.currentLocation>><<GangSidebarOn>><</button>></div>
</div>
<</nobr>>/* In the office of a base: the coup, the chair, crossing over. */
<<widget "GangPowerOffice">>
<<set _pov = powerOfficeView(_args[0])>>
<<if _pov.coup>>
<div class="gang-hint"><<print _pov.support>></div>
<<for _i, _lt range _pov.lieutenants>>
<<capture _lt>>
<<if not _lt.backs>>
<<set _ltMoney = "Win " + _lt.name + " over with money ($" + _lt.price + ")">>
<<set _ltTalk = "Talk " + _lt.name + " round">>
<<set _ltDirt = "Remind " + _lt.name + " what you know">>
<div class="btn"><<button _ltMoney _args[0]>><<set $gangStreetMsg = powerCourt(_lt.id, "money")>><</button>></div>
<div class="btn"><<button _ltTalk _args[0]>><<set $gangStreetMsg = powerCourt(_lt.id, "talk")>><<SpendTime 30>><</button>></div>
<<if _pov.dirt>>
<div class="btn"><<button _ltDirt _args[0]>><<set $gangStreetMsg = powerCourt(_lt.id, "dirt")>><</button>></div>
<</if>>
<</if>>
<</capture>>
<</for>>
<<if _pov.canStrike>>
<div class="btn"><<button "The night of long knives">>
<<set _pf = powerPrepareFight("coup")>>
<<if _pf>>
<<set $interactionNpc = _pf>>
<<set _gfControls = { attack: true, seduce: false, items: false, actions: true, forcePhysical: true }>>
<<StartFight $player $interactionNpc _gfControls "GangPowerWon" "GangPowerLost" "Fight" true>>
<</if>>
<</button>></div>
<</if>>
<</if>>
<<if _pov.chair>>
<div class="btn"><<button "Take the empty chair">>
<<set _chairMsg = powerClaimChair()>>
<<if _chairMsg>>
<<set $gangStreetMsg = _chairMsg>>
<<GangSidebarOn>><<goto $player.info.currentLocation>>
<<else>>
<<set _pf = powerPrepareFight("chair")>>
<<if _pf>>
<<set $interactionNpc = _pf>>
<<set _gfControls = { attack: true, seduce: false, items: false, actions: true, forcePhysical: true }>>
<<StartFight $player $interactionNpc _gfControls "GangPowerWon" "GangPowerLost" "Fight" true>>
<</if>>
<</if>>
<</button>></div>
<</if>>
<<if _pov.crossOver>>
<<set _coLbl = "Bring yourself over to " + _pov.gangName>>
<div class="btn"><<button _coLbl _args[0]>><<set $gangStreetMsg = powerCrossOver(_args[0])>><</button>></div>
<</if>>
<</widget>>
/* Under a dossier: the phone number of a detective. */
<<widget "GangRatAction">>
<<if powerRatAvailable(_args[0])>>
<<set _ratLbl = "Sell them to the police (you will be known as a rat)">>
<div class="btn"><<button _ratLbl "GangHub">><<set $gangStreetMsg = powerRat(_args[0])>><</button>></div>
<</if>>
<</widget>>
/* On the crew tab: the enemy wants you handed over. */
<<widget "GangHandoverPanel">>
<<set _hov = handoverView()>>
<<if _hov>>
<div class="gang-war-panel">
<<print _hov.html>>
<div class="btn-container">
<<set _hoPay = "Buy your own name ($" + _hov.price + ")">>
<div class="btn"><<button _hoPay "GangHub">><<set $gangStreetMsg = handoverAnswer("pay")>><</button>></div>
<div class="btn"><<button "Walk out before they sell you" "GangHub">><<set $gangStreetMsg = handoverAnswer("flee")>><</button>></div>
<<set _hoSwitch = "Go over to " + _hov.enemy>>
<div class="btn"><<button _hoSwitch "GangHub">><<set $gangStreetMsg = handoverAnswer("switch")>><</button>></div>
<div class="btn"><<button "Break up the sit-down with your fists">>
<<set _hof = handoverPrepareFight()>>
<<if _hof>>
<<set $interactionNpc = _hof>>
<<set _gfControls = { attack: true, seduce: false, items: false, actions: true, forcePhysical: true }>>
<<StartFight $player $interactionNpc _gfControls "GangHandoverWon" "GangHandoverLost" "Fight" true>>
<</if>>
<</button>></div>
</div>
</div>
<</if>>
<</widget>>
/* On the street: the people hunting you. */
<<widget "GangHuntEncounter">>
<<set _hunt = huntHere()>>
<<if _hunt>>
<div class="gang-encounters"><div class="gang-encounter gang-encounter--debt">
<<set _huntLine = "Three of " + _hunt.gangName + " peel off a wall and walk toward you. They have been looking.">>
<p><<print _huntLine>></p>
<div class="btn"><<button "Stand and fight">>
<<set _hf = huntPrepareFight()>>
<<if _hf>>
<<set $interactionNpc = _hf>>
<<set _gfControls = { attack: true, seduce: false, items: false, actions: true, forcePhysical: true }>>
<<StartFight $player $interactionNpc _gfControls "GangHuntWon" "GangHuntLost" "Fight" true>>
<</if>>
<</button>></div>
</div></div>
<</if>>
<</widget>><<nobr>>
<<include "UpdateAll">>
<<set _pwMsg = powerFinishFight(true)>>
<<unset $interactionNpc>>
<<SetBackground>>
<div class="gang-screen gang-ui">
<<if _pwMsg>><div class="gang-street-msg"><<print _pwMsg>></div><</if>>
<div class="btn padding-top"><<button "Sit down in the chair" $player.info.currentLocation>><<GangSidebarOn>><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _pwMsg = powerFinishFight(false)>>
<<unset $interactionNpc>>
<<SetBackground>>
<div class="gang-screen gang-ui">
<<if _pwMsg>><div class="gang-street-msg"><<print _pwMsg>></div><</if>>
<div class="btn padding-top"><<button "Get out" "SR_SkidRow">><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _hoMsg = handoverFinishFight(true)>>
<<unset $interactionNpc>>
<<SetBackground>>
<div class="gang-screen gang-ui">
<<if _hoMsg>><div class="gang-street-msg"><<print _hoMsg>></div><</if>>
<div class="btn padding-top"><<button "Walk out" $player.info.currentLocation>><<GangSidebarOn>><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _hoMsg = handoverFinishFight(false)>>
<<unset $interactionNpc>>
<<SetBackground>>
<div class="gang-screen gang-ui">
<<if _hoMsg>><div class="gang-street-msg"><<print _hoMsg>></div><</if>>
<div class="btn padding-top"><<button "Crawl away" $player.info.currentLocation>><<GangSidebarOn>><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _hnMsg = huntFinishFight(true)>>
<<unset $interactionNpc>>
<<SetBackground>>
<div class="gang-screen gang-ui">
<<if _hnMsg>><div class="gang-street-msg"><<print _hnMsg>></div><</if>>
<<GangSceneOffer>>
<div class="btn padding-top"><<button "Keep moving" $player.info.currentLocation>><<GangSidebarOn>><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _hnMsg = huntFinishFight(false)>>
<<unset $interactionNpc>>
<<SetBackground>>
<div class="gang-screen gang-ui">
<<if _hnMsg>><div class="gang-street-msg"><<print _hnMsg>></div><</if>>
<<set _soForced = gangSceneOfferForced()>>
<<GangSceneOffer>>
<<if not _soForced>><div class="btn padding-top"><<button "Limp away" $player.info.currentLocation>><<GangSidebarOn>><</button>></div><</if>>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground>>
<div class="gang-screen gang-ui">
<div class="gang-street-msg">
<p>At three in the morning, on a rooftop over Skid Row, you realize that every light you can see belongs to someone who pays you or fears you.</p>
<p>The crews that are left send their envelopes on time, and the police captain calls you by your first name. Kids on the corners tell stories about you, most of them lies.</p>
<p>Somewhere down there a new crew is already getting ideas, but tonight Viceburg is yours.</p>
</div>
<div class="btn padding-top"><<button "Back to the streets" "GangHub">><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground>>
<<set _sx = gangSceneView()>>
<div class="gang-screen gang-ui">
<<if not _sx>>
<<GangSidebarOn>><<goto $player.info.currentLocation>>
<<else>>
<div class="centre-text"><<print _sx.title>></div>
<<if _sx.video>><<Video _sx.video "text_fallback">><</if>>
<div class="gang-street-msg"><<print _sx.html>></div>
<div class="btn-container">
<<if _sx.stage === "intro">>
<<set _sxYes = _sx.yes>>
<<set _sxNo = _sx.no>>
<div class="btn"><<button _sxYes "GangSexScene">><<run gangSceneConsent(true)>><</button>></div>
<div class="btn"><<button _sxNo "GangSexScene">><<run gangSceneConsent(false)>><</button>></div>
<<elseif _sx.stage === "lead">>
<<if _sx.canLead>>
<div class="btn"><<button "Take the lead" "GangSexScene">><<run gangSceneLead(true)>><</button>></div>
<<else>>
<p class="gang-hint">You are spent for now. If anyone leads tonight, it is them.</p>
<</if>>
<<set _sxLet = _sx.letLead>>
<div class="btn"><<button _sxLet "GangSexScene">><<run gangSceneLead(false)>><</button>></div>
<<if _sx.canStop>>
<div class="btn"><<button "Stop" "GangSexScene">><<run gangSceneStop()>><</button>></div>
<</if>>
<<elseif _sx.stage === "choose" or _sx.stage === "act">>
<<if _sx.spent>><p class="gang-hint">You are spent for now. There is nothing left in you to lead with.</p><</if>>
<<for _i, _sa range _sx.acts>>
<<capture _sa>>
<<if not _sa.current>>
<<set _saLbl = _sa.label>>
<div class="btn"><<button _saLbl "GangSexScene">><<run gangSceneAct(_sa.id)>><<SpendTime 15>><</button>></div>
<</if>>
<</capture>>
<</for>>
<<if _sx.stage === "act">>
<div class="btn"><<button "Finish" "GangSexScene">><<run gangSceneClimax()>><<SpendTime 10>><</button>></div>
<</if>>
<<if _sx.canStop>>
<div class="btn"><<button "Stop" "GangSexScene">><<run gangSceneStop()>><</button>></div>
<</if>>
<<else>>
<div class="btn"><<button "Continue">><<set _sxBack = gangSceneLeave()>><<goto _sxBack>><</button>></div>
<</if>>
</div>
<</if>>
</div>
<</nobr>>/* The aftermath of a street fight on a rival block (captive or spoils), when allowed. */
<<widget "GangSceneOffer">>
<<if $gangSceneOffer>>
<<set _soKind = $gangSceneOffer.kind>>
<<set _soRefs = { turf: $gangSceneOffer.turf, partner: $gangSceneOffer.partner }>>
<<set _soLbl = (_soKind === "captive") ? "They drag you into the back room" : "Stand over the one who lost">>
<<unset $gangSceneOffer>>
<<GangSceneButton _soLbl _soKind _soRefs>>
<</if>>
<</widget>>
/* A button that starts a scene when its gates allow it. _args: label, kind, refs object. */
<<widget "GangSceneButton">>
<<set _gsbLabel = _args[0]>>
<<set _gsbKind = _args[1]>>
<<set _gsbRefs = _args[2] || {}>>
<<if gangSceneAvailable(_gsbKind, _gsbRefs)>>
<<capture _gsbKind _gsbRefs>>
<div class="btn"><<button _gsbLabel>>
<<set _gsbGo = gangSceneStart(_gsbKind, _gsbRefs)>>
<<if _gsbGo>><<goto _gsbGo>><</if>>
<</button>></div>
<</capture>>
<</if>>
<</widget>>/* Street gangs: shared widgets for street places and base sites. HTML is built
in TS (gangStreets.ts, gangUi.ts) so these stay one-liners. */
<<widget "GangTurfBadge">>
<<set _gtb = turfBadgeHtml(getGangWorld(), passage())>>
<<if _gtb>><<print _gtb>><</if>>
<<GangStreetEncounters>>
<</widget>>
/* Whatever waits on this street for the player: a job they took, a recruiter,
or a crew that wants its cut (gangCareer.ts encountersAt). */
<<widget "GangStreetEncounters">>
<<GangHuntEncounter>>
<<GangDebtCollector>>
<<if strollHere()>><<GangSceneButton "Work the stroll for your crew" "stroll">><</if>>
<<set _encs = careerEncounters()>>
<<if _encs.length gt 0>>
<div class="gang-encounters">
<<for _ei, _enc range _encs>>
<<capture _enc>>
<<set _encLbl = _enc.label>>
<div class="gang-encounter">
<<if _enc.html>><<print _enc.html>><</if>>
<div class="btn"><<button _encLbl>>
<<if _enc.kind === "job">>
<<set $gangJobId = _enc.jobId>>
<<goto "GangJob">>
<<elseif _enc.kind === "recruiter">>
<<set $gangRecruitId = _enc.gangId>>
<<run careerMarkRecruiter(_enc.gangId)>>
<<goto "GangRecruit">>
<<else>>
<<set $gangTurfWarn = _enc.turf>>
<<goto "GangTurfWarning">>
<</if>>
<</button>></div>
</div>
<</capture>>
<</for>>
</div>
<</if>>
<</widget>>
<<widget "GangStreetLines">>
<<set _gsl = streetLinesHtml(getGangWorld(), passage(), $dateTime.hours, getCurrentAbsoluteDay())>>
<<if _gsl>><div class="gang-street-lines"><<print _gsl>></div><</if>>
<</widget>>
/* One tab of a gang tab bar. _args: label, passage, $-variable name, value.
The active tab is lit; clicking sets the variable and reloads the passage. */
<<widget "GangTab">>
<<set _gtLbl = _args[0]>>
<<set _gtTo = _args[1]>>
<<set _gtVar = _args[2]>>
<<set _gtVal = _args[3]>>
<<set _gtCls = "btn gang-tab" + ((State.variables[_gtVar] ?? "") === _gtVal ? " gang-tab--active" : "")>>
<<capture _gtVar _gtVal>>
<div @class="_gtCls"><<button _gtLbl _gtTo>><<set State.variables[_gtVar] = _gtVal>><</button>></div>
<</capture>>
<</widget>>
<<widget "GangStreetMsg">>
<<if $gangStreetMsg>>
<div class="gang-street-msg"><<print $gangStreetMsg>></div>
<<set $gangStreetMsg = "">>
<</if>>
<</widget>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Locations/City/BusinessDistrict/BusinessDistrict.jpg">>
<<timed 0.2s>>
<div class="centre-text">Bank</div>
<<set _balanceMsg = "Your Balance: $" + $player.bankBalance>>
<<ChatMessage _balanceMsg>>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn padding-top"><<button "Leave" "Business_District">><</button>></div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
</div>
</fieldset>
<fieldset>
<legend>Banking</legend>
<div class="btn-container">
<div class="btn"><<button "Deposit money" "DepositMoney_Bank">><</button>></div>
<div class="btn"><<button "Withdraw money" "WithdrawMoney_Bank">><</button>></div>
</div>
</fieldset>
</div>
<<PeopleAround>>
<<PoliceChecker>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _bankDirection = "deposit">>
<<set _bankAction = "Deposit">>
<<include "Bank_TransferForm">>
<div class="btn padding-top"><<button "Back" "Bank">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _bankDirection = "withdraw">>
<<set _bankAction = "Withdraw">>
<<include "Bank_TransferForm">>
<div class="btn padding-top"><<button "Back" "Bank">><</button>></div>
<</nobr>><<nobr>>
<div class="centre-text"><<print _bankAction>> money</div>
<p id="bank-balances">Cash: $<<print $player.money>> | Bank balance: $<<print $player.bankBalance>></p>
<<set _bankAmount = 0>>
<label>Amount in whole dollars: <<numberbox "_bankAmount" 0>></label>
<div class="btn padding-top"><<button _bankAction>>
<<set _bankResult = transferBankFunds($player, _bankDirection, _bankAmount)>>
<<replace "#bank-feedback">><<print _bankResult.message>><</replace>>
<<replace "#bank-balances">>Cash: $<<print $player.money>> | Bank balance: $<<print $player.bankBalance>><</replace>>
<</button>></div>
<p id="bank-feedback" role="status" aria-live="polite"></p>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Locations/City/BusinessDistrict/BusinessDistrict.jpg">>
<<timed 0.2s>>
<div class="centre-text">Business District</div>
<<GangTurfBadge>>
<<GangStreetMsg>>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn-container gang-base-links">
<<set _gbLbl = siteLinkLabel("GB_Penthouse")>>
<div class="btn"><<button _gbLbl "GB_Penthouse">><</button>></div>
</div>
<div class="btn-container">
<div class="btn"><<button "Business Center" "BC_Reception">><</button>></div>
<div class="btn"><<button "Tech Company" "TechCompany">><</button>></div>
<div class="btn"><<button "Post Office" "PostOffice">><</button>></div>
<div class="btn"><<button "City Hall" "CityHall">><</button>></div>
<div class="btn"><<button "News Office" "NewsOffice">><</button>></div>
<div class="btn"><<button "Law Office" "LawOffice">><</button>></div>
<div class="btn"><<button "Bank" "Bank">><</button>></div>
</div>
<div class="padding-top"><<Travel "Leave" "Campus">></div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
</div>
</fieldset>
</div>
<<PeopleAround>>
<<PoliceChecker>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Locations/City/BusinessDistrict/BusinessCenter/Amanda_Office.jpg">>
<<timed 0.2s>>
<div class="centre-text">Amanda's Office</div>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn"><<button "Leave" "BC_Reception">><</button>></div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
</div>
</fieldset>
</div>
<<PeopleAround>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Locations/City/BusinessDistrict/BusinessCenter/CEO_Office.jpg">>
<<timed 0.2s>>
<div class="centre-text">CEO’s Office</div>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn"><<button "Leave" "BC_Reception">><</button>></div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
</div>
</fieldset>
</div>
<<PeopleAround>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Locations/City/BusinessDistrict/BusinessCenter/OpenWorkspace.jpg">>
<<timed 0.2s>>
<div class="centre-text">Meeting Room</div>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn"><<button "Leave" "BC_Reception">><</button>></div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
</div>
</fieldset>
</div>
<<PeopleAround>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Locations/City/BusinessDistrict/BusinessCenter/OpenWorkspace.jpg">>
<<timed 0.2s>>
<div class="centre-text">Open Workspace</div>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn"><<button "Leave" "BC_Reception">><</button>></div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
</div>
</fieldset>
</div>
<<PeopleAround>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Locations/City/BusinessDistrict/BusinessCenter/Office_Reception.jpg">>
<<timed 0.2s>>
<div class="centre-text">Reception</div>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn-container">
<div class="btn"><<button "Open Workspace" "BC_Open_Workspace">><</button>></div>
<div class="btn"><<button "Amanda's Office" "BC_Amanda_Office">><</button>></div>
<div class="btn"><<button "CEO’s Office" "BC_CEO_Office">><</button>></div>
<div class="btn"><<button "Restroom " "BC_Restroom">><</button>></div>
</div>
<div class="btn padding-top"><<button "Leave" "Business_District">><</button>></div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
</div>
</fieldset>
</div>
<<PeopleAround>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Locations/City/BusinessDistrict/BusinessCenter/Restroom.jpg">>
<<timed 0.2s>>
<div class="centre-text">Restroom</div>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn"><<button "Leave" "BC_Reception">><</button>></div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
</div>
</fieldset>
</div>
<<PeopleAround>>
<<if $player.attributes && $player.attributes.corruption && $player.attributes.corruption.value >= 40 && !$player.dailyEvents.isEventRegistered($player.info.id, "BC_Restroom_ColleagueHJ") && $dateTime.hours >= 9 && $dateTime.hours < 17>>
<<LocationEvent 'Back-stall rumor' 'BC_Restroom_ColleagueHJ' "transition" "Media\\Other\\Notice_Event.png">>
<</if>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Locations/City/Campus/Campus.jpg">>
<<timed 0.2s>>
<div class="centre-text">Campus</div>
<<GangTurfBadge>>
<<GangStreetMsg>>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn-container">
<div class="btn"><<button "College" "CollegeHall">><</button>></div>
<div class="btn"><<button "Oak Street" "Oak_Street">><</button>></div>
<div class="btn"><<button "Library" "Library">><</button>></div>
<div class="btn"><<button "Mall" "Mall">><</button>></div>
<div class="btn"><<button "Surgery center" "Clinic">><</button>></div>
<div class="btn"><<button "Park" "Park">><</button>></div>
<<Travel "Business District" "Business_District">>
<<Travel "Entertainment District" "EntertainmentDistrict">>
<<Travel "Residential area" "ResidentialArea">>
<<Travel "Red Light Dist." "RedLightDistrict">>
<<Travel "Skid Row" "SR_SkidRow">>
<<Travel "Downtown" "Downtown">>
</div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
</div>
</fieldset>
</div>
<<PeopleAround>>
<<PoliceChecker>>
<<RandomEvent "Campus">>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Locations/City/Clinic/Clinic.jpg">>
<<timed 0.2s>>
<div class="centre-text">Surgery Center</div>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn"><<button "Leave" "Campus">><</button>></div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
</div>
</fieldset>
<fieldset>
<legend>Wellness Clinic</legend>
<div class="btn-container">
<<if $player.money >= 200 && $player.attributes.lust.value > 0>>
<div class="btn"><<button "Libido Suppressant ($200)">>
<<if $player.money >= 200 && $player.attributes.lust.value > 0>>
<<set $player.money -= 200>>
<<SpendTimeWithoutUpdate 30>>
<<set _drop = Random(10, 20) * -1>>
<<SetCharProgression $player 'lust' _drop true>>
<<goto "Clinic_Suppressant">>
<<else>>
<<goto "Clinic">>
<</if>>
<</button>></div>
<<else>>
<div class="btn non-interacting"><<button "Libido Suppressant ($200)">><</button>></div>
<</if>>
<<if $player.money >= 300 && $player.attributes.corruption.value > 0>>
<div class="btn"><<button "Therapy Session ($300)">>
<<if $player.money >= 300 && $player.attributes.corruption.value > 0>>
<<set $player.money -= 300>>
<<SpendTimeWithoutUpdate 60>>
<<set _drop = Random(10, 20) * -1>>
<<SetCharProgression $player 'corruption' _drop true>>
<<goto "Clinic_Therapy">>
<<else>>
<<goto "Clinic">>
<</if>>
<</button>></div>
<<else>>
<div class="btn non-interacting"><<button "Therapy Session ($300)">><</button>></div>
<</if>>
</div>
</fieldset>
</div>
<<PeopleAround>>
<<PoliceChecker>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ChatMessage "The doctor prescribes a course of libido suppressants. Your sex drive cools down.">>
<div class="btn padding-top"><<button "Continue" "Clinic">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ChatMessage "A long counseling session helps you re-center. You feel less drawn to depravity.">>
<div class="btn padding-top"><<button "Continue" "Clinic">><</button>></div>
<</nobr>><<nobr>>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Locations/College/CollegeHall.jpg">>
<<timed 0.2s>>
<div class="centre-text">College Hall</div>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn-container">
<div class="btn"><<button "Auditorium" "Auditorium">><</button>></div>
<div class="btn"><<button "Men's WC" "MensRestroom">><</button>></div>
<div class="btn"><<button "Women's WC" "WomensRestroom">><</button>></div>
</div>
<div class="padding-top">
<div class="btn"><<button "Leave" "Campus">><</button>></div>
</div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
</div>
</fieldset>
</div>
<<PeopleAround>>
<</timed>>
<</nobr>><<nobr>>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Locations/College/Restroom/restroom.jpg">>
<<timed 0.2s>>
<div class="centre-text">Men's restroom</div>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn"><<button "Leave" "CollegeHall">><</button>></div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
</div>
</fieldset>
</div>
<<PeopleAround>>
<</timed>>
<</nobr>><<nobr>>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Locations/College/Restroom/restroom.jpg">>
<<timed 0.2s>>
<div class="centre-text">Women's restroom</div>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn"><<button "Leave" "CollegeHall">><</button>></div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
</div>
</fieldset>
</div>
<<PeopleAround>>
<</timed>>
<</nobr>><<nobr>>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Locations/College/Auditorium/Auditorium_02.jpg">>
<<timed 0.2s>>
<div class="centre-text">Auditorium</div>
<div class="centre-text" style="font-size: 20px;">Classes start at 9 a.m. on weekdays.</div>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn"><<button "Leave" "CollegeHall">><</button>></div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<if $dateTime.hours >=9 && $dateTime.hours <=11 && $player.dailyEvents.isEventRegistered($player.info.id, "AttendedAClass") == false && $dateTime.getDayOfWeek() != "Sunday" && $dateTime.getDayOfWeek() != "Saturday">>
/* A quest lost from an older session can never be completed, so the intro
plays only while the first day quest is unfinished or not created yet. */
<<set _firstClass = getTaskState("main_quest1_college", "Attend your first college class")>>
<<if _firstClass == 'incomplete' || (_firstClass == 'not found' && !$startQuestCreated)>>
<div class="btn"><<button "Attend a class" "Main_Quest1_College">><</button>></div>
<<else>>
<div class="btn"><<button "Attend a class" "AttendClass">><</button>></div>
<</if>>
<<elseif $dateTime.hours < 9 && $player.dailyEvents.isEventRegistered($player.info.id, "AttendedAClass") == false && $dateTime.getDayOfWeek() != "Sunday" && $dateTime.getDayOfWeek() != "Saturday">>
<div class="btn"><<button "Wait until classes start" "Auditorium">>
<<set _tempTime = {minutes: 0, hours: 8}>>
<<SetTime _tempTime>>
<<SpendTime 60>>
<</button>></div>
<<else>>
<div class="btn non-interacting"><<button "Attend a class">><</button>></div>
<</if>>
<<EachActions>>
</div>
</fieldset>
</div>
<<PeopleAround>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground>>
<<SpendTimeWithoutUpdate 45>>
<<run $player.dailyEvents.registerEvent($player.info.id, "AttendedAClass", 1)>>
<<ChatMessage 'You attended a class'>>
<<set _expGain = Random(30,60) + $player.attributes.intelligence.value>>
<<SetCharProgression $player 'intelligence' _expGain true>>
<div class="padding-top">
<div class="btn"><<button "Continue" "Auditorium">><</button>></div>
</div>
<</nobr>><<nobr>>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Locations/City/EntertainmentDistrict/Entertainment District.jpg">>
<<timed 0.2s>>
<div class="centre-text">Entertainment District</div>
<<GangTurfBadge>>
<<GangStreetMsg>>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn-container gang-base-links">
<<set _gbLbl = siteLinkLabel("GB_Arcade")>>
<div class="btn"><<button _gbLbl "GB_Arcade">><</button>></div>
</div>
<div class="btn-container">
<div class="btn"><<button "Bar" "Bar">><</button>></div>
</div>
<div class="padding-top">
<<Travel "Campus" "Campus">>
</div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
/* Daytime only: after midnight it is still the night before, and from
17:00 on the jump to 17:00 would turn the clock back. */
<<if $dateTime.hours >= 5 && $dateTime.hours < 17>>
<div class="btn"><<button "Wait until evening" "EntertainmentDistrict">>
<<set _tempTime = {minutes: 0, hours: 17}>>
<<SetTime _tempTime>>
<<SpendTime 60>>
<</button>></div>
<</if>>
</div>
</fieldset>
</div>
<<PeopleAround>>
<<PoliceChecker>>
<<RandomEvent "EntertainmentDistrict">>
<</timed>>
<</nobr>><<nobr>>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Locations/City/EntertainmentDistrict/Bar.jpg">>
<<timed 0.2s>>
<div class="centre-text">Bar</div>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn"><<button "Leave" "EntertainmentDistrict">><</button>></div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
/* Bartending shift: FinalJob rolls Bartender_Events at this location. */
<<if $dateTime.hours >= 16 || $dateTime.hours < 2>>
<<WorkBtn>>
<<else>>
<div class="btn non-interacting" id="bar-work-btn-closed"><<button "Work">><</button>></div>
<<done>>
<<run addHoverTooltip('bar-work-btn-closed', 'Bar shifts run from 16:00 to 01:59')>>
<</done>>
<</if>>
<<if $dateTime.hours >= 5 && $dateTime.hours < 17>>
<div class="btn"><<button "Wait until evening" "Bar">>
<<set _tempTime = {minutes: 0, hours: 17}>>
<<SetTime _tempTime>>
<<SpendTime 60>>
<</button>></div>
<</if>>
</div>
</fieldset>
</div>
<<PeopleAround>>
<<PoliceChecker>>
<<done>><<LocationEvent 'Victor Barker' 'Bar_VictorBarker' "transition" "Media\\Characters\\QuestChars\\Bar\\VictorBarker.jpeg" "npc-card" "Card shark">><</done>>
<</timed>>
<</nobr>><<nobr>>
<<if $player.characterEvents.isEventRegistered($player.info.id, "victorBarker_quest_01") == false
&& $player.characterEvents.isEventRegistered($player.info.id, "victorBarker_quest_01_completed") == false
&& $player.gender() == 'Male'>>
<<goto "VictorBarker_Quest_1_Start">>
<</if>>
<<include "UpdateAll">>
<<DrawImage "Media\\Characters\\QuestChars\\Bar\\VictorBarker.jpeg">>
<div class="btn padding-top"><<button "Back" $player.info.currentLocation>><</button>></div>
<</nobr>><<nobr>>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Locations/College/Library/Library.jpg">>
<div class="centre-text">Library</div>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn"><<button "Leave" "Campus">><</button>></div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
<<if $player.status.energy.value >= 20>>
<div class="btn" id="study-btn"><<button "Study" "Library_Study">><</button>></div>
<<else>>
<div class="btn non-interacting" id="study-btn"><<button "Study">><</button>></div>
<</if>>
</div>
</fieldset>
</div>
<<PeopleAround>>
<<PoliceChecker>>
<<RandomEvent "Library">>
<<done>>
<<run addHoverTooltip('study-btn', 'Studying grants you experience. The amount of experience you gain depends on your Intelligence level (cost: 20 energy)')>>
<</done>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SpendEnergy $player 20>>
<<SpendTimeWithoutUpdate 30>>
<<set _randomValueChange = Random(10,20) + $player.attributes.intelligence.value>>
<<SetCharProgression $player 'intelligence' _randomValueChange true>>
<div class="padding-top">
<div class="btn"><<button "Ok" "Library">><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<MallClosedCheck>>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Locations/City/Mall/Mall.png">>
<<timed 0.2s>>
<div class="centre-text">Mall</div>
<<GangTurfBadge>>
<<GangStreetMsg>>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn-container">
<div class="btn"><<button "Gym" "FitnessClub">><</button>></div>
<div class="btn"><<button "Electronics" "ElectronicsStore">><</button>></div>
<div class="btn"><<button "Gift Shop" "GiftShop">><</button>></div>
<div class="btn"><<button "Pharmacy" "Pharmacy">><</button>></div>
<div class="btn"><<button "Grocery" "Grocery">><</button>></div>
<div class="btn"><<button "Clothing" "ClothingStore">><</button>></div>
<div class="btn"><<button "Sex Shop" "SexShop">><</button>></div>
<div class="btn"><<button "Weapon Shop" "WeaponShop">><</button>></div>
<div class="btn"><<button "Shooting Range" "ShootingRange">><</button>></div>
</div>
<div class="padding-top">
<div class="btn"><<button "Leave" "Campus">><</button>></div>
</div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<div class="btn"><<button "Pocket some merchandise" "Crime_Shoplift">>
<<set $policeCrimeAuthority = { source: "choice", crime: "shoplifting", passage: "Crime_Shoplift", day: getCurrentAbsoluteDay(), location: $player.info.currentLocation }>>
<</button>></div>
<<EachActions>>
</div>
</fieldset>
</div>
<<PeopleAround>>
<<PoliceChecker>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<MallClosedCheck>>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Locations/City/Mall/GiftShop.png">>
<<timed 0.2s>>
<div class="centre-text">Gift Shop</div>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn"><<button "Back" "Mall">><</button>></div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
<div class="btn"><<button "Shop">>
<<OpenShop "Gift">>
<</button>></div>
</div>
</fieldset>
</div>
<<PeopleAround>>
<<PoliceChecker>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<MallClosedCheck>>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Locations/City/Mall/Pharmacy.png">>
<<timed 0.2s>>
<div class="centre-text">Pharmacy</div>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn"><<button "Back" "Mall">><</button>></div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
<div class="btn"><<button "Shop">>
<<OpenShop "Drug">>
<</button>></div>
</div>
</fieldset>
</div>
<<PeopleAround>>
<<PoliceChecker>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<MallClosedCheck>>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Locations/City/Mall/Grocery.png">>
<<timed 0.2s>>
<div class="centre-text">Grocery section</div>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn"><<button "Back" "Mall">><</button>></div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
<div class="btn"><<button "Shop">>
<<OpenShop "Food">>
<</button>></div>
</div>
</fieldset>
</div>
<<PeopleAround>>
<<PoliceChecker>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<MallClosedCheck>>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Locations/City/Mall/Gym.jpg">>
<<set _gymPrice to 120>>
<<timed 0.2s>>
<div class="centre-text">Fitness Club</div>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn"><<button "Back" "Mall">><</button>></div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
<<if $player.status.energy.value >= 20 && $player.money >= _gymPrice>>
<div class="btn" id="study-btn"><<button "Work Out" "FitnessClub_Work_Out_ChooseType">><<set $gymPrice to _gymPrice>><</button>></div>
<<else>>
<div class="btn non-interacting" id="study-btn"><<button "Work Out">><</button>></div>
<</if>>
<<HiddenCamPlantButton "gym">>
</div>
</fieldset>
</div>
<<PeopleAround>>
<<PoliceChecker>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<div class="btn-container">
<<if $player.attributes.strength.value < $player.attributes.strength.max>>
<div class="btn"><<button "Strength training ($<<print $gymPrice>>)" "FitnessClub_Work_Out">><<set $trainingType = "strength">><</button>></div>
<<else>>
<div class="btn non-interacting"><<button "Strength training ($<<print $gymPrice>>)">><</button>></div>
<</if>>
<<if $player.attributes.vitality.value < $player.attributes.vitality.max>>
<div class="btn"><<button "Vitality training ($<<print $gymPrice>>)" "FitnessClub_Work_Out">><<set $trainingType = "vitality">><</button>></div>
<<else>>
<div class="btn non-interacting"><<button "Vitality training ($<<print $gymPrice>>)">><</button>></div>
<</if>>
<<if $player.attributes.endurance.value < $player.attributes.endurance.max>>
<div class="btn"><<button "Endurance training ($<<print $gymPrice>>)" "FitnessClub_Work_Out">><<set $trainingType = "endurance">><</button>></div>
<<else>>
<div class="btn non-interacting"><<button "Endurance training ($<<print $gymPrice>>)">><</button>></div>
<</if>>
<<if $player.attributes.dexterity.value < $player.attributes.dexterity.max>>
<div class="btn"><<button "Dexterity training ($<<print $gymPrice>>)" "FitnessClub_Work_Out">><<set $trainingType = "dexterity">><</button>></div>
<<else>>
<div class="btn non-interacting"><<button "Dexterity training ($<<print $gymPrice>>)">><</button>></div>
<</if>>
<<if $player.attributes.defense.value < $player.attributes.defense.max>>
<div class="btn"><<button "Defense training ($<<print $gymPrice>>)" "FitnessClub_Work_Out">><<set $trainingType = "defense">><</button>></div>
<<else>>
<div class="btn non-interacting"><<button "Defense training ($<<print $gymPrice>>)">><</button>></div>
<</if>>
<<if $player.attributes.meleeWeapons.value < $player.attributes.meleeWeapons.max>>
<div class="btn"><<button "Melee training ($<<print $gymPrice>>)" "FitnessClub_Work_Out">><<set $trainingType = "meleeWeapons">><</button>></div>
<<else>>
<div class="btn non-interacting"><<button "Melee training ($<<print $gymPrice>>)">><</button>></div>
<</if>>
</div>
<div class="btn padding-top"><<button "Back" "FitnessClub">><<unset $trainingType>><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set $player.money -= $gymPrice>>
<<SpendEnergy $player 20>>
<<SpendTimeWithoutUpdate 30>>
<<set _randomValueChange = Random(10,20) + $player.attributes.intelligence.value>>
<<SetCharProgression $player $trainingType _randomValueChange true>>
<div class="btn padding-top"><<button "Continue" "FitnessClub">><<unset $trainingType>><<unset $gymPrice>><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<MallClosedCheck>>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Locations/City/Mall/ClothingStorel.png">>
<<timed 0.2s>>
<div class="centre-text">Clothing Store</div>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn"><<button "Back" "Mall">><</button>></div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
<div class="btn"><<button "Shop">>
<<OpenShop "Clothing">>
<</button>></div>
</div>
</fieldset>
</div>
<<PeopleAround>>
<<PoliceChecker>>
<<if $player.attributes && $player.attributes.corruption && $player.attributes.corruption.value >= 30 && !$player.dailyEvents.isEventRegistered($player.info.id, "Mall_ChangingRoomPeek")>>
<<if $player.gender() == "Female">>
<<LocationEvent 'Try on lingerie' 'Mall_ChangingRoomPeek' "transition" "Media\\Other\\Notice_Event.png">>
<<else>>
<<LocationEvent 'Lingering by the changing aisle' 'Mall_ChangingRoomPeek' "transition" "Media\\Other\\Notice_Event.png">>
<</if>>
<</if>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<MallClosedCheck>>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Locations/City/Mall/Sexshop.jpg">>
<<timed 0.2s>>
<div class="centre-text">Sex Shop</div>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn"><<button "Back" "Mall">><</button>></div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
<div class="btn"><<button "Shop">>
<<OpenShop "SexToy">>
<</button>></div>
/* The paddle is a tool, sold over the counter so NPC toy scenes never pick it up. */
<<if $player.inventory.hasItem("Paddle")>>
<div class="btn non-interacting"><<button "Paddle (owned)">><</button>></div>
<<elseif $player.money gte 120>>
<div class="btn"><<button "Buy a paddle ($120)">>
<<set $player.money -= 120>>
<<run $player.inventory.addItem(GetNewItem("paddle", 1))>>
<<goto "SexShop">>
<</button>></div>
<<else>>
<div class="btn non-interacting"><<button "Buy a paddle ($120)">><</button>></div>
<</if>>
</div>
</fieldset>
</div>
<<PeopleAround>>
<<PoliceChecker>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<MallClosedCheck>>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Locations/City/Mall/ElectronicsStore.jpg">>
<<timed 0.2s>>
<div class="centre-text">Electronics Store</div>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn"><<button "Back" "Mall">><</button>></div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
<div class="btn"><<button "Shop">>
<<OpenShop "Electronics">>
<</button>></div>
/* Sold over the counter: a tool, not a Gift item (Events/HiddenCameras.twee). */
<<if $player.money gte 300>>
<div class="btn"><<button "Buy a hidden camera ($300)">>
<<set $player.money -= 300>>
<<run $player.inventory.addItem(GetNewItem("hiddenCamera", 1))>>
<<goto "ElectronicsStore">>
<</button>></div>
<<else>>
<div class="btn non-interacting"><<button "Buy a hidden camera ($300)">><</button>></div>
<</if>>
</div>
</fieldset>
</div>
<<PeopleAround>>
<<PoliceChecker>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/City/Mall/Mall.png">>
<div class="centre-text">Mall is closed</div>
<p style="text-align: center; color: #aaa;">The mall is closed. Operating hours: 8:00 - 23:00.</p>
<div class="btn padding-top"><<button "Leave" "Campus">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Locations/City/Park/Park.jpg">>
<<timed 0.2s>>
<div class="centre-text">Park</div>
<<GangTurfBadge>>
<<GangStreetMsg>>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn-container">
<div class="btn"><<button "Restrooms" "ParkRestrooms">><</button>></div>
</div>
<div class="padding-top">
<div class="btn"><<button "Campus" "Campus">><</button>></div>
</div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<if $dateTime.hours gte 21 or $dateTime.hours lt 5>><div class="btn"><<button "Roll someone in the dark" "Crime_Mug">>
<<set $policeCrimeAuthority = { source: "choice", crime: "mugging", passage: "Crime_Mug", day: getCurrentAbsoluteDay(), location: $player.info.currentLocation }>>
<</button>></div><</if>>
<<EachActions>>
</div>
</fieldset>
</div>
<<PeopleAround>>
<<if getQuestState("rayna_voss_quest1") == "active" && getTaskState("rayna_voss_quest1", "Track down Detective Rayna Voss in the city park") != 'completed'>>
<<done>><<LocationEvent 'Rayna Voss' 'Rayna_Voss_Quest1_Meet' "transition" "Media\\Characters\\QuestChars\\Detective\\Detective.png" "npc-card" "Detective">><</done>>
<<elseif getQuestState("rayna_voss_quest1") == "active" && getTaskState("rayna_voss_quest1", "Retrieve the documents from the Skid Row basement") != 'completed'>>
<<done>><<LocationEvent 'Rayna Voss' 'Rayna_Voss_Quest1_Remind' "transition" "Media\\Characters\\QuestChars\\Detective\\Detective.png" "npc-card" "Detective">><</done>>
<<elseif getQuestState("rayna_voss_quest1") == "active" && getTaskState("rayna_voss_quest1", "Retrieve the documents from the Skid Row basement") == 'completed' && getTaskState("rayna_voss_quest1", "Give the documents to Rayna") != 'completed'>>
<<done>><<LocationEvent 'Rayna Voss' 'Rayna_Voss_Quest1_Return' "transition" "Media\\Characters\\QuestChars\\Detective\\Detective.png" "npc-card" "Detective">><</done>>
<</if>>
<<PoliceChecker>>
<<RandomEvent "Park">>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Locations/City/Park/ParkRestrooms.jpg">>
<<timed 0.2s>>
<div class="centre-text">Park Restrooms</div>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn"><<button "Back" "Park">><</button>></div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<div class="btn"><<button "Work in gloryhole" "GloryHole">><<set $playerSuck = true>><</button>></div>
<<if $player.genitalia() == "Penis" && $player.status.potency.value > $player.status.potency.min && $playerlock != true>>
<div class="btn"><<button "Use gloryhole (- $50)" "GloryHole">><<set $playerSuck = false>><</button>></div>
<</if>>
<<EachActions>>
</div>
</fieldset>
</div>
<<PeopleAround>>
<<PoliceChecker>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if $playerSuck == true>>
<<if $player.status.energy.value < 50>>
<<goto "GloryHole_Totied">>
<<else>>
<<SpendTime 120>>
<<SpendEnergy $player 50>>
<<if $player.gender() == "Male" || $player.gender() == "Shemale">>
<<set _pick = 'Media\\Sex\\GloryHole\\Male\\' + Random(0, 1, false) + '.mp4'>>
<<else>>
<<set _pick = 'Media\\Sex\\GloryHole\\Female\\' + Random(0, 4, false) + '.mp4'>>
<</if>>
<<set _income = Random(50, 500)>>
<<set $player.money += _income>>
<<set _msg = "You served several clients and earned " + "$" + _income>>
<<if CheckContentFilter('Male')>><<Video _pick>><</if>>
<<ChatMessage _msg>>
<div class="padding-top">
<div class="btn"><<button "Back" "ParkRestrooms">><<unset $playerSuck $Gender>><</button>></div>
</div>
<</if>>
<<else>>
<<if $player.money < 50>>
<<ChatMessage "Not enough money.">>
<div class="padding-top">
<div class="btn"><<button "Back" "ParkRestrooms">><</button>></div>
</div>
<<else>>
<<set $player.money -= 50>>
<<set _pick = 'Media\\Sex\\GloryHole\\Female\\' + Random(0, 4, false) + '.mp4'>>
<<if CheckContentFilter('Female')>><<Video _pick>><</if>>
<<ChatMessage "You paid your money and an unknown girl started servicing your cock.">>
<div class="padding-top">
<div class="btn"><<button "Cum" "GloryHoleCum">><</button>></div>
</div>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/City/Park/ParkRestrooms.jpg">>
<<set _msg = "After a while, you cum.">>
<<set _pick = 'Media\\Sex\\GloryHole\\Female\\Cum\\' + Random(0, 1, false) + '.mp4'>>
<<set $player.status.potency.decrease(1)>>
<<set $player.status.horny.decrease($player.status.horny.max)>>
<<if CheckContentFilter('Female')>><<Video _pick>><</if>>
<<ChatMessage _msg>>
<div class="padding-top">
<div class="btn"><<button "Back" "ParkRestrooms">><<unset $playerSuck $Gender>><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ChatMessage "You are too tired.">>
<div class="padding-top">
<div class="btn"><<button "Back" "ParkRestrooms">><<unset $playerSuck $Gender>><</button>></div>
</div>
<</nobr>><<nobr>>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Locations/City/ResidentialArea/ResidentialArea.jpg">>
<<timed 0.2s>>
<div class="centre-text">Residential Area</div>
<<GangTurfBadge>>
<<GangStreetMsg>>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn-container gang-base-links">
<<set _gbLbl = siteLinkLabel("GB_Mansion")>>
<div class="btn"><<button _gbLbl "GB_Mansion">><</button>></div>
</div>
<div class="btn-container">
<<if !setup.ownsPlayerResidence("residential_apartment")>>
<<if $player.money >= 10000>>
<div class="btn"><<button "Buy Apartment ($10000)" "ResidentialArea">>
<<set $residencePurchaseResult = setup.purchasePlayerResidence($player, "residential_apartment", "cash")>>
<</button>></div>
<<else>>
<div class="btn non-interacting"><<button "Buy Apartment ($10000)">><</button>></div>
<</if>>
<<else>>
<div class="btn"><<button "Apartment" "LivingRoom_Apartments">><</button>></div>
<<set _sale = setup.canSellPlayerResidence("residential_apartment")>>
<<if _sale.ok>>
/* Macro arguments are split on whitespace; an inline expression
must be precomputed into a variable. */
<<set _sellApartmentLabel = "Sell Apartment ($" + _sale.proceeds + ")">>
<div class="btn"><<button _sellApartmentLabel "ResidentialArea">>
<<set $residenceSaleResult = setup.sellPlayerResidence($player, "residential_apartment")>>
<</button>></div>
<<else>>
<div class="btn non-interacting" @title="_sale.reason"><<button "Apartment cannot be sold">><</button>></div>
<</if>>
<</if>>
<<if $residencePurchaseResult>>
<div class="result-description"><<print $residencePurchaseResult.reason>></div>
<<unset $residencePurchaseResult>>
<</if>>
<<if $residenceSaleResult>>
<div class="result-description"><<print $residenceSaleResult.reason>></div>
<<unset $residenceSaleResult>>
<</if>>
</div>
<div class="padding-top">
<<Travel "Campus" "Campus">>
</div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
</div>
</fieldset>
</div>
<<PeopleAround>>
<<PoliceChecker>>
<</timed>>
<</nobr>><<nobr>>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Locations/City/ResidentialArea/LivingRoom.jpg">>
<<timed 0.2s>>
<div class="centre-text">Living room</div>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn-container">
<div class="btn"><<button "Bedroom" "Bedroom_Apartments">><</button>></div>
</div>
<div class="padding-top">
<div class="btn"><<button "Leave" "ResidentialArea">><</button>></div>
</div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
<div class="btn"><<button "Make this my main home" "LivingRoom_Apartments">>
<<run setup.setPrimaryPlayerResidence("residential_apartment")>>
<</button>></div>
</div>
</fieldset>
</div>
<<set _residentPartner = $Characters.find(function (npc) { return typeof IsPermanentPlayerResidenceResident === "function" && IsPermanentPlayerResidenceResident(npc); })>>
<<if _residentPartner>>
<<set _residentNight = setup.getPlayerNpcNightStatus(_residentPartner)>>
<<set _residentLate = setup.consumePlayerPartnerLateNotification(_residentPartner)>>
<fieldset>
<legend>Shared home</legend>
<div class="result-description">Resident: <<print _residentPartner.info.firstName>> <<print _residentPartner.info.secondName>></div>
<<if _residentNight>><div class="result-description">Tonight: <<print (_residentNight.declaredActivity ?? _residentNight.actualActivity).replaceAll("_", " ")>><<if _residentNight.outcome>> · <<print _residentNight.outcome.replaceAll("_", " ")>><</if>></div><</if>>
<<if _residentLate>><div class="result-description">⚠ <<print _residentLate>></div><</if>>
<<if _residentPartner.info.currentLocation == $player.info.currentLocation>><div class="btn"><<button "Plan the evening together" "enhanced_relationship_household">><<set $interactionNpc = _residentPartner>><<set $indexNPC = $Characters.indexOf(_residentPartner)>><</button>></div><</if>>
</fieldset>
<</if>>
<<PeopleAround>>
<<PoliceChecker>>
<</timed>>
<</nobr>><<nobr>>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Locations/City/ResidentialArea/Bedroom.jpg">>
<<timed 0.2s>>
<div class="centre-text">Bedroom</div>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn"><<button "Living room" "LivingRoom_Apartments">><</button>></div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
<<SleepButton>>
</div>
</fieldset>
</div>
<<PeopleAround>>
<<PoliceChecker>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<MallClosedCheck>>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Locations/City/Mall/ShootingRange.jpg">>
<<timed 0.2s>>
<div class="centre-text">Shooting Range</div>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn"><<button "Back" "Mall">><</button>></div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
<<if $player.status.energy.value >= 20>>
<div class="btn" id="train-btn"><<button "Practice Shooting" "ShootingRange_ChooseType">><</button>></div>
<<else>>
<div class="btn non-interacting" id="train-btn"><<button "Practice Shooting">><</button>></div>
<</if>>
</div>
</fieldset>
</div>
<<PeopleAround>>
<<PoliceChecker>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<div class="centre-text">Choose Training Type</div>
<p style="text-align: center; color: #aaa;">
Current Firearm Proficiency: <<print $player.attributes.firearmProficiency.value>>/<<print $player.attributes.firearmProficiency.max>>
</p>
<<if $player.attributes.firearmProficiency.value < $player.attributes.firearmProficiency.max>>
<div class="btn-container">
<<if $player.money >= 50>>
<div class="btn"><<button "Basic Training ($50)" "ShootingRange_Train">><<set $trainingType = "basic">><<set $trainingCost = 50>><</button>></div>
<<else>>
<div class="btn non-interacting"><<button "Basic Training ($50) - Not enough money">><</button>></div>
<</if>>
<<if $player.money >= 100>>
<div class="btn"><<button "Advanced Training ($100)" "ShootingRange_Train">><<set $trainingType = "advanced">><<set $trainingCost = 100>><</button>></div>
<<else>>
<div class="btn non-interacting"><<button "Advanced Training ($100) - Not enough money">><</button>></div>
<</if>>
<<if $player.money >= 200>>
<div class="btn"><<button "Expert Training ($200)" "ShootingRange_Train">><<set $trainingType = "expert">><<set $trainingCost = 200>><</button>></div>
<<else>>
<div class="btn non-interacting"><<button "Expert Training ($200) - Not enough money">><</button>></div>
<</if>>
</div>
<<else>>
<p style="text-align: center; color: #4CAF50;">Your firearm proficiency is already at maximum level!</p>
<</if>>
<div class="btn padding-top"><<button "Back" "ShootingRange">><<unset $trainingType $trainingCost>><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SpendEnergy $player 20>>
<<SpendTimeWithoutUpdate 30>>
<<set $player.money -= $trainingCost>>
<<switch $trainingType>>
<<case "basic">>
<<set _randomValueChange = Random(10, 15) + Math.floor($player.attributes.intelligence.value / 2)>>
<p>You spend some time at the basic shooting range, practicing with a simple pistol.</p>
<<case "advanced">>
<<set _randomValueChange = Random(18, 25) + Math.floor($player.attributes.intelligence.value / 2)>>
<p>You work with an instructor on advanced shooting techniques, including quick draw and multiple targets.</p>
<<case "expert">>
<<set _randomValueChange = Random(25, 35) + Math.floor($player.attributes.intelligence.value / 2)>>
<p>You undergo rigorous expert training with various firearms, including long-range rifles and rapid-fire scenarios.</p>
<</switch>>
<<SetCharProgression $player "firearmProficiency" _randomValueChange true>>
<div class="btn padding-top"><<button "Continue" "ShootingRange">><<unset $trainingType $trainingCost>><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<MallClosedCheck>>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Locations/City/Mall/WeaponShop.jpg">>
<<timed 0.2s>>
<div class="centre-text">Weapon Shop</div>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn"><<button "Back" "Mall">><</button>></div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
<div class="btn"><<button "Browse Weapons">>
<<set $weaponShopType = "weapons">>
<<goto "WeaponShop_Browse">>
<</button>></div>
<div class="btn"><<button "Buy Ammunition">>
<<set $weaponShopType = "ammo">>
<<goto "WeaponShop_Browse">>
<</button>></div>
</div>
</fieldset>
</div>
<<PeopleAround>>
<<PoliceChecker>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateStatBars">>
<<SetBackground "Media/Locations/City/Mall/WeaponShop.jpg">>
<<include "UpdateAll">>
/* Initialize shop state variables */
<<if $weaponSearchQuery == undefined>><<set $weaponSearchQuery = "">><</if>>
<<if $weaponSortBy == undefined>><<set $weaponSortBy = "name-asc">><</if>>
<div class="shop-wrapper">
/* Shop Header */
<div class="shop-header">
<div class="shop-search-container">
<<textbox "$weaponSearchQuery" $weaponSearchQuery "WeaponShop_Browse">>
</div>
<div class="shop-sort-container">
<span class="shop-sort-label">Sort by:</span>
<<listbox "$weaponSortBy" autoselect>>
<<option "Name (A-Z)" "name-asc">>
<<option "Name (Z-A)" "name-desc">>
<<option "Price (Low to High)" "price-asc">>
<<option "Price (High to Low)" "price-desc">>
<<option "Damage (Low to High)" "damage-asc">>
<<option "Damage (High to Low)" "damage-desc">>
<</listbox>>
<div class="btn"><<button "Apply" "WeaponShop_Browse">><</button>></div>
</div>
<div class="shop-money-display">
<span class="shop-money-icon">💰</span>
<span>$<<print $player.money>></span>
</div>
</div>
<<if $weaponShopType == "weapons">>
<div class="centre-text" style="margin-bottom: var(--spacing-md);">Weapons for Sale</div>
/* Category Filters */
<div class="shop-filters">
<div class="shop-filter-btn <<if $weaponFilter == 'all' || $weaponFilter == undefined>>active<</if>>">
<<button "All">>
<<set $weaponFilter = "all">>
<<goto "WeaponShop_Browse">>
<</button>>
</div>
<div class="shop-filter-btn <<if $weaponFilter == 'melee'>>active<</if>>">
<<button "⚔️ Melee">>
<<set $weaponFilter = "melee">>
<<goto "WeaponShop_Browse">>
<</button>>
</div>
<div class="shop-filter-btn <<if $weaponFilter == 'ranged'>>active<</if>>">
<<button "🔫 Ranged">>
<<set $weaponFilter = "ranged">>
<<goto "WeaponShop_Browse">>
<</button>>
</div>
</div>
<<set _weapons = GetAllWeapons()>>
/* Apply search filter */
<<if $weaponSearchQuery != "">>
<<set _searchLower = $weaponSearchQuery.toLowerCase()>>
<<set _weapons = _weapons.filter(w => w.name.toLowerCase().includes(_searchLower))>>
<</if>>
/* Apply category filter */
<<if $weaponFilter == "melee">>
<<set _weapons = _weapons.filter(w => w.getCategory() == "melee")>>
<<elseif $weaponFilter == "ranged">>
<<set _weapons = _weapons.filter(w => w.getCategory() == "ranged")>>
<</if>>
/* Apply sorting */
<<switch $weaponSortBy>>
<<case "price-asc">>
<<set _weapons.sort((a, b) => a.price - b.price)>>
<<case "price-desc">>
<<set _weapons.sort((a, b) => b.price - a.price)>>
<<case "name-asc">>
<<set _weapons.sort((a, b) => a.name.localeCompare(b.name))>>
<<case "name-desc">>
<<set _weapons.sort((a, b) => b.name.localeCompare(a.name))>>
<<case "damage-asc">>
<<set _weapons.sort((a, b) => a.baseDamage - b.baseDamage)>>
<<case "damage-desc">>
<<set _weapons.sort((a, b) => b.baseDamage - a.baseDamage)>>
<</switch>>
/* Items Count */
<div style="color: var(--text-secondary); margin-bottom: var(--spacing-md); font-size: var(--font-size-sm);">
Showing <<print _weapons.length>> weapons
<<if $weaponSearchQuery != "">>
for "<<print $weaponSearchQuery>>"
<</if>>
</div>
<<if _weapons.length > 0>>
<div class="item-shop-container weapon-shop-grid">
<<for _weapon range _weapons>>
<<capture _weapon>>
<div class="shop-item weapon-card" data-type="weapon">
/* Weapon Content - No images for weapons */
<div class="shop-item-content weapon-content-full">
/* Category Badge */
<div class="weapon-header">
<span class="weapon-category-tag <<if _weapon.getCategory() == 'melee'>>melee<<else>>ranged<</if>>">
<<if _weapon.getCategory() == "melee">>⚔️<<else>>🔫<</if>> <<print _weapon.getCategory()>>
</span>
</div>
/* Title */
<h3 class="shop-item-title"><<print _weapon.name>></h3>
/* Weapon Stats */
<div class="shop-item-stats weapon-stats-grid">
<div class="weapon-stat-item">
<span class="weapon-stat-label">⚔️ Damage</span>
<span class="weapon-stat-value damage-value"><<print _weapon.baseDamage>></span>
</div>
<div class="weapon-stat-item">
<span class="weapon-stat-label">🎯 Accuracy</span>
<span class="weapon-stat-value accuracy-value"><<print _weapon.accuracyBonus>>%</span>
</div>
<div class="weapon-stat-item">
<span class="weapon-stat-label">📋 Type</span>
<span class="weapon-stat-value"><<print getWeaponTypeName(_weapon.weaponType)>></span>
</div>
<<if _weapon.requiresAmmo()>>
<div class="weapon-stat-item">
<span class="weapon-stat-label">🔫 Ammo</span>
<span class="weapon-stat-value ammo-value"><<print _weapon.ammoType>> (<<print _weapon.ammoPerShot>>/shot)</span>
</div>
<</if>>
</div>
/* Weapon Effects */
<<if _weapon.effects.length > 0>>
<div class="shop-item-effect weapon-effects">
<span class="shop-item-effect-icon">✨</span>
<span><<print _weapon.getEffectsDescription()>></span>
</div>
<</if>>
/* Skill Requirement */
<div class="weapon-requirement">
<span class="weapon-requirement-label">📖 Requires:</span>
<span class="weapon-requirement-value"><<if _weapon.requiredSkill == "firearmProficiency">>Firearm Proficiency<<else>>Strength<</if>> Lvl <<print _weapon.minSkillLevel>></span>
</div>
/* Price */
<div class="shop-item-price">
<span class="shop-item-price-icon">💵</span>
<span>$<<print _weapon.price>></span>
</div>
/* Buy Button */
<div class="shop-buy-btn <<if $player.money < _weapon.price>>disabled<</if>>">
<<if $player.money >= _weapon.price>>
<<button "🛒 Buy Weapon" "WeaponShop_Browse">>
<<set $player.money -= _weapon.price>>
<<run $player.inventory.addItem(_weapon.clone())>>
<</button>>
<<else>>
<<button "💸 Not enough money">><</button>>
<</if>>
</div>
</div>
</div>
<</capture>>
<</for>>
</div>
<<else>>
<div class="item-shop-container">
<div class="shop-empty-state">
<div class="shop-empty-state-icon">🔍</div>
<div class="shop-empty-state-text">No weapons found</div>
</div>
</div>
<</if>>
<<else>>
/* Ammunition section */
<div class="centre-text" style="margin-bottom: var(--spacing-md);">Ammunition for Sale</div>
<div class="item-shop-container weapon-shop-grid">
/* Pistol Ammo */
<<set _pistolAmmo = GetNewItemByKey.pistolAmmo.copy(1)>>
<<set _pistolOwned = $player.inventory.hasItem("Pistol Ammo") ? ($player.inventory.getItemByName("Pistol Ammo").quantity) : 0>>
<div class="shop-item ammo-card" data-type="ammunition">
<div class="shop-item-image-container">
<<if _pistolAmmo.img && _pistolAmmo.img != "">>
<img class="shop-item-image" @src="_pistolAmmo.img" alt="Pistol Ammo">
<<else>>
<div class="shop-item-no-image">🔫</div>
<</if>>
<span class="shop-item-badge">Ammunition</span>
</div>
<div class="shop-item-content">
<h3 class="shop-item-title">Pistol Ammo (Box of 12)</h3>
<div class="shop-item-effect">
<span class="shop-item-effect-icon">📋</span>
<span>Standard 9mm ammunition for pistols and SMGs.</span>
</div>
<div class="ammo-owned">
<span class="ammo-owned-label">Owned:</span>
<span class="ammo-owned-value"><<print _pistolOwned>></span>
</div>
<div class="shop-item-price">
<span class="shop-item-price-icon">💵</span>
<span>$15 per box</span>
</div>
<div class="ammo-buy-buttons">
<div class="shop-buy-btn <<if $player.money < 15>>disabled<</if>>">
<<if $player.money >= 15>>
<<button "Buy 1 ($15)" "WeaponShop_Browse">>
<<set $player.money -= 15>>
<<run $player.inventory.addItemByName("pistolAmmo", 12)>>
<</button>>
<<else>>
<<button "Not enough">><</button>>
<</if>>
</div>
<div class="shop-buy-btn <<if $player.money < 150>>disabled<</if>>">
<<if $player.money >= 150>>
<<button "Buy 10 ($150)" "WeaponShop_Browse">>
<<set $player.money -= 150>>
<<run $player.inventory.addItemByName("pistolAmmo", 120)>>
<</button>>
<<else>>
<<button "Not enough">><</button>>
<</if>>
</div>
</div>
</div>
</div>
/* Shotgun Shells */
<<set _shotgunAmmo = GetNewItemByKey.shotgunShells.copy(1)>>
<<set _shotgunOwned = $player.inventory.hasItem("Shotgun Shells") ? ($player.inventory.getItemByName("Shotgun Shells").quantity) : 0>>
<div class="shop-item ammo-card" data-type="ammunition">
<div class="shop-item-image-container">
<<if _shotgunAmmo.img && _shotgunAmmo.img != "">>
<img class="shop-item-image" @src="_shotgunAmmo.img" alt="Shotgun Shells">
<<else>>
<div class="shop-item-no-image">🔫</div>
<</if>>
<span class="shop-item-badge">Ammunition</span>
</div>
<div class="shop-item-content">
<h3 class="shop-item-title">Shotgun Shells (Box of 8)</h3>
<div class="shop-item-effect">
<span class="shop-item-effect-icon">📋</span>
<span>12 gauge buckshot shells for shotguns.</span>
</div>
<div class="ammo-owned">
<span class="ammo-owned-label">Owned:</span>
<span class="ammo-owned-value"><<print _shotgunOwned>></span>
</div>
<div class="shop-item-price">
<span class="shop-item-price-icon">💵</span>
<span>$25 per box</span>
</div>
<div class="ammo-buy-buttons">
<div class="shop-buy-btn <<if $player.money < 25>>disabled<</if>>">
<<if $player.money >= 25>>
<<button "Buy 1 ($25)" "WeaponShop_Browse">>
<<set $player.money -= 25>>
<<run $player.inventory.addItemByName("shotgunShells", 8)>>
<</button>>
<<else>>
<<button "Not enough">><</button>>
<</if>>
</div>
<div class="shop-buy-btn <<if $player.money < 250>>disabled<</if>>">
<<if $player.money >= 250>>
<<button "Buy 10 ($250)" "WeaponShop_Browse">>
<<set $player.money -= 250>>
<<run $player.inventory.addItemByName("shotgunShells", 80)>>
<</button>>
<<else>>
<<button "Not enough">><</button>>
<</if>>
</div>
</div>
</div>
</div>
/* Rifle Ammo */
<<set _rifleAmmo = GetNewItemByKey.rifleAmmo.copy(1)>>
<<set _rifleOwned = $player.inventory.hasItem("Rifle Ammo") ? ($player.inventory.getItemByName("Rifle Ammo").quantity) : 0>>
<div class="shop-item ammo-card" data-type="ammunition">
<div class="shop-item-image-container">
<<if _rifleAmmo.img && _rifleAmmo.img != "">>
<img class="shop-item-image" @src="_rifleAmmo.img" alt="Rifle Ammo">
<<else>>
<div class="shop-item-no-image">🔫</div>
<</if>>
<span class="shop-item-badge">Ammunition</span>
</div>
<div class="shop-item-content">
<h3 class="shop-item-title">Rifle Ammo (Box of 10)</h3>
<div class="shop-item-effect">
<span class="shop-item-effect-icon">📋</span>
<span>High-caliber rifle ammunition.</span>
</div>
<div class="ammo-owned">
<span class="ammo-owned-label">Owned:</span>
<span class="ammo-owned-value"><<print _rifleOwned>></span>
</div>
<div class="shop-item-price">
<span class="shop-item-price-icon">💵</span>
<span>$30 per box</span>
</div>
<div class="ammo-buy-buttons">
<div class="shop-buy-btn <<if $player.money < 30>>disabled<</if>>">
<<if $player.money >= 30>>
<<button "Buy 1 ($30)" "WeaponShop_Browse">>
<<set $player.money -= 30>>
<<run $player.inventory.addItemByName("rifleAmmo", 10)>>
<</button>>
<<else>>
<<button "Not enough">><</button>>
<</if>>
</div>
<div class="shop-buy-btn <<if $player.money < 300>>disabled<</if>>">
<<if $player.money >= 300>>
<<button "Buy 10 ($300)" "WeaponShop_Browse">>
<<set $player.money -= 300>>
<<run $player.inventory.addItemByName("rifleAmmo", 100)>>
<</button>>
<<else>>
<<button "Not enough">><</button>>
<</if>>
</div>
</div>
</div>
</div>
</div>
<</if>>
/* Back Button */
<div class="shop-back-btn padding-top">
<<BackButton "<<unset $weaponShopType $weaponFilter $weaponSearchQuery $weaponSortBy>> <<set $canShowStatsBtn = true>> <<set $gameSettings.allowSaves = true>>">>
</div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Locations/Downtown/CarDealership.jpg">>
<<timed 0.2s>>
<div class="centre-text">Car Dealership</div>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn"><<button "Back" "Downtown">><</button>></div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
</div>
</fieldset>
</div>
<<PeopleAround>>
<<done>><<LocationEvent 'Lana Monroe' 'CarDealer_Sales' "transition" "Media\\Characters\\QuestChars\\Other\\Lana.jpg" "npc-card" "Car dealer">><</done>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/Downtown/CarDealership.jpg">>
<<ChatWithoutNPC 'Lana' 'Media\\Characters\\QuestChars\\Other\\Lana.jpg' 'Looking for a new ride? Take a look around. Every car here is ready to drive.'>>
<<LockSettings>>
<<if !$playercars>><<set $playercars = []>><</if>>
<div id="dealership-catalog"><<include "CarDealer_Catalog">></div>
/* Said "busy" after buying the supercar, or ran short at dinner: the offer of a drink still stands. */
<<if $playercars.includes("Supercar")
&& !$player.characterEvents.isEventRegistered($player.info.id, "LanaQuest1")
&& !$player.characterEvents.isEventRegistered($player.info.id, "LanaQuest1Failed")>>
<div class="btn padding-top"><<button "Take Lana up on that drink" "LanaQuest1_Start">><</button>></div>
<</if>>
<div class="btn padding-top"><<button "Leave" "CarDealership">><<LeaveInteractionSettings>><</button>></div>
<</nobr>><<nobr>>
<section class="dealership" aria-label="Cars for sale">
<header class="dealership-heading">
<div><p class="dealership-eyebrow">Viceburg Motors</p><h2>Find your next ride</h2><p class="dealership-intro">From everyday essentials to something extraordinary.</p></div>
<div class="dealership-wallet"><span>Available cash</span><strong>$<<= Number($player.money).toLocaleString('en-US')>></strong><small><<= $playercars.length>> owned · <<= setup.carCatalog.length>> models</small></div>
</header>
<<if _carPurchase>>
<p class="dealership-notice" role="status"><<= _carPurchase.message>></p>
<</if>>
<div class="dealership-grid">
<<for _car range setup.carCatalog>>
<<capture _car>>
<article class="dealership-card" @data-car-id="_car.id">
<div class="dealership-photo">
<img @src="_car.image" @alt="_car.name + ' on display in the showroom'" loading="lazy" decoding="async" width="1200" height="800">
<<if $playercars.includes(_car.name)>><span class="dealership-owned">In your garage</span><</if>>
</div>
<div class="dealership-card-body">
<p class="dealership-category"><<= _car.category>></p>
<h3><<= _car.name>></h3>
<p class="dealership-description"><<= _car.description>></p>
<ul class="dealership-specs" aria-label="Vehicle details"><li><<= _car.seats>> seats</li><li><<= _car.powertrain>></li></ul>
<div class="dealership-purchase">
<div class="dealership-price"><span>Purchase price</span><strong>$<<= _car.price.toLocaleString('en-US')>></strong></div>
<<if $playercars.includes(_car.name)>>
<button type="button" class="dealership-buy" disabled>Owned</button>
<<elseif $player.money < _car.price>>
<button type="button" class="dealership-buy" disabled>Insufficient cash</button>
<<else>>
<<set _carBuyLabel = "Buy " + _car.name>>
<span class="dealership-buy"><<button _carBuyLabel>>
<<set _carPurchase = setup.purchaseCar(_car.id)>>
<<if _carPurchase.ok>>
<<include "Update_Travel_Mode_Buttons">>
<<include "UpdateStatBars">>
<<if _carPurchase.startsLanaQuest>>
/* The quest is only taken when the player says yes to the drink. */
<<set $lanaFromPurchase = true>>
<<goto "LanaQuest1_Start">>
<</if>>
<</if>>
<<if !_carPurchase.startsLanaQuest>>
<<replace "#dealership-catalog">><<include "CarDealer_Catalog">><</replace>>
<</if>>
<</button>></span>
<</if>>
</div>
</div>
</article>
<</capture>>
<</for>>
</div>
</section>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Locations/Other/Diner.jpg">>
<<timed 0.2s>>
<div class="centre-text">Diner</div>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn"><<button "Leave" "Downtown">><</button>></div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
<<if $dateTime.hours >= 9 && $dateTime.hours < 22>>
<<WorkBtn>>
<<WorkAllDayBtn>>
<<else>>
<div class="btn non-interacting" id="work-btn-closed"><<button "Work">><</button>></div>
<<done>>
<<run addHoverTooltip('work-btn-closed', 'The diner is open from 9:00 to 22:00')>>
<</done>>
<</if>>
</div>
</fieldset>
</div>
<<PeopleAround>>
<<PoliceChecker>>
<<if $player.attributes && $player.attributes.corruption && $player.attributes.corruption.value >= 40 && !$player.characterEvents.isEventRegistered($player.info.id, "Diner_BathroomTip")>>
<<LocationEvent 'Bathroom tip' 'Diner_BathroomTip' "transition" "Media\\Other\\Notice_Event.png">>
<</if>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Locations/Other/Diner.jpg">>
<div class="centre-text">Diner storage room</div>
<p>A quiet room behind the dining area. You can check in with your date or return to the diner.</p>
<<set _storageDateIndex = $Characters.findIndex(person => person.info.currentLocation == "DinerBackRoom" && setup.getPlayerNpcDateSession(person).meeting?.status == "active")>>
<<if _storageDateIndex >= 0>>
<<capture _storageDateIndex>>
<div class="btn"><<button "Continue your date" "enhanced_relationship_date_session">>
<<set $indexNPC = _storageDateIndex>>
<<set $interactionNpc = $Characters[$indexNPC]>>
<<LockSettings>>
<</button>></div>
<</capture>>
<</if>>
<div class="btn"><<button "Return to the diner" "Diner">><</button>></div>
<<PeopleAround>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Locations/Downtown/Downtown.jpg">>
<<timed 0.2s>>
<div class="centre-text">Downtown</div>
<<GangTurfBadge>>
<<GangStreetMsg>>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn-container gang-base-links">
<<set _gbLbl = siteLinkLabel("GB_Foundry")>>
<div class="btn"><<button _gbLbl "GB_Foundry">><</button>></div>
</div>
<div class="btn-container">
<div class="btn"><<button "Diner" "Diner">><</button>></div>
<div class="btn"><<button "Police department" "PoliceStation">><</button>></div>
<div class="btn"><<button "Car Dealership" "CarDealership">><</button>></div>
<div class="btn"><<button "Construction Site" "ConstructionSite">><</button>></div>
<div class="btn"><<button "Fire Station" "FireStation">><</button>></div>
<div class="btn"><<button "Factory" "Factory">><</button>></div>
<div class="btn"><<button "Power Plant" "PowerPlant">><</button>></div>
<div class="btn"><<button "Logistics Center" "LogisticsCenter">><</button>></div>
<div class="btn"><<button "Auto Repair Shop" "AutoRepairShop">><</button>></div>
<div class="btn"><<button "Taxi Depot" "TaxiDepot">><</button>></div>
<div class="btn"><<button "Sanitation Depot" "WasteDepot">><</button>></div>
</div>
<div class="padding-top"><<Travel "Leave" "Campus">></div>
<div class="padding-top"><<Travel "Harbor" "Port">></div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<<WantedLine>>
<div class="btn-container">
<div class="btn"><<button "Work the crowd" "Crime_Pickpocket">>
<<set $policeCrimeAuthority = { source: "choice", crime: "pickpocket", passage: "Crime_Pickpocket", day: getCurrentAbsoluteDay(), location: $player.info.currentLocation }>>
<</button>></div>
<<if $dateTime.hours gte 20 or $dateTime.hours lt 5>><div class="btn"><<button "Boost a car off the lot" "Crime_GrandTheft">>
<<set $policeCrimeAuthority = { source: "choice", crime: "grandTheft", passage: "Crime_GrandTheft", day: getCurrentAbsoluteDay(), location: $player.info.currentLocation }>>
<</button>></div><</if>>
<<EachActions>>
</div>
</fieldset>
</div>
<<PeopleAround>>
<<PoliceChecker>>
<<RandomEvent "Downtown">>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<unset $policeReturnPassage>>
<<EachLoc>>
/* Old saves may legitimately enter with a positive sentence but no day anchor;
a direct/stale entry with no numeric sentence must fail open to the station
instead of leaving the player on a screen with no working controls. */
<<if not Number.isFinite($ArrestDay)>><<set $ArrestDay = 0>><</if>>
<<if $ArrestDay < 0>><<set $ArrestDay = 0>><</if>>
/* Served time is counted in ONE place (ReleaseCell_ExpWorsening) against the
absolute-day stamp - the old per-action bookkeeping both double-counted
(Wait past midnight + unconditional Sleep decrement = 2 days per night) and
leaked (a midnight crossed during "Talk to the tank" served nothing). */
<<if not Number.isFinite($ArrestDayStamp)>><<set $ArrestDayStamp = getCurrentAbsoluteDay()>><</if>>
<<if not Number.isFinite($TankDaysServed) or $TankDaysServed lt 0>><<set $TankDaysServed = 0>><</if>>
/* Pre-authority saves did not persist TankSeverity. Repair them before the bus
redirect so HoldingCell and Police_PrisonTransfer cannot bounce forever. */
<<if $ArrestDay gt 0 and not Number.isFinite($TankSeverity)>><<set $TankSeverity = 2>><</if>>
<<if Number.isFinite($TankSeverity)>><<set $TankSeverity = Math.max(0, Math.min(2, $TankSeverity))>><</if>>
<<if $ArrestDay > 0 && getCurrentAbsoluteDay() > $ArrestDayStamp>>
<<goto "ReleaseCell_ExpWorsening">>
<</if>>
/* The tank is a way station: whoever still holds a balance when the county bus
comes (after TANK_TRANSFER_DAYS served days) rides to state prison. */
<<if $ArrestDay > 0 && $TankDaysServed gte TANK_TRANSFER_DAYS>>
<<goto "Police_PrisonTransfer">>
<</if>>
<<SetBackground "Media/Locations/Downtown/Police Station/HoldingCell.jpg">>
<<timed 0.2s>>
<div class="centre-text">Holding Cell</div>
<div class="centre-text" style="font-size:18px;">Days remaining in jail: $ArrestDay</div>
<div class="chat-container"><p class="text">Fluorescent light, scratched steel and a toilet with no wall around it. Intake never goes quiet. New prisoners come through the door cursing, bleeding or trying to bargain.</p></div>
<div class="centre-text" style="font-size:16px;">Each full day in the tank wears down a random attribute.</div>
<<if $ArrestDay > 0>>
<<set _busDays = Math.max(0, TANK_TRANSFER_DAYS - $TankDaysServed)>>
<div class="centre-text" style="font-size:16px; color:#e0a83a;">County transport arrives in <<= _busDays>> day<<= _busDays == 1 ? "" : "s">>. If you still have time left on your sentence, you will finish it in state prison.</div>
<</if>>
<<if not Array.isArray($policeCustodySeen)>><<set $policeCustodySeen = []>><</if>>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<<if $ArrestDay <= 0>>
<div class="btn"><<button "Collect your property and leave">>
<<set $police.dayPass = true>><<set $policeDayPass = true>>
<<set $policeCellEvent = null>><<set $policeCellOutcome = "">><<set $policeCellVideo = "">><<set $policeCustodySeen = []>>
<<unset $ArrestDayStamp $TankDaysServed $TankSeverity>>
<<goto "PoliceRoom">>
<</button>></div>
<<else>>
<div class="btn non-interacting"><<button "Leave">><</button>></div>
<</if>>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<if $ArrestDay > 0>>
<div class="btn"><<button "Wait" "WaitInPoliceCell">><</button>></div>
<<set _custAdult = CheckContentFilter($player.gender(), $player)>>
<<set _custPreview = pickPoliceCustodyEvent(() => 0, { adult: _custAdult, nonConsent: ($gameSettings.contentFilter.nonConsent === true), excluded: $policeCustodySeen, maleOk: CheckContentFilter("Male", $player) })>>
<<if _custPreview>>
<div class="btn"><<button "Talk to the tank">>
<<set $policeCellEvent = pickPoliceCustodyEvent(undefined, { adult: _custAdult, nonConsent: ($gameSettings.contentFilter.nonConsent === true), excluded: $policeCustodySeen, maleOk: CheckContentFilter("Male", $player) })>>
<<if $policeCellEvent>>
<<run $policeCustodySeen.push($policeCellEvent.key)>>
<<SpendTime 30>>
<<goto "PoliceCellEvent">>
<<else>>
<<goto "HoldingCell">>
<</if>>
<</button>></div>
<</if>>
<<if $dateTime.hours < 22 && $dateTime.hours >= 6>>
<div class="btn"><<button "Wait until night" "WaitUntilNight">><</button>></div>
<</if>>
<<if $dateTime.hours >= 22 || $dateTime.hours < 6>>
<div class="btn"><<button "Sleep" "SleepInPoliceCell">><</button>></div>
<</if>>
<</if>>
</div>
</fieldset>
</div>
<<PeopleAround>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _custodyActive = Number.isFinite($ArrestDay) and $ArrestDay gt 0 and Number.isFinite($ArrestDayStamp)>>
<<if not _custodyActive>>
<<goto "HoldingCell">>
<<else>>
<<if not Array.isArray($policeCustodySeen)>><<set $policeCustodySeen = []>><</if>>
<<SpendTime 60>>
<<if $ArrestDayStamp isnot undefined && getCurrentAbsoluteDay() > $ArrestDayStamp>>
<<goto "ReleaseCell_ExpWorsening">>
<<else>>
<<set _custAdult = CheckContentFilter($player.gender(), $player)>>
<<if random(1, 100) lte 55>>
<<set $policeCellEvent = pickPoliceCustodyEvent(undefined, { adult: _custAdult, nonConsent: ($gameSettings.contentFilter.nonConsent === true), excluded: $policeCustodySeen, maleOk: CheckContentFilter("Male", $player) })>>
<</if>>
<<if $policeCellEvent>>
<<run $policeCustodySeen.push($policeCellEvent.key)>>
<<goto "PoliceCellEvent">>
<<else>>
<<goto "HoldingCell">>
<</if>>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _custodyActive = Number.isFinite($ArrestDay) and $ArrestDay gt 0 and Number.isFinite($ArrestDayStamp)>>
<<if not _custodyActive>>
<<goto "HoldingCell">>
<<else>>
/* Advance through the shared clock. Mutating minutes in a loop never updates
hours, so the old implementation hung forever as soon as this passage ran. */
<<set _untilNight = Math.max(0, (22 * 60) - (($dateTime.hours * 60) + $dateTime.minutes))>>
<<if _untilNight gt 0>><<SpendTime _untilNight>><</if>>
<<goto "HoldingCell">>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/Downtown/Police Station/HoldingCell.jpg">>
<<set _cellCustodyActive = Number.isFinite($ArrestDay) and $ArrestDay gt 0 and Number.isFinite($ArrestDayStamp)>>
<<set _cellResultPending = Number.isFinite($ArrestDay) and $ArrestDay gte 0 and Number.isFinite($ArrestDayStamp) and $policeCellEvent and $policeCellOutcome and $policeCellOutcome isnot "">>
<<if not _cellCustodyActive and not _cellResultPending>>
<<set $policeCellEvent = null>><<set $policeCellOutcome = "">><<set $policeCellVideo = "">>
<<goto "HoldingCell">>
<<else>>
/* Saves can restore this passage after the player has changed content filters.
Re-fetch the canonical event by key, then apply the same adult, coercion and
fixed-partner gates used by the event picker before showing any prose/media. */
<<set _custAdult = CheckContentFilter($player.gender(), $player)>>
<<set _custNonConsent = ($gameSettings.contentFilter.nonConsent === true)>>
<<set _custMaleOk = CheckContentFilter("Male", $player)>>
<<set _cellEvent = ($policeCellEvent and $policeCellEvent.key) ? getPoliceCustodyEvent($policeCellEvent.key) : null>>
<<set _cellEventAllowed = !!_cellEvent and (not _cellEvent.adult or _custAdult) and (not _cellEvent.coercive or (_custAdult and _custNonConsent)) and (not _cellEvent.partnerGender or _custMaleOk)>>
<<if not _cellEventAllowed>>
<<set $policeCellEvent = null>><<set $policeCellOutcome = "">><<set $policeCellVideo = "">>
<<goto "HoldingCell">>
<<else>>
<<set $policeCellEvent = _cellEvent>>
<div class="centre-text"><<= $policeCellEvent.title>></div>
<<if $policeCellOutcome and $policeCellOutcome isnot "">>
<<PrisonMediaProse $policeCellOutcome $policeCellVideo>>
<<if $policeCellVideo and $policeCellVideo isnot "">><<Video $policeCellVideo>><<set $policeCellVideo = "">><</if>>
<div class="btn padding-top"><<button "Back to the bench">>
<<set $policeCellOutcome = "">>
<<set $policeCellEvent = null>>
<<goto "HoldingCell">>
<</button>></div>
<<else>>
/* The tank mirrors the player's gender - a Female player gets the female
variant of the setup where one exists. */
<<set _cellEventText = ($player.gender() is "Female" and $policeCellEvent.textF) ? $policeCellEvent.textF : $policeCellEvent.text>>
<<PrisonProse _cellEventText>>
<div class="btn-container">
<<for _choice range $policeCellEvent.choices>>
<<capture _choice>>
<div class="btn"><<button _choice.label>>
/* Revalidate again at activation so a stale DOM or restored choice cannot
execute an event that the current filters no longer permit. */
<<set _clickAdult = CheckContentFilter($player.gender(), $player)>>
<<set _clickNonConsent = ($gameSettings.contentFilter.nonConsent === true)>>
<<set _clickMaleOk = CheckContentFilter("Male", $player)>>
<<set _clickEvent = ($policeCellEvent and $policeCellEvent.key) ? getPoliceCustodyEvent($policeCellEvent.key) : null>>
<<set _clickAllowed = !!_clickEvent and (not _clickEvent.adult or _clickAdult) and (not _clickEvent.coercive or (_clickAdult and _clickNonConsent)) and (not _clickEvent.partnerGender or _clickMaleOk)>>
<<if not _clickAllowed>>
<<set $policeCellEvent = null>><<set $policeCellOutcome = "">><<set $policeCellVideo = "">>
<<goto "HoldingCell">>
<<else>>
<<set $policeCellEvent = _clickEvent>>
<<set _ctx = { speech: ($player.attributes.speech ? $player.attributes.speech.value : 3), stealth: $player.attributes.dexterity.value, dominance: ($player.attributes.dominance ? $player.attributes.dominance.value : 5), wanted: getWanted($police), money: $player.money, partnerGender: $player.gender() }>>
<<set _out = resolvePoliceCustodyChoice($policeCellEvent.key, _choice.key, _ctx)>>
<<if _out.wantedDelta>><<run adjustWanted($police, _out.wantedDelta)>><</if>>
<<if _out.notorietyDelta>><<set $police.notoriety = Math.max(0, ($police.notoriety || 0) + _out.notorietyDelta)>><</if>>
<<if _out.arrestDaysDelta>><<set $ArrestDay = Math.max(0, $ArrestDay + _out.arrestDaysDelta)>><</if>>
<<if _out.moneyDelta>><<set $player.money = Math.max(0, $player.money + _out.moneyDelta)>><</if>>
<<if _out.attribute and _out.attributeProgress>><<SetCharProgression $player _out.attribute _out.attributeProgress true>><</if>>
<<set $policeCellVideo = "">>
<<if _out.video>>
<<set _pg = $player.gender()>>
<<set _top = _out.video.playerBottom ? _out.video.partner : _pg>>
<<set _bottom = _out.video.playerBottom ? _pg : _out.video.partner>>
<<if CheckContentFilter(_out.video.partner, $player)>>
<<if _out.video.oral>>
<<SetOralPick _top _bottom>><<set $policeCellVideo = _pick>>
<<elseif _out.video.anal>>
/* Explicitly anal prose - keep it out of the female-bottom vaginal pool. */
<<SetAnalPick _top _bottom>><<set $policeCellVideo = _pick>>
<<elseif _bottom is "Female">>
<<SetVagPick _top "Female">><<set $policeCellVideo = _pick>>
<<else>>
<<SetAnalPick _top _bottom>><<set $policeCellVideo = _pick>>
<</if>>
<<SetCharProgression $player "corruption" 1 true>>
<</if>>
<</if>>
<<set $policeCellOutcome = _out.text>>
<<goto "PoliceCellEvent">>
<</if>>
<</button>></div>
<</capture>>
<</for>>
</div>
<</if>>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _custodyActive = Number.isFinite($ArrestDay) and $ArrestDay gt 0 and Number.isFinite($ArrestDayStamp)>>
<<if not _custodyActive>>
<<goto "HoldingCell">>
<<else>>
/* No unconditional decrement here: ReleaseCell_ExpWorsening counts the served
day from the absolute-day stamp after the clock actually advances. A pre-dawn
sleep whose midnight was already counted by a late-evening Wait no longer
serves a second day. */
<<Sleep "ReleaseCell_ExpWorsening">>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<goto "HoldingCell">>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _custodyActive = Number.isFinite($ArrestDay) and $ArrestDay gt 0 and Number.isFinite($ArrestDayStamp)>>
<<if not _custodyActive>>
<<goto "HoldingCell">>
<<else>>
<<if not Array.isArray($policeCustodySeen)>><<set $policeCustodySeen = []>><</if>>
<<set _custAdult = CheckContentFilter($player.gender(), $player)>>
<<set $policeCellEvent = pickPoliceCustodyEvent(undefined, { adult: _custAdult, nonConsent: ($gameSettings.contentFilter.nonConsent === true), excluded: $policeCustodySeen, maleOk: CheckContentFilter("Male", $player) })>>
<<if $policeCellEvent>><<run $policeCustodySeen.push($policeCellEvent.key)>><<goto "PoliceCellEvent">><<else>><<goto "HoldingCell">><</if>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _custodyReleaseValid = Number.isFinite($ArrestDay) and $ArrestDay lte 0 and Number.isFinite($ArrestDayStamp)>>
<<if _custodyReleaseValid>>
<<set $police.dayPass = true>><<set $policeDayPass = true>>
<<set $policeCellEvent = null>><<set $policeCellOutcome = "">><<set $policeCellVideo = "">><<set $policeCustodySeen = []>>
<<goto "HoldingCell">>
<<else>>
<<goto "HoldingCell">>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
/* THE single point that serves tank time: compare the clock against the
absolute-day stamp so every route (Wait, Sleep, a talk that ran past
midnight) counts each calendar night exactly once. */
<<if not Number.isFinite($ArrestDayStamp)>><<set $ArrestDayStamp = getCurrentAbsoluteDay()>><</if>>
<<set _served = Math.max(0, getCurrentAbsoluteDay() - $ArrestDayStamp)>>
<<set $ArrestDayStamp = getCurrentAbsoluteDay()>>
<<if _served > 0 && $ArrestDay > 0>>
<<set $ArrestDay = Math.max(0, $ArrestDay - _served)>>
<<set $TankDaysServed = ($TankDaysServed || 0) + _served>>
/* The county bus: still holding a balance after the grace window means the
rest of the bit is served in state prison, not on this bench. */
<<if $ArrestDay > 0 && $TankDaysServed gte TANK_TRANSFER_DAYS>>
<<goto "Police_PrisonTransfer">>
<</if>>
<<set _params = ['speech','intelligence','strength','vitality','dexterity','defense','dominance'].random()>>
<<set _randomProgression = Random(-20, -5)>>
<<SetCharProgression $player _params _randomProgression true>>
<div class="btn padding-top"><<button "Continue" "HoldingCell">><</button>></div>
<<else>>
<<goto "HoldingCell">>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _transferReady = Number.isFinite($ArrestDay) and $ArrestDay gt 0 and Number.isFinite($ArrestDayStamp) and Number.isFinite($TankDaysServed) and $TankDaysServed gte TANK_TRANSFER_DAYS and Number.isFinite($TankSeverity)>>
<<if not _transferReady>>
<<goto "HoldingCell">>
<<else>>
<<SetBackground "Media/Locations/Downtown/Police Station/HoldingCell.jpg">>
<div class="centre-text">The County Bus</div>
<div class="chat-container"><p class="text">Two county deputies work down the bench with a clipboard and a chain. Your name is on the transport list. The cuffs go on in front, the chain runs through the waist loop, and the deputies march the line toward the loading dock.</p></div>
<div class="chat-container"><p class="text">The city slides past behind the bus window's steel mesh. At state prison, a razor-wire gate rolls aside and the bus crawls through.</p></div>
<div class="btn padding-top"><<button "Ride it out">>
/* The tank charge converts to a short stint; priors stack inside
normal bookings, while this transfer carries the already-adjusted balance
upstate. Tank state is cleared so nothing is served twice. */
<<set _transferStillReady = Number.isFinite($ArrestDay) and $ArrestDay gt 0 and Number.isFinite($ArrestDayStamp) and Number.isFinite($TankDaysServed) and $TankDaysServed gte TANK_TRANSFER_DAYS and Number.isFinite($TankSeverity)>>
<<if _transferStillReady>>
<<set _transferSev = Math.max(1, Math.min(2, $TankSeverity))>>
<<set _transferSentence = $ArrestDay>>
<<set $ArrestDay = 0>>
<<unset $ArrestDayStamp $TankDaysServed $TankSeverity>>
<<set $policeCellEvent = null>><<set $policeCellOutcome = "">><<set $policeCellVideo = "">><<set $policeCustodySeen = []>>
<<run arrestPlayer(_transferSev, _transferSentence)>>
<<LeaveInteractionSettings>>
<<goto "Prison_Intake">>
<<else>>
<<goto "HoldingCell">>
<</if>>
<</button>></div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Locations/Downtown/Police Station/PoliceRoom.jpg">>
<<timed 0.2s>>
<div class="centre-text">Squad Room</div>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
/* <div class="btn"><<button "Cell" "HoldingCell">><</button>></div> */
<div class="btn"><<button "Front desk" "PoliceFrontDesk">><</button>></div>
<div class="btn padding-top"><<button "Leave" "PoliceStation">><</button>></div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
</div>
</fieldset>
</div>
<<PeopleAround>>
<<PoliceChecker>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Locations/Downtown/Police Station/PoliceStation.jpg">>
<<timed 0.2s>>
<div class="centre-text">Viceburg Police Department</div>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn"><<button "Squad room" "PoliceRoom">><</button>></div>
<div class="btn padding-top"><<button "Leave" "Downtown">><</button>></div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
</div>
</fieldset>
</div>
<<PeopleAround>>
<<PoliceChecker>>
<</timed>>
<</nobr>><<nobr>>
/* Main entry point for room search - logic only, immediate redirect */
/* Save the room passage name so we can return to it on success */
<<set $searchReturnPassage = $player.info.currentLocation>>
/* Register daily event to prevent re-searching this room today */
<<run $player.dailyEvents.registerEvent($currentHouseId, $searchRoomLabel)>>
/* Spend 30 minutes searching and drain energy */
<<SpendTime 30>>
<<run $player.status.energy.decrease(15)>>
<<set _residentIds = getHouseResidentIds($currentHouseId)>>
/* Check if any resident NPC is in the same room as the player */
<<set _roomChars = $Locations[$searchRoomLocKey] || []>>
<<set _foundInRoom = false>>
<<set _caughtNpcIndex = -1>>
<<for _rc = 0; _rc < _roomChars.length; _rc++>>
<<set _charObj = $Characters[_roomChars[_rc]]>>
<<if _charObj && _residentIds.includes(_charObj.info.id) && _foundInRoom == false>>
<<set _foundInRoom = true>>
<<set _caughtNpcIndex = _roomChars[_rc]>>
<</if>>
<</for>>
<<if _foundInRoom>>
/* NPC is in the same room - caught immediately */
<<set $searchCaughtNpcIndex = _caughtNpcIndex>>
<<goto "NPC_House_Search_CaughtByResident">>
<</if>>
/* Check if any resident NPC is elsewhere in the house */
<<set _houseRoomKeys = getHouseRoomKeys($currentHouseId)>>
<<run _houseRoomKeys.unshift("NPC_House_" + $currentHouseId)>>
<<set _someoneElseHome = false>>
<<set _suspiciousNpcIndex = -1>>
<<for _rk = 0; _rk < _houseRoomKeys.length; _rk++>>
/* Skip the room we're searching - already checked above */
<<if _houseRoomKeys[_rk] != $searchRoomLocKey>>
<<set _otherRoomChars = $Locations[_houseRoomKeys[_rk]] || []>>
<<for _rc = 0; _rc < _otherRoomChars.length; _rc++>>
<<set _charObj = $Characters[_otherRoomChars[_rc]]>>
<<if _charObj && _residentIds.includes(_charObj.info.id) && _someoneElseHome == false>>
<<set _someoneElseHome = true>>
<<set _suspiciousNpcIndex = _otherRoomChars[_rc]>>
<</if>>
<</for>>
<</if>>
<</for>>
<<if _someoneElseHome>>
/* NPC from another room comes to investigate the noise */
<<set $searchSuspiciousNpcIndex = _suspiciousNpcIndex>>
<<goto "NPC_House_Search_Suspicious">>
<</if>>
/* No one home - search succeeds without interruption */
<<goto "NPC_House_Search_Success">>
<</nobr>><<nobr>>
<<SaveLocation>>
<<EachLoc>>
<<set _houseReturnPassage = $npcHouseReturnPassage || "Neighborhood">>
<<SetBackground "Media/Locations/City/ResidentialArea/LivingRoom.jpg">>
<<timed 0.2s>>
<<set _houseName = getHouseDisplayName($currentHouseId)>>
<<set _npc = $Characters[$searchCaughtNpcIndex]>>
<div class="centre-text"><<print _houseName>> - Caught Searching!</div>
<<ShowNpcIcon _npc>>
<<set _caughtPhrase = [
"What do you think you're doing?! Are you going through my stuff?!",
"Hey! What the hell are you looking for in here?!",
"I can't believe this... You're searching through my things?!",
"What is this?! Are you trying to rob me?!"
].random()>>
<<Chat _npc _caughtPhrase>>
<<ChatMessage `_npc.info.firstName + " caught you searching the room!"`>>
/* Worsen relations: friendship -10...-20, anger +5...+10 */
<<set _decreaseRelations = Random(-10, -20)>>
<<IncreaseFriendship $player _npc _decreaseRelations>>
<<run _npc.getRelationship($player.info.id).metrics.increaseAnger(Random(5, 10, true))>>
<<run $player.getRelationship(_npc.info.id).metrics.increaseAnger(Random(5, 10, true))>>
/* Determine NPC reaction: fight or kick out */
<<set _isAggressive = _npc.info.characterTraits.includes("Aggressive")>>
<<set _rel = _npc.getRelationship($player.info.id, false)>>
<<set _npcAnger = _rel ? _rel.metrics.anger : 0>>
/* Base fight chance: 80% if aggressive, 30% otherwise */
<<set _fightChance = _isAggressive ? 80 : 30>>
/* High anger (>30) adds +20% fight chance */
<<if _npcAnger > 30>>
<<set _fightChance = Math.min(95, _fightChance + 20)>>
<</if>>
<<set _confrontRoll = Random(1, 100)>>
<<if _confrontRoll <= _fightChance>>
/* --- NPC attacks --- */
<<set _attackPhrase = [
"That's it! I'm going to teach you a lesson!",
"You're going to regret going through my things!",
"Nobody steals from me and gets away with it!",
"You asked for this!"
].random()>>
<<Chat _npc _attackPhrase>>
<<ChatMessage `_npc.info.firstName + " attacks you!"`>>
<div class="btn padding-top">
<<button "Fight!">>
<<set $indexNPC = $searchCaughtNpcIndex>>
<<set $interactionNpc = $Characters[$searchCaughtNpcIndex]>>
<<set _battleSetControls = {attack: true, seduce: false, items: true, actions: true}>>
<<StartFight $player $interactionNpc _battleSetControls "NPC_House_Search_Fight_Win" "NPC_House_Search_Fight_Lose">>
<</button>>
</div>
<<else>>
/* --- NPC kicks the player out --- */
<<set _kickPhrase = [
"Get out of my house! Now!",
"I want you out! Don't ever come back!",
"Leave! Before I change my mind and call the cops!",
"Out! And don't let me catch you doing this again!"
].random()>>
<<Chat _npc _kickPhrase>>
<<ChatMessage `_npc.info.firstName + " kicked you out of the house."`>>
<div class="btn padding-top">
<<button "Leave" _houseReturnPassage>>
<<unset $lockpickSuccess>>
<<unset $brokeIntoHouse>>
<<unset $searchRoomLocKey>>
<<unset $searchRoomLabel>>
<<unset $searchReturnPassage>>
<<unset $searchCaughtNpcIndex>>
<<unset $searchSuspiciousNpcIndex>>
<<unset $npcHouseReturnPassage>>
<</button>>
</div>
<</if>>
<</timed>>
<</nobr>><<nobr>>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Locations/City/ResidentialArea/LivingRoom.jpg">>
<<timed 0.2s>>
<<set _houseName = getHouseDisplayName($currentHouseId)>>
<<set _npc = $Characters[$searchSuspiciousNpcIndex]>>
<div class="centre-text"><<print _houseName>> - Someone Heard You!</div>
<<ShowNpcIcon _npc>>
<<set _suspiciousPhrase = [
"What's going on in here? I heard some strange noises...",
"Hey, what are you doing? I heard a commotion...",
"What's all this noise about? What are you up to?",
"I thought I heard something... What's happening in here?"
].random()>>
<<Chat _npc _suspiciousPhrase>>
<<ChatMessage `_npc.info.firstName + " came to investigate the noise you made while searching."`>>
<div class="btn-container padding-top">
<div class="btn"><<button "Try to talk your way out" "NPC_House_Search_DeceiveResult">><</button>></div>
</div>
<</timed>>
<</nobr>><<nobr>>
<<SaveLocation>>
<<EachLoc>>
<<set _houseReturnPassage = $npcHouseReturnPassage || "Neighborhood">>
<<SetBackground "Media/Locations/City/ResidentialArea/LivingRoom.jpg">>
<<timed 0.2s>>
<<set _houseName = getHouseDisplayName($currentHouseId)>>
<<set _npc = $Characters[$searchSuspiciousNpcIndex]>>
<div class="centre-text"><<print _houseName>> - Deception Attempt</div>
<<ShowNpcIcon _npc>>
/* Player tries an excuse */
<<set _excusePhrase = [
"Oh, I just dropped something and was looking for it.",
"Sorry about the noise! I was just tidying up a little.",
"I thought I saw a bug and was trying to catch it!",
"I accidentally knocked something over, my bad!"
].random()>>
<<Chat $player _excusePhrase>>
/* 50% chance to successfully deceive */
<<set _deceiveRoll = Random(1, 100)>>
<<if _deceiveRoll <= 50>>
/* --- Deception succeeds --- */
<<set _believePhrase = [
"Oh... okay. Just try to keep it down, alright?",
"Hmm, alright. Be more careful next time.",
"Fine, just don't make so much noise.",
"Okay, I guess. Just be quiet, please."
].random()>>
<<Chat _npc _believePhrase>>
<<ChatMessage `_npc.info.firstName + " believed your excuse and left."`>>
<div class="btn padding-top">
<<button "Continue searching" "NPC_House_Search_Success">><</button>>
</div>
<<else>>
/* --- Deception fails --- */
<<set _disbelievePhrase = [
"I don't buy that for a second! You were going through our things!",
"Liar! I can see you were searching through the drawers!",
"Do you think I'm stupid?! I can see what you were doing!",
"Nice try, but I wasn't born yesterday! You're a thief!"
].random()>>
<<Chat _npc _disbelievePhrase>>
<<ChatMessage `_npc.info.firstName + " didn't believe you!"`>>
/* Worsen relations: friendship -10...-20, anger +5...+10 */
<<set _decreaseRelations = Random(-10, -20)>>
<<IncreaseFriendship $player _npc _decreaseRelations>>
<<run _npc.getRelationship($player.info.id).metrics.increaseAnger(Random(5, 10, true))>>
<<run $player.getRelationship(_npc.info.id).metrics.increaseAnger(Random(5, 10, true))>>
/* Determine NPC reaction: fight or kick out */
<<set _isAggressive = _npc.info.characterTraits.includes("Aggressive")>>
<<set _rel = _npc.getRelationship($player.info.id, false)>>
<<set _npcAnger = _rel ? _rel.metrics.anger : 0>>
/* Base fight chance: 80% if aggressive, 30% otherwise */
<<set _fightChance = _isAggressive ? 80 : 30>>
/* High anger (>30) adds +20% fight chance */
<<if _npcAnger > 30>>
<<set _fightChance = Math.min(95, _fightChance + 20)>>
<</if>>
<<set _confrontRoll = Random(1, 100)>>
<<if _confrontRoll <= _fightChance>>
/* --- NPC attacks --- */
<<set _attackPhrase = [
"That's it! I'm going to teach you a lesson!",
"You're going to regret going through my things!",
"Nobody steals from me and gets away with it!",
"You asked for this!"
].random()>>
<<Chat _npc _attackPhrase>>
<<ChatMessage `_npc.info.firstName + " attacks you!"`>>
<div class="btn padding-top">
<<button "Fight!">>
<<set $searchCaughtNpcIndex = $searchSuspiciousNpcIndex>>
<<set $indexNPC = $searchSuspiciousNpcIndex>>
<<set $interactionNpc = $Characters[$searchSuspiciousNpcIndex]>>
<<set _battleSetControls = {attack: true, seduce: false, items: true, actions: true}>>
<<StartFight $player $interactionNpc _battleSetControls "NPC_House_Search_Fight_Win" "NPC_House_Search_Fight_Lose">>
<</button>>
</div>
<<else>>
/* --- NPC kicks the player out --- */
<<set _kickPhrase = [
"Get out of my house! Now!",
"I want you out! Don't ever come back!",
"Leave! Before I change my mind and call the cops!",
"Out! And don't let me catch you doing this again!"
].random()>>
<<Chat _npc _kickPhrase>>
<<ChatMessage `_npc.info.firstName + " kicked you out of the house."`>>
<div class="btn padding-top">
<<button "Leave" _houseReturnPassage>>
<<unset $lockpickSuccess>>
<<unset $brokeIntoHouse>>
<<unset $searchRoomLocKey>>
<<unset $searchRoomLabel>>
<<unset $searchReturnPassage>>
<<unset $searchSuspiciousNpcIndex>>
<<unset $searchCaughtNpcIndex>>
<<unset $npcHouseReturnPassage>>
<</button>>
</div>
<</if>>
<</if>>
<</timed>>
<</nobr>><<nobr>>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Locations/City/ResidentialArea/LivingRoom.jpg">>
<<timed 0.2s>>
<<set _houseName = getHouseDisplayName($currentHouseId)>>
<div class="centre-text"><<print _houseName>> - Search Complete</div>
/* The cash belongs to the residents (npcMoneyLedger.takeFromHouse); <<AddMoney>> credits the player. */
<<set _foundMoney = setup.npcMoney.takeFromHouse($currentHouseId, Random(50, 200))>>
<<AddMoney _foundMoney>>
/* Breaking into a house is burglary - roll detection off the pre-crime state (so a
fresh warrant for this act does not inflate its own catch), then stamp heat, a
warrant, and local district scrutiny (doc 19.3-19.4). */
<<set _burgDet = streetDetectionChance($police, { crime: 'burglary', district: $player.info.currentLocation, hour: $dateTime.hours, stealth: $player.attributes.dexterity.value })>>
<<run raiseWanted($police, 'burglary', getCurrentAbsoluteDay(), $player.info.currentLocation)>>
<<if _foundMoney > 0>>
<<ChatMessage `"You carefully searched the room and found $" + _foundMoney + "!"`>>
<<else>>
<<ChatMessage "You carefully searched the room, but there was no cash lying around.">>
<</if>>
<<if rollDetected(_burgDet)>>
<div class="chat-container"><p class="text">You are barely back on the sidewalk when a cruiser rolls up and a spotlight pins you to the wall.</p></div>
<div class="btn padding-top">
<<button "Face the officer" "Police_Stop">>
<<set $policeStopCrime = "burglary">>
<<set $policeReturnPassage = $searchReturnPassage>>
<<unset $searchRoomLocKey>>
<<unset $searchRoomLabel>>
<<unset $searchReturnPassage>>
<<unset $searchSuspiciousNpcIndex>>
<<unset $searchCaughtNpcIndex>>
<</button>>
</div>
<<else>>
<div class="btn padding-top">
<<button "Back" `$searchReturnPassage`>>
<<unset $searchRoomLocKey>>
<<unset $searchRoomLabel>>
<<unset $searchReturnPassage>>
<<unset $searchSuspiciousNpcIndex>>
<<unset $searchCaughtNpcIndex>>
<</button>>
</div>
<</if>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _houseReturnPassage = $npcHouseReturnPassage || "Neighborhood">>
<<SetBackground "Media/Locations/City/ResidentialArea/LivingRoom.jpg">>
<<timed 0.2s>>
<<set _houseName = getHouseDisplayName($currentHouseId)>>
<div class="centre-text"><<print _houseName>> - Victory</div>
<<ShowNpcIcon $interactionNpc>>
<<set _defeatPhrase = [
"Ugh... fine... you win this time...",
"This isn't over... I'm getting out of here...",
"Don't think this changes anything...",
"You got lucky... but I won't forget this."
].random()>>
<<Chat $interactionNpc _defeatPhrase>>
<<ChatMessage `$interactionNpc.info.firstName + " has been defeated and flees the house."`>>
/* Worsen relations: friendship -15...-25, anger +5...+10 */
<<set _decreaseRelations = Random(-15, -25)>>
<<IncreaseFriendship $player $interactionNpc _decreaseRelations>>
<<run $interactionNpc.getRelationship($player.info.id).metrics.increaseAnger(Random(5, 10, true))>>
<<run $player.getRelationship($interactionNpc.info.id).metrics.increaseAnger(Random(5, 10, true))>>
/* Relocate the defeated NPC outside their home */
<<run RandomRelocateCharacter($searchCaughtNpcIndex)>>
<div class="btn padding-top">
<<button "Leave" _houseReturnPassage>>
<<unset $lockpickSuccess>>
<<unset $brokeIntoHouse>>
<<unset $searchRoomLocKey>>
<<unset $searchRoomLabel>>
<<unset $searchReturnPassage>>
<<unset $searchCaughtNpcIndex>>
<<unset $searchSuspiciousNpcIndex>>
<<unset $interactionNpc $fightPhrasesNpcWon $fightPhrasesPlayerWon>>
<<unset $npcHouseReturnPassage>>
<<set $canShowStatsBtn = true>>
<<set $gameSettings.allowSaves = true>>
<</button>>
</div>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _houseReturnPassage = $npcHouseReturnPassage || "Neighborhood">>
<<SetBackground "Media/Locations/City/ResidentialArea/LivingRoom.jpg">>
<<timed 0.2s>>
<<set _houseName = getHouseDisplayName($currentHouseId)>>
<div class="centre-text"><<print _houseName>> - Defeat</div>
<<ShowNpcIcon $interactionNpc>>
<<set _winPhrase = [
"Pathetic! Trying to steal from me? Get out!",
"That's what you get for going through my things! Now scram!",
"You thought you could rob me? Think again!",
"Next time you try this, it'll be worse. Now get lost!"
].random()>>
<<Chat $interactionNpc _winPhrase>>
<<ChatMessage `$interactionNpc.info.firstName + " defeated you and threw you out of the house."`>>
/* Worsen relations: friendship -15...-25, anger +5...+10 */
<<set _decreaseRelations = Random(-15, -25)>>
<<IncreaseFriendship $player $interactionNpc _decreaseRelations>>
<<run $interactionNpc.getRelationship($player.info.id).metrics.increaseAnger(Random(5, 10, true))>>
<<run $player.getRelationship($interactionNpc.info.id).metrics.increaseAnger(Random(5, 10, true))>>
<div class="btn padding-top">
<<button "Leave" _houseReturnPassage>>
<<unset $lockpickSuccess>>
<<unset $brokeIntoHouse>>
<<unset $searchRoomLocKey>>
<<unset $searchRoomLabel>>
<<unset $searchReturnPassage>>
<<unset $searchCaughtNpcIndex>>
<<unset $searchSuspiciousNpcIndex>>
<<unset $interactionNpc $fightPhrasesNpcWon $fightPhrasesPlayerWon>>
<<unset $npcHouseReturnPassage>>
<<set $canShowStatsBtn = true>>
<<set $gameSettings.allowSaves = true>>
<</button>>
</div>
<</timed>>
<</nobr>><<if $npcHouseReturnPassage == "OakStreet_Neighborhood">>
<<unset $npcHouseReturnPassage>>
<<goto "OakStreet_Neighborhood">>
<</if>>
<<nobr>>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Locations/City/ResidentialArea/ResidentialArea.jpg">>
<<timed 0.2s>>
<div class="centre-text">Neighborhood</div>
/* Build combined house list and calculate pages */
<<set _allHouses = []>>
<<if $Families && $Families.length > 0>>
<<for _fi = 0; _fi < $Families.length; _fi++>>
<<run _allHouses.push($Families[_fi].houseId)>>
<</for>>
<</if>>
<<if $SoloHouses && $SoloHouses.length > 0>>
<<for _si = 0; _si < $SoloHouses.length; _si++>>
<<run _allHouses.push($SoloHouses[_si].houseId)>>
<</for>>
<</if>>
<<set _housesPerPage = 9>>
<<set _totalPages = Math.ceil(_allHouses.length / _housesPerPage)>>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<<if _allHouses.length > 0>>
/* Page tabs - only show if more than one page */
<<if _totalPages > 1>>
<div class="neighborhood-tabs">
<<for _p = 0; _p < _totalPages; _p++>>
<<capture _p>>
<div @class="'neighborhood-tab' + (_p === 0 ? ' active' : '')" @id="'nb-tab-' + _p">
<<link `String(_p + 1)`>>
<<run document.querySelectorAll('.neighborhood-tab').forEach(function(t) { t.classList.remove('active'); })>>
<<run document.getElementById('nb-tab-' + _p).classList.add('active')>>
<<replace "#neighborhood-houses">><<NeighborhoodHousePage _p>><</replace>>
<</link>>
</div>
<</capture>>
<</for>>
</div>
<</if>>
/* House buttons for the current page */
<div id="neighborhood-houses">
<<NeighborhoodHousePage 0>>
</div>
<<else>>
<div class="btn-container">
<div class="btn non-interacting"><<button "No houses here">><</button>></div>
</div>
<</if>>
<div class="padding-top">
<div class="btn"><<button "Back" "ResidentialArea">><</button>></div>
</div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
</div>
</fieldset>
</div>
<<PeopleAround>>
<<PoliceChecker>>
<</timed>>
<</nobr>><<nobr>>
/* Living Room - main entry point of NPC house */
<<SaveLocation>>
<<EachLoc>>
<<set _houseReturnPassage = $npcHouseReturnPassage || "Neighborhood">>
/* --- Door/Key Check --- */
<<set _houseName = getHouseDisplayName($currentHouseId)>>
<<set _residentIds = getHouseResidentIds($currentHouseId)>>
<<set _hasKeys = false>>
<<for _ri = 0; _ri < _residentIds.length; _ri++>>
<<if $player.characterEvents.isEventRegistered(_residentIds[_ri], "Have house keys")>>
<<set _hasKeys = true>>
<</if>>
<</for>>
/* Allow entry if player picked the lock this visit */
<<if $lockpickSuccess === $currentHouseId>>
<<set _hasKeys = true>>
<</if>>
<<if _hasKeys>>
/* Break-in confrontation check for living room */
<<if $brokeIntoHouse === $currentHouseId>>
<<set _houseLocKey = "NPC_House_" + $currentHouseId>>
<<set _roomChars = $Locations[_houseLocKey] || []>>
<<set _foundResident = false>>
<<for _rc = 0; _rc < _roomChars.length; _rc++>>
<<set _charObj = $Characters[_roomChars[_rc]]>>
<<if _charObj && _residentIds.includes(_charObj.info.id) && _foundResident == false>>
<<set _foundResident = true>>
<<set $breakInNpcIndex = _roomChars[_rc]>>
<</if>>
<</for>>
<<if _foundResident>>
<<goto "NPC_House_Confrontation">>
<</if>>
<</if>>
/* --- Player has keys: show full house interior --- */
<<SetBackground "Media/Locations/City/ResidentialArea/LivingRoom.jpg">>
<<timed 0.2s>>
<<set _houseLocKey = "NPC_House_" + $currentHouseId>>
<<set _isFamily = isFamilyHouse($currentHouseId)>>
<<set _childCount = getHouseChildrenCount($currentHouseId)>>
<div class="centre-text"><<print _houseName>> - Living Room</div>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn-container">
<div class="btn"><<button "Leave" _houseReturnPassage>><<unset $lockpickSuccess>><<unset $brokeIntoHouse>><<unset $npcHouseReturnPassage>><</button>></div>
<div class="btn"><<button "Kitchen" "NPC_House_Kitchen">><</button>></div>
<div class="btn"><<button "Bathroom" "NPC_House_Bathroom">><</button>></div>
<<if _isFamily>>
<div class="btn"><<button "Master Bedroom" "NPC_House_MasterBedroom">><</button>></div>
<<if _childCount > 0>>
<<for _ci = 0; _ci < _childCount; _ci++>>
<<capture _ci>>
<div class="btn"><<button `getChildBedroomName($currentHouseId, _ci)` "NPC_House_ChildBedroom">><<set $currentChildBedroomIndex = _ci>><</button>></div>
<</capture>>
<</for>>
<</if>>
<<else>>
<div class="btn"><<button "Bedroom" "NPC_House_Bedroom">><</button>></div>
<</if>>
</div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
<<set _searchLabel = "SearchRoom_LivingRoom">>
<<if $player.dailyEvents.isEventRegistered($currentHouseId, _searchLabel)>>
<div class="btn non-interacting"><<button "Search Room (Already searched)">><</button>></div>
<<else>>
<div class="btn"><<button "Search Room" "NPC_House_SearchRoom">>
<<set $searchRoomLocKey = _houseLocKey>>
<<set $searchRoomLabel = _searchLabel>>
<</button>></div>
<</if>>
</div>
</fieldset>
</div>
/* Custom PeopleAround: display characters from the living room location */
<div class="padding-up">
<<set _houseLoca = $Locations[_houseLocKey] || []>>
<<DisplayCharacters _houseLoca>>
</div>
<<PoliceChecker>>
<</timed>>
<<else>>
/* --- Player does NOT have keys: Locked Door --- */
<<SetBackground "Media/Locations/City/ResidentialArea/LivingRoom.jpg">>
<<timed 0.2s>>
<div class="centre-text"><<print _houseName>> - Locked Door 🔒</div>
<div style="text-align:center; padding: 20px;">
<p>The door is locked. You don't have the keys to this house.</p>
</div>
/* Scan every room of the house for resident NPCs and pick a random one to answer the door. The selected NPC will be moved to the living room on successful entry so they're visible when the player walks in. */
<<set _houseLocKey = "NPC_House_" + $currentHouseId>>
<<set _houseRoomKeys = getHouseRoomKeys($currentHouseId)>>
<<run _houseRoomKeys.unshift(_houseLocKey)>>
<<set _homeResidentIdxs = []>>
<<for _rk = 0; _rk < _houseRoomKeys.length; _rk++>>
<<set _roomChars = $Locations[_houseRoomKeys[_rk]] || []>>
<<for _rc = 0; _rc < _roomChars.length; _rc++>>
<<set _charObj = $Characters[_roomChars[_rc]]>>
<<if _charObj && _residentIds.includes(_charObj.info.id)>>
<<run _homeResidentIdxs.push(_roomChars[_rc])>>
<</if>>
<</for>>
<</for>>
<<set _someoneHome = _homeResidentIdxs.length > 0>>
<<set _homeNpcId = _someoneHome ? _homeResidentIdxs.random() : -1>>
<div class="btn-container" style="justify-content: center; padding: 10px;">
<div class="btn"><<button "🚪 Leave" "Neighborhood">><</button>></div>
/* Peek through the window - no keys required, branches on who is home */
<div class="btn"><<button "👁 Peek through the window" "NPC_House_Peek">><</button>></div>
/* Knock option - only if someone is home */
<<if _someoneHome>>
<div class="btn"><<button "🤚 Knock" "NPC_House_Knock">>
<<set $knockTargetNpcId = _homeNpcId>>
<</button>></div>
<<else>>
<div class="btn non-interacting"><<button "🤚 Knock (No one home)">><</button>></div>
<</if>>
/* Pick Lock option - requires lockpick item */
<<if $player.inventory.hasItem("Lockpick")>>
<div class="btn"><<button "🔧 Pick Lock" "NPC_House_LockpickMinigame">><</button>></div>
<<else>>
<div class="btn non-interacting"><<button "🔧 Pick Lock (Need lockpick)">><</button>></div>
<</if>>
</div>
<</timed>>
<</if>>
<</nobr>><<nobr>>
/* Feature 7 - peek through the window. Branches on how many ADULT residents
are home: nobody / a single resident / two-or-more (a chance they're a
couple in the act, which hands off to the existing ObserveNpcPair voyeur
viewer and its Media\Sex clips). No keys required. Deliberately does NOT
call SaveLocation: currentLocation must stay "NPC_House" so ObserveNpcPair's
"Leave quietly" returns to the house instead of looping back to the window. */
<<SetBackground "Media/Locations/City/ResidentialArea/LivingRoom.jpg">>
<<set _houseName = getHouseDisplayName($currentHouseId)>>
<<set _residentIds = getHouseResidentIds($currentHouseId)>>
<<set _houseLocKey = "NPC_House_" + $currentHouseId>>
<<set _houseRoomKeys = getHouseRoomKeys($currentHouseId)>>
<<run _houseRoomKeys.unshift(_houseLocKey)>>
<<set _homeAdults = []>>
<<for _rk = 0; _rk < _houseRoomKeys.length; _rk++>>
<<set _roomChars = $Locations[_houseRoomKeys[_rk]] || []>>
<<for _rc = 0; _rc < _roomChars.length; _rc++>>
<<set _charObj = $Characters[_roomChars[_rc]]>>
<<if _charObj && _charObj.info && _residentIds.includes(_charObj.info.id) && _charObj.info.age && _charObj.info.age.value >= 18>>
<<run _homeAdults.push(_roomChars[_rc])>>
<</if>>
<</for>>
<</for>>
<div class="centre-text"><<print _houseName>> - Through the Window</div>
<<if _homeAdults.length == 0>>
<<ChatMessage 'You cup your hands to the dark glass. The rooms beyond are black and still - no one is home. Nothing to see but your own faint reflection.'>>
<div class="btn-container" style="justify-content: center; padding: 10px;">
<div class="btn"><<button "Step back" "NPC_House">><</button>></div>
</div>
<<elseif _homeAdults.length == 1>>
<<set _solo = $Characters[_homeAdults[0]]>>
<<ShowNpcIcon _solo>>
<<set _soloMsg = "Through a gap in the curtains you catch " + _solo.info.firstName + " moving around alone - half-dressed, padding between rooms with no idea anyone is watching. You linger a beat longer than you should before easing back into the dark.">>
<<ChatMessage _soloMsg>>
<<if $player.sexExperience && $player.sexExperience.voyeurism>>
<<set $player.sexExperience.voyeurism.value = Math.min(($player.sexExperience.voyeurism.max ?? 100), ($player.sexExperience.voyeurism.value ?? 0) + 1)>>
<</if>>
<<if $player.attributes && $player.attributes.corruption && typeof $player.attributes.corruption.increase === 'function'>>
<<run $player.attributes.corruption.increase(0.3)>>
<</if>>
<div class="btn-container" style="justify-content: center; padding: 10px;">
<div class="btn"><<button "Step back" "NPC_House">><</button>></div>
</div>
<<else>>
<<set _aIdx = _homeAdults.random()>>
<<set _bIdx = _aIdx>>
<<for _g = 0; _g < 12 && _bIdx == _aIdx; _g++>>
<<set _bIdx = _homeAdults.random()>>
<</for>>
<<set _pa = $Characters[_aIdx]>>
<<set _pb = $Characters[_bIdx]>>
<<set _kin = (typeof window.getKinship === 'function' && _pa && _pb) ? window.getKinship(_pa, _pb) : 'unrelated'>>
<<if _aIdx != _bIdx && _kin == 'unrelated' && CheckContentFilter(_pa, _pb) && Random(0,100) < 45>>
/* The residents are in the middle of something - hand off to the voyeur viewer. */
<<set $talkPairNPC1 = _pa>>
<<set $talkPairNPC2 = _pb>>
<<set $talkPairIndexNPC1 = _aIdx>>
<<set $talkPairIndexNPC2 = _bIdx>>
<<set $talkPairInteractionType = "sex">>
<<set $observePhase = 1>>
<<goto "ObserveNpcPair">>
<<else>>
<<set _twoMsg = "Inside, " + _pa.info.firstName + " and " + _pb.info.firstName + " are just going about their evening - talking, drifting between rooms. Nothing worth the risk of being spotted tonight.">>
<<ChatMessage _twoMsg>>
<div class="btn-container" style="justify-content: center; padding: 10px;">
<div class="btn"><<button "Step back" "NPC_House">><</button>></div>
</div>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Locations/City/ResidentialArea/LivingRoom.jpg">>
<<timed 0.2s>>
<<set _houseName = getHouseDisplayName($currentHouseId)>>
<<set _npc = $Characters[$knockTargetNpcId]>>
/* Chance to be let in based on relationship */
<<set _rel = _npc.getRelationship($player.info.id, false)>>
<<set _friendship = _rel ? _rel.metrics.friendship : 0>>
<<set _love = _rel ? _rel.metrics.love : 0>>
<<set _bestMetric = Math.max(_friendship, _love)>>
/* Base 20% chance + 1% per point of best metric */
<<set _knockChance = Math.min(90, 20 + _bestMetric)>>
<<set _knockRoll = Random(1, 100)>>
<div class="centre-text"><<print _houseName>> - Door 🚪</div>
<<if _knockRoll <= _knockChance>>
<<ShowNpcIcon _npc>>
<<Chat _npc "Oh, hey! Come on in.">>
<<ChatMessage `_npc.info.firstName + " opened the door and let you in."`>>
<div class="btn padding-top">
<<button "Enter" "NPC_House">>
<<set $lockpickSuccess = $currentHouseId>>
/* Ensure the NPC who opened the door is visible in the living room after entry (they may have been in a bedroom/kitchen when selected). */
<<run (function() {
var charIdx = State.variables.knockTargetNpcId;
var char = State.variables.Characters[charIdx];
if (!char) return;
var livingRoomKey = "NPC_House_" + State.variables.currentHouseId;
var currentLoc = char.info.currentLocation;
if (currentLoc === livingRoomKey) return;
var curArr = State.variables.Locations[currentLoc];
if (curArr) {
var pos = curArr.indexOf(charIdx);
if (pos !== -1) curArr.splice(pos, 1);
}
if (!State.variables.Locations[livingRoomKey]) State.variables.Locations[livingRoomKey] = [];
State.variables.Locations[livingRoomKey].push(charIdx);
char.info.currentLocation = livingRoomKey;
})()>>
<</button>>
</div>
<<else>>
<<ShowNpcIcon _npc>>
<<set _refusePhrase = [
"Sorry, now is not a good time...",
"I'd rather you didn't come in right now.",
"Can you come back later? I'm busy.",
"I'm not really up for visitors right now."
].random()>>
<<Chat _npc _refusePhrase>>
<<ChatMessage "They didn't let you in.">>
<div class="btn padding-top">
<<button "Back" "NPC_House">><</button>>
</div>
<</if>>
<<unset $knockTargetNpcId>>
<</timed>>
<</nobr>><<nobr>>
<<SaveLocation>>
<<EachLoc>>
/* Break-in confrontation check */
<<if $brokeIntoHouse === $currentHouseId>>
<<set _checkLocKey = "NPC_House_" + $currentHouseId + "_Kitchen">>
<<set _checkChars = $Locations[_checkLocKey] || []>>
<<set _residentIds = getHouseResidentIds($currentHouseId)>>
<<set _foundResident = false>>
<<for _rc = 0; _rc < _checkChars.length; _rc++>>
<<set _charObj = $Characters[_checkChars[_rc]]>>
<<if _charObj && _residentIds.includes(_charObj.info.id) && _foundResident == false>>
<<set _foundResident = true>>
<<set $breakInNpcIndex = _checkChars[_rc]>>
<</if>>
<</for>>
<<if _foundResident>>
<<goto "NPC_House_Confrontation">>
<</if>>
<</if>>
<<SetBackground "Media/Locations/City/ResidentialArea/LivingRoom.jpg">>
<<timed 0.2s>>
<<set _roomLocKey = "NPC_House_" + $currentHouseId + "_Kitchen">>
<<set _houseName = getHouseDisplayName($currentHouseId)>>
<div class="centre-text"><<print _houseName>> - Kitchen</div>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn"><<button "Living Room" "NPC_House">><</button>></div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
<<set _searchLabel = "SearchRoom_Kitchen">>
<<if $player.dailyEvents.isEventRegistered($currentHouseId, _searchLabel)>>
<div class="btn non-interacting"><<button "Search Room (Already searched)">><</button>></div>
<<else>>
<div class="btn"><<button "Search Room" "NPC_House_SearchRoom">>
<<set $searchRoomLocKey = _roomLocKey>>
<<set $searchRoomLabel = _searchLabel>>
<</button>></div>
<</if>>
</div>
</fieldset>
</div>
<div class="padding-up">
<<set _roomLoca = $Locations[_roomLocKey] || []>>
<<DisplayCharacters _roomLoca>>
</div>
<<PoliceChecker>>
<</timed>>
<</nobr>><<nobr>>
<<SaveLocation>>
<<EachLoc>>
/* Break-in confrontation check */
<<if $brokeIntoHouse === $currentHouseId>>
<<set _checkLocKey = "NPC_House_" + $currentHouseId + "_Bathroom">>
<<set _checkChars = $Locations[_checkLocKey] || []>>
<<set _residentIds = getHouseResidentIds($currentHouseId)>>
<<set _foundResident = false>>
<<for _rc = 0; _rc < _checkChars.length; _rc++>>
<<set _charObj = $Characters[_checkChars[_rc]]>>
<<if _charObj && _residentIds.includes(_charObj.info.id) && _foundResident == false>>
<<set _foundResident = true>>
<<set $breakInNpcIndex = _checkChars[_rc]>>
<</if>>
<</for>>
<<if _foundResident>>
<<goto "NPC_House_Confrontation">>
<</if>>
<</if>>
<<SetBackground "Media/Locations/City/ResidentialArea/LivingRoom.jpg">>
<<timed 0.2s>>
<<set _roomLocKey = "NPC_House_" + $currentHouseId + "_Bathroom">>
<<set _houseName = getHouseDisplayName($currentHouseId)>>
<div class="centre-text"><<print _houseName>> - Bathroom</div>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn"><<button "Living Room" "NPC_House">><</button>></div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
<<set _searchLabel = "SearchRoom_Bathroom">>
<<if $player.dailyEvents.isEventRegistered($currentHouseId, _searchLabel)>>
<div class="btn non-interacting"><<button "Search Room (Already searched)">><</button>></div>
<<else>>
<div class="btn"><<button "Search Room" "NPC_House_SearchRoom">>
<<set $searchRoomLocKey = _roomLocKey>>
<<set $searchRoomLabel = _searchLabel>>
<</button>></div>
<</if>>
</div>
</fieldset>
</div>
<div class="padding-up">
<<set _roomLoca = $Locations[_roomLocKey] || []>>
<<DisplayCharacters _roomLoca>>
</div>
<<PoliceChecker>>
<</timed>>
<</nobr>><<nobr>>
<<SaveLocation>>
<<EachLoc>>
/* Break-in confrontation check */
<<if $brokeIntoHouse === $currentHouseId>>
<<set _checkLocKey = "NPC_House_" + $currentHouseId + "_MasterBedroom">>
<<set _checkChars = $Locations[_checkLocKey] || []>>
<<set _residentIds = getHouseResidentIds($currentHouseId)>>
<<set _foundResident = false>>
<<for _rc = 0; _rc < _checkChars.length; _rc++>>
<<set _charObj = $Characters[_checkChars[_rc]]>>
<<if _charObj && _residentIds.includes(_charObj.info.id) && _foundResident == false>>
<<set _foundResident = true>>
<<set $breakInNpcIndex = _checkChars[_rc]>>
<</if>>
<</for>>
<<if _foundResident>>
<<goto "NPC_House_Confrontation">>
<</if>>
<</if>>
<<SetBackground "Media/Locations/City/ResidentialArea/LivingRoom.jpg">>
<<timed 0.2s>>
<<set _roomLocKey = "NPC_House_" + $currentHouseId + "_MasterBedroom">>
<<set _houseName = getHouseDisplayName($currentHouseId)>>
<div class="centre-text"><<print _houseName>> - Master Bedroom</div>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn"><<button "Living Room" "NPC_House">><</button>></div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
<<set _searchLabel = "SearchRoom_MasterBedroom">>
<<if $player.dailyEvents.isEventRegistered($currentHouseId, _searchLabel)>>
<div class="btn non-interacting"><<button "Search Room (Already searched)">><</button>></div>
<<else>>
<div class="btn"><<button "Search Room" "NPC_House_SearchRoom">>
<<set $searchRoomLocKey = _roomLocKey>>
<<set $searchRoomLabel = _searchLabel>>
<</button>></div>
<</if>>
</div>
</fieldset>
</div>
<div class="padding-up">
<<set _roomLoca = $Locations[_roomLocKey] || []>>
<<DisplayCharacters _roomLoca>>
</div>
<<PoliceChecker>>
<</timed>>
<</nobr>><<nobr>>
<<SaveLocation>>
<<EachLoc>>
/* Break-in confrontation check */
<<if $brokeIntoHouse === $currentHouseId>>
<<set _checkLocKey = "NPC_House_" + $currentHouseId + "_ChildBedroom_" + $currentChildBedroomIndex>>
<<set _checkChars = $Locations[_checkLocKey] || []>>
<<set _residentIds = getHouseResidentIds($currentHouseId)>>
<<set _foundResident = false>>
<<for _rc = 0; _rc < _checkChars.length; _rc++>>
<<set _charObj = $Characters[_checkChars[_rc]]>>
<<if _charObj && _residentIds.includes(_charObj.info.id) && _foundResident == false>>
<<set _foundResident = true>>
<<set $breakInNpcIndex = _checkChars[_rc]>>
<</if>>
<</for>>
<<if _foundResident>>
<<goto "NPC_House_Confrontation">>
<</if>>
<</if>>
<<SetBackground "Media/Locations/City/ResidentialArea/LivingRoom.jpg">>
<<timed 0.2s>>
<<set _roomLocKey = "NPC_House_" + $currentHouseId + "_ChildBedroom_" + $currentChildBedroomIndex>>
<<set _bedroomName = getChildBedroomName($currentHouseId, $currentChildBedroomIndex)>>
<<set _houseName = getHouseDisplayName($currentHouseId)>>
<div class="centre-text"><<print _houseName>> - <<print _bedroomName>></div>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn"><<button "Living Room" "NPC_House">><</button>></div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
<<set _searchLabel = "SearchRoom_ChildBedroom_" + $currentChildBedroomIndex>>
<<if $player.dailyEvents.isEventRegistered($currentHouseId, _searchLabel)>>
<div class="btn non-interacting"><<button "Search Room (Already searched)">><</button>></div>
<<else>>
<div class="btn"><<button "Search Room" "NPC_House_SearchRoom">>
<<set $searchRoomLocKey = _roomLocKey>>
<<set $searchRoomLabel = _searchLabel>>
<</button>></div>
<</if>>
</div>
</fieldset>
</div>
<div class="padding-up">
<<set _roomLoca = $Locations[_roomLocKey] || []>>
<<DisplayCharacters _roomLoca>>
</div>
<<PoliceChecker>>
<</timed>>
<</nobr>><<nobr>>
/* Solo house bedroom */
<<SaveLocation>>
<<EachLoc>>
/* Break-in confrontation check */
<<if $brokeIntoHouse === $currentHouseId>>
<<set _checkLocKey = "NPC_House_" + $currentHouseId + "_Bedroom">>
<<set _checkChars = $Locations[_checkLocKey] || []>>
<<set _residentIds = getHouseResidentIds($currentHouseId)>>
<<set _foundResident = false>>
<<for _rc = 0; _rc < _checkChars.length; _rc++>>
<<set _charObj = $Characters[_checkChars[_rc]]>>
<<if _charObj && _residentIds.includes(_charObj.info.id) && _foundResident == false>>
<<set _foundResident = true>>
<<set $breakInNpcIndex = _checkChars[_rc]>>
<</if>>
<</for>>
<<if _foundResident>>
<<goto "NPC_House_Confrontation">>
<</if>>
<</if>>
<<SetBackground "Media/Locations/City/ResidentialArea/LivingRoom.jpg">>
<<timed 0.2s>>
<<set _roomLocKey = "NPC_House_" + $currentHouseId + "_Bedroom">>
<<set _houseName = getHouseDisplayName($currentHouseId)>>
<div class="centre-text"><<print _houseName>> - Bedroom</div>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn"><<button "Living Room" "NPC_House">><</button>></div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
<<set _searchLabel = "SearchRoom_Bedroom">>
<<if $player.dailyEvents.isEventRegistered($currentHouseId, _searchLabel)>>
<div class="btn non-interacting"><<button "Search Room (Already searched)">><</button>></div>
<<else>>
<div class="btn"><<button "Search Room" "NPC_House_SearchRoom">>
<<set $searchRoomLocKey = _roomLocKey>>
<<set $searchRoomLabel = _searchLabel>>
<</button>></div>
<</if>>
</div>
</fieldset>
</div>
<div class="padding-up">
<<set _roomLoca = $Locations[_roomLocKey] || []>>
<<DisplayCharacters _roomLoca>>
</div>
<<PoliceChecker>>
<</timed>>
<</nobr>><<nobr>>
/* After a successful lockpick, check if a resident is in the living room (entry point).
Only confront the player if an NPC can actually SEE them (same room).
If residents are in other rooms, the per-room checks will handle confrontation
when the player enters those rooms. */
<<set _residentIds = getHouseResidentIds($currentHouseId)>>
<<set _livingRoomKey = "NPC_House_" + $currentHouseId>>
<<set _livingRoomChars = $Locations[_livingRoomKey] || []>>
<<set _foundInLivingRoom = false>>
<<set _homeNpcIndex = -1>>
<<for _rc = 0; _rc < _livingRoomChars.length; _rc++>>
<<set _charObj = $Characters[_livingRoomChars[_rc]]>>
<<if _charObj && _residentIds.includes(_charObj.info.id) && _foundInLivingRoom == false>>
<<set _foundInLivingRoom = true>>
<<set _homeNpcIndex = _livingRoomChars[_rc]>>
<</if>>
<</for>>
<<if _foundInLivingRoom>>
/* A resident is in the living room and sees the player breaking in */
<<set $breakInNpcIndex = _homeNpcIndex>>
<<goto "NPC_House_Confrontation">>
<<else>>
/* No one in the living room - player enters; other room checks will trigger if needed */
<<goto "NPC_House">>
<</if>>
<</nobr>><<nobr>>
<<SaveLocation>>
<<EachLoc>>
<<set _houseReturnPassage = $npcHouseReturnPassage || "Neighborhood">>
<<SetBackground "Media/Locations/City/ResidentialArea/LivingRoom.jpg">>
<<timed 0.2s>>
<<set _houseName = getHouseDisplayName($currentHouseId)>>
<<set _npc = $Characters[$breakInNpcIndex]>>
<div class="centre-text"><<print _houseName>> - Caught! ⚠️</div>
<<ShowNpcIcon _npc>>
/* Determine NPC reaction: fight or kick out */
<<set _isAggressive = _npc.info.characterTraits.includes("Aggressive")>>
<<set _rel = _npc.getRelationship($player.info.id, false)>>
<<set _npcAnger = _rel ? _rel.metrics.anger : 0>>
/* Base fight chance: 80% if aggressive, 30% otherwise */
<<set _fightChance = _isAggressive ? 80 : 30>>
/* High anger (>30) adds +20% fight chance */
<<if _npcAnger > 30>>
<<set _fightChance = Math.min(95, _fightChance + 20)>>
<</if>>
<<set _confrontRoll = Random(1, 100)>>
<<if _confrontRoll <= _fightChance>>
/* --- NPC attacks the intruder --- */
<<set _angryPhrase = [
"What the hell?! You broke into MY house?! You're going to regret this!",
"An intruder! I'll teach you a lesson!",
"You picked the wrong house to break into! I'm going to beat you senseless!",
"Breaking in? You must have a death wish!"
].random()>>
<<Chat _npc _angryPhrase>>
<<ChatMessage `_npc.info.firstName + " is furious and attacks you!"`>>
<div class="btn padding-top">
<<button "Fight!">>
<<set $indexNPC = $breakInNpcIndex>>
<<set $interactionNpc = $Characters[$breakInNpcIndex]>>
<<set _battleSetControls = {attack: true, seduce: false, items: true, actions: true}>>
<<unset $breakInNpcIndex>>
<<StartFight $player $interactionNpc _battleSetControls "NPC_House_BreakIn_PlayerWins" "NPC_House_BreakIn_PlayerLoses">>
<</button>>
</div>
<<else>>
/* --- NPC kicks the player out --- */
<<set _kickPhrase = [
"What are you doing in my house?! Get out! NOW!",
"How did you get in here?! Leave before I call the cops!",
"You have no right to be here! Get out of my sight!",
"Breaking into my home?! Get lost, and don't come back!"
].random()>>
<<Chat _npc _kickPhrase>>
<<ChatMessage `_npc.info.firstName + " caught you breaking in and kicked you out."`>>
/* Worsen relations: friendship -10...-20, anger +5...+10 */
<<set _decreaseRelations = Random(-10, -20)>>
<<IncreaseFriendship $player _npc _decreaseRelations>>
<<run _npc.getRelationship($player.info.id).metrics.increaseAnger(Random(5, 10, true))>>
<<run $player.getRelationship(_npc.info.id).metrics.increaseAnger(Random(5, 10, true))>>
<div class="btn padding-top">
<<button "Leave" _houseReturnPassage>>
<<unset $lockpickSuccess>>
<<unset $brokeIntoHouse>>
<<unset $breakInNpcIndex>>
<<unset $npcHouseReturnPassage>>
<</button>>
</div>
<</if>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/City/ResidentialArea/LivingRoom.jpg">>
<<timed 0.2s>>
<<set _houseName = getHouseDisplayName($currentHouseId)>>
<div class="centre-text"><<print _houseName>> - Victory</div>
<<ShowNpcIcon $interactionNpc>>
<<set _defeatPhrase = [
"Ugh... fine... you win. But this isn't over...",
"You'll pay for this... I'm getting out of here...",
"Don't think this changes anything... I won't forget this.",
"You won this time... but stay out of my sight."
].random()>>
<<Chat $interactionNpc _defeatPhrase>>
<<ChatMessage `$interactionNpc.info.firstName + " has been defeated and flees the house."`>>
/* Worsen relations: friendship -15...-25, anger +5...+10 */
<<set _decreaseRelations = Random(-15, -25)>>
<<IncreaseFriendship $player $interactionNpc _decreaseRelations>>
<<run $interactionNpc.getRelationship($player.info.id).metrics.increaseAnger(Random(5, 10, true))>>
<<run $player.getRelationship($interactionNpc.info.id).metrics.increaseAnger(Random(5, 10, true))>>
/* Relocate the defeated NPC outside their home */
<<run RandomRelocateCharacter($indexNPC)>>
<div class="btn padding-top">
<<button "Enter the house" "NPC_House">>
<<unset $interactionNpc $fightPhrasesNpcWon $fightPhrasesPlayerWon>>
<</button>>
</div>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _houseReturnPassage = $npcHouseReturnPassage || "Neighborhood">>
<<SetBackground "Media/Locations/City/ResidentialArea/LivingRoom.jpg">>
<<timed 0.2s>>
<<set _houseName = getHouseDisplayName($currentHouseId)>>
<div class="centre-text"><<print _houseName>> - Defeat</div>
<<ShowNpcIcon $interactionNpc>>
<<set _winPhrase = [
"Pathetic. Breaking into my house and you can't even fight? Get out!",
"That's what you get for trespassing! Now scram!",
"You thought you could break in and get away with it? Think again!",
"Next time you try this, I won't be so merciful. Now get lost!"
].random()>>
<<Chat $interactionNpc _winPhrase>>
<<ChatMessage `$interactionNpc.info.firstName + " defeated you and threw you out of the house."`>>
/* Worsen relations: friendship -15...-25, anger +5...+10 */
<<set _decreaseRelations = Random(-15, -25)>>
<<IncreaseFriendship $player $interactionNpc _decreaseRelations>>
<<run $interactionNpc.getRelationship($player.info.id).metrics.increaseAnger(Random(5, 10, true))>>
<<run $player.getRelationship($interactionNpc.info.id).metrics.increaseAnger(Random(5, 10, true))>>
<div class="btn padding-top">
<<button "Leave" _houseReturnPassage>>
<<unset $lockpickSuccess>>
<<unset $brokeIntoHouse>>
<<unset $interactionNpc $fightPhrasesNpcWon $fightPhrasesPlayerWon>>
<<unset $npcHouseReturnPassage>>
<</button>>
</div>
<</timed>>
<</nobr>><<nobr>>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Locations/Neighborhood/OakStreet/Oak Street.jpg">>
<<timed 0.2s>>
<div class="centre-text">Neighborhood</div>
/* Build combined house list and calculate pages */
<<set _allHouses = []>>
<<if $Families && $Families.length > 0>>
<<for _fi = 0; _fi < $Families.length; _fi++>>
<<run _allHouses.push($Families[_fi].houseId)>>
<</for>>
<</if>>
<<if $SoloHouses && $SoloHouses.length > 0>>
<<for _si = 0; _si < $SoloHouses.length; _si++>>
<<run _allHouses.push($SoloHouses[_si].houseId)>>
<</for>>
<</if>>
<<set _housesPerPage = 9>>
<<set _totalPages = Math.ceil(_allHouses.length / _housesPerPage)>>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<<if _allHouses.length > 0>>
/* Page tabs - only show if more than one page */
<<if _totalPages > 1>>
<div class="neighborhood-tabs">
<<for _p = 0; _p < _totalPages; _p++>>
<<capture _p>>
<div @class="'neighborhood-tab' + (_p === 0 ? ' active' : '')" @id="'nb-tab-' + _p">
<<link `String(_p + 1)`>>
<<run document.querySelectorAll('.neighborhood-tab').forEach(function(t) { t.classList.remove('active'); })>>
<<run document.getElementById('nb-tab-' + _p).classList.add('active')>>
<<replace "#neighborhood-houses">><<NeighborhoodHousePage _p>><</replace>>
<</link>>
</div>
<</capture>>
<</for>>
</div>
<</if>>
/* House buttons for the current page */
<div id="neighborhood-houses">
<<NeighborhoodHousePage 0>>
</div>
<<else>>
<div class="btn-container">
<div class="btn non-interacting"><<button "No houses here">><</button>></div>
</div>
<</if>>
<div class="padding-top">
<div class="btn"><<button "Back" "Oak_Street">><</button>></div>
</div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
</div>
</fieldset>
</div>
<<PeopleAround>>
<<PoliceChecker>>
<</timed>>
<</nobr>>
/* NPC_House and room passages are defined in Campus/Neighborhood.twee */<<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Locations/City/SkidRow/BlackMarket/black_market.jpg">>
<<timed 0.2s>>
<div class="centre-text">Black Market</div>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn padding-top"><<button "Leave" "SR_SkidRow">><</button>></div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
</div>
</fieldset>
</div>
<<PeopleAround>>
<<done>><<LocationEvent 'The Fence' 'Dealer_Checker' "transition" "Media\\Locations\\City\\SkidRow\\BlackMarket\\Dealer.jpg" "npc-card" "Black market dealer">><</done>>
<</timed>>
<</nobr>><<nobr>>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Locations/City/ResidentialArea/LivingRoom.jpg">>
<<timed 0.2s>>
<<set _houseName = getHouseDisplayName($currentHouseId)>>
<div class="centre-text"><<print _houseName>> - Picking the Lock 🔧</div>
/* Verify player has a lockpick */
<<if $player.inventory.hasItem("Lockpick")>>
/* Show tutorial before the first attempt */
<div id="lockpick-tutorial-wrapper">
<<if $player.characterEvents.isEventRegistered(0, "Lockpick tutorial seen") != true>>
<<include "NPC_House_LockpickTutorial">>
<<else>>
<<include "NPC_House_LockpickStart">>
<</if>>
</div>
<<else>>
<div style="text-align:center; padding: 20px;">
<p>You don't have a lockpick!</p>
</div>
<div class="btn padding-top">
<<button "Back" "NPC_House">><</button>>
</div>
<</if>>
<</timed>>
<</nobr>><<nobr>>
<div class="lockpick-tutorial">
<div class="lockpick-tutorial-header">
<span class="lockpick-tutorial-icon">📖</span>
<span class="lockpick-tutorial-title">How to Pick a Lock</span>
</div>
<div class="lockpick-tutorial-body">
<div class="lockpick-tutorial-section">
<div class="lockpick-tutorial-subtitle">🎯 Goal</div>
<p>You need to <strong>pick 3 locks</strong> in a row to open the door. A shrinking ring will appear on screen - click at the right moment!</p>
</div>
<div class="lockpick-tutorial-section">
<div class="lockpick-tutorial-subtitle">🟢🟡🔴 Precision Zones</div>
<div class="lockpick-tutorial-zones">
<div class="lockpick-tutorial-zone zone-green">
<strong>Green zone</strong> - Perfect hit! The lock is picked, you advance to the next one.
</div>
<div class="lockpick-tutorial-zone zone-yellow">
<strong>Yellow zone</strong> - Close, but not enough. Your progress drops by 1 lock. If you're on the first lock, you simply retry it.
</div>
<div class="lockpick-tutorial-zone zone-red">
<strong>Red zone</strong> - Miss! Your lockpick breaks and the attempt fails.
</div>
</div>
</div>
<div class="lockpick-tutorial-section">
<div class="lockpick-tutorial-subtitle">📈 What Affects Difficulty</div>
<p>The difficulty depends entirely on your <strong data-metric="lockpick">Lockpick</strong> skill:</p>
<ul class="lockpick-tutorial-list">
<li>Higher skill = <strong>wider</strong> green and yellow zones</li>
<li>Higher skill = <strong>slower</strong> ring shrink speed</li>
<li>Your current Lockpick skill: <strong><<print $player.attributes.lockpick.value>> / <<print $player.attributes.lockpick.max>></strong></li>
</ul>
</div>
<div class="lockpick-tutorial-section">
<div class="lockpick-tutorial-subtitle">💡 Tips</div>
<ul class="lockpick-tutorial-list">
<li>Watch the ring carefully - it changes color as it enters different zones</li>
<li>Click anywhere on the circle area when you think the ring is in the green zone</li>
<li>If you fail, you lose one lockpick - stock up before attempting!</li>
</ul>
</div>
</div>
<div class="lockpick-tutorial-footer">
<div class="btn"><<button "Got it! Start picking 🔧">>
<<run $player.characterEvents.registerEvent(0, "Lockpick tutorial seen", 1)>>
<<replace "#lockpick-tutorial-wrapper">><<include "NPC_House_LockpickStart">><</replace>>
<</button>></div>
</div>
</div>
<</nobr>><<nobr>>
<div id="lockpick-minigame-root"></div>
<<done>>
<<run startLockpickMinigame(
"lockpick-minigame-root",
State.variables.player.attributes.lockpick.value,
function() {
/* SUCCESS: set bypass flag and mark as break-in, then check for residents */
State.variables.lockpickSuccess = State.variables.currentHouseId;
State.variables.brokeIntoHouse = State.variables.currentHouseId;
Engine.play("NPC_House_BreakInCheck");
},
function() {
/* FAILURE: remove one lockpick from inventory and go back */
State.variables.player.inventory.removeItem("Lockpick", 1);
Engine.play("NPC_House_LockpickFailed");
}
)>>
<</done>>
<</nobr>><<nobr>>
<<SaveLocation>>
<<EachLoc>>
<<set _houseReturnPassage = $npcHouseReturnPassage || "Neighborhood">>
<<SetBackground "Media/Locations/City/ResidentialArea/LivingRoom.jpg">>
<<timed 0.2s>>
<<set _houseName = getHouseDisplayName($currentHouseId)>>
<div class="centre-text"><<print _houseName>> - Failed Attempt</div>
<div style="text-align:center; padding: 20px;">
<p style="font-size: 1.2em;">💔 Your lockpick broke!</p>
<p>The lockpick snapped while trying to pick the lock. You'll need another one to try again.</p>
</div>
<div class="btn padding-top">
<<button "Leave" _houseReturnPassage>><<unset $npcHouseReturnPassage>><</button>>
</div>
<</timed>>
<</nobr>><<nobr>>
<<EachLoc>>
<<SaveLocation>>
<<SetBackground "Media/Locations/Neighborhood/OakStreet/Oak Street.jpg">>
<<timed 0.2s>>
<div class="centre-text">Oak Street</div>
<<GangTurfBadge>>
<<GangStreetMsg>>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn-container">
<div class="btn"><<button "Your Home" "Living_Room_PHome">><</button>></div>
<div class="btn"><<button "Neighborhood" "OakStreet_Neighborhood">><</button>></div>
</div>
<div class="btn padding-top"><<button "Campus" "Campus">><</button>></div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
</div>
</fieldset>
</div>
<<PeopleAround>>
<<PoliceChecker>>
<<RandomEvent "OakStreet">>
<</timed>>
<</nobr>><<nobr>>
<<EachLoc>>
<<SaveLocation>>
/* Home raid (doc 19.7): once your heat tops the board, the badges come to you. */
<<if getWanted($police) gte 75 and $policeDayPass !== true and rollDetected(20 + (getWanted($police) - 75) * 0.5)>>
<<set $police.dayPass = true>><<set $policeDayPass = true>>
<<set $policeStopCrime = "wanted">>
<<goto "Police_Raid">>
<</if>>
<<SetBackground "Media/Locations/Neighborhood/OakStreet/PlayerHome/player_bedroom.jpg">>
<<timed 0.2s>>
<div class="centre-text">Your Bedroom</div>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn"><<button "Living Room" "Living_Room_PHome">><</button>></div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
<<SleepButton>>
<<if $player.status.energy.value < $player.status.energy.max>>
<div class="btn"><<button "Nap (2h)">><<Nap>><</button>></div>
<</if>>
</div>
<<if $player.characterEvents.isEventRegistered($player.info.id, "SetupPC") == false>>
<<if $player.inventory.hasItem("PC")>>
<div class="btn padding-top"><<button "Set up PC" $player.info.currentLocation>>
<<run $player.characterEvents.registerEvent($player.info.id, "SetupPC", 1)>>
<<run $player.inventory.removeItem("PC", 1)>>
<</button>></div>
<<else>>
<div class="btn non-interacting padding-top"><<button "Set up PC">><</button>></div>
<</if>>
<<else>>
<div class="btn padding-top"><<button "PC" "ComputerSystem">><</button>></div>
<</if>>
</fieldset>
</div>
<<PeopleAround>>
<<if $player.status.horny.value >= 40 && !$player.dailyEvents.isEventRegistered($player.info.id, "Player_Bedroom_SoloPlay")>>
<<LocationEvent 'Take some time for yourself' 'Player_Bedroom_SoloPlay' "transition" "Media\\Other\\Notice_Event.png">>
<</if>>
<</timed>>
<</nobr>><<nobr>>
<<EachLoc>>
<<SaveLocation>>
<<SetBackground "Media/Locations/Neighborhood/OakStreet/PlayerHome/Kyle_Bedroom.jpg">>
<<timed 0.2s>>
<div class="centre-text">Ethan's bedroom</div>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn"><<button "Living Room" "Living_Room_PHome">><</button>></div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
</div>
</fieldset>
</div>
<<PeopleAround>>
<</timed>>
<</nobr>><<nobr>>
<<EachLoc>>
<<SaveLocation>>
<<SetBackground "Media/Locations/Neighborhood/OakStreet/PlayerHome/Sarah_Bedroom.jpg">>
<<timed 0.2s>>
<div class="centre-text">Sarah's bedroom</div>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn"><<button "Living Room" "Living_Room_PHome">><</button>></div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
</div>
</fieldset>
</div>
<<PeopleAround>>
<<done>>
<<done>><<LocationEvent 'Alice' 'AliceQuestChecker' "transition" "Media\\Characters\\QuestChars\\Alice\\Alice.png" "npc-card" "Sarah's friend">><</done>>
<</done>>
<</timed>>
<</nobr>><<nobr>>
<<EachLoc>>
<<SaveLocation>>
<<SetBackground "Media/Locations/Neighborhood/OakStreet/PlayerHome/Amanda_bedroom.jpg">>
<<timed 0.2s>>
<div class="centre-text">Master bedroom</div>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn"><<button "Living Room" "Living_Room_PHome">><</button>></div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
</div>
</fieldset>
</div>
<<PeopleAround>>
<</timed>>
<</nobr>><<nobr>>
<<EachLoc>>
<<SaveLocation>>
<<SetBackground "Media/Locations/Neighborhood/OakStreet/PlayerHome/bathroom.jpg">>
<<timed 0.2s>>
<div class="centre-text">Bathroom</div>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn"><<button "Living Room" "Living_Room_PHome">><</button>></div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<div class="btn"><<button "Wash (30m)">>
<<run $player.status.dirt.value = $player.status.dirt.min>>
<<run $player.status.energy.decrease(7)>>
<<SpendTime 30>>
<<goto "Bathroom_PHome_Shower">>
<</button>></div>
<<EachActions>>
</div>
</fieldset>
</div>
<<PeopleAround>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/Neighborhood/OakStreet/PlayerHome/bathroom.jpg">>
<<ShowerScene $player>>
<div class="btn padding-top"><<button "Done" "Bathroom_PHome">><</button>></div>
<</nobr>><<nobr>>
<<EachLoc>>
<<SaveLocation>>
<<SetBackground "Media/Locations/Neighborhood/OakStreet/PlayerHome/LivingRoom.jpg">>
<<timed 0.2s>>
<div class="centre-text">Living Room</div>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn-container">
<div class="btn"><<button "Your Bedroom" "Player_Bedroom_PHome">><</button>></div>
<div class="btn"><<button "Kitchen" "Kitchen_PHome">><</button>></div>
<div class="btn"><<button "Bathroom" "Bathroom_PHome">><</button>></div>
<div class="btn"><<button "Ethan's bedroom" "Ethan_Bedroom_PHome">><</button>></div>
<div class="btn"><<button "Sarah's bedroom" "Sarah_Bedroom_PHome">><</button>></div>
<div class="btn"><<button "Master bedroom" "Amanda_Bedroom_PHome">><</button>></div>
<div class="btn"><<button "Basement" "Basement_PHome">><</button>></div>
</div>
<div class="padding-top">
<div class="btn"><<button "Leave" "Oak_Street">><</button>></div>
</div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
/* Once a day; paid on the click (Events/MaidService.twee). */
<<if not $player.dailyEvents.isEventRegistered($player.info.id, "PlayerHome_MaidService") and $player.money gte 80>>
<div class="btn"><<button "Call a maid service ($80, 1h)">>
<<set $player.money -= 80>>
<<run $player.dailyEvents.registerEvent($player.info.id, "PlayerHome_MaidService", 1)>>
<<goto "PlayerHome_MaidService">>
<</button>></div>
<<else>>
<div class="btn non-interacting"><<button "Call a maid service ($80, 1h)">><</button>></div>
<</if>>
</div>
</fieldset>
</div>
<<PeopleAround>>
<<if $player.characterEvents.isEventRegistered($player.info.id, "Robert_Event_0") == false>>
<<run $player.characterEvents.registerEvent($player.info.id, "Robert_Event_0", 1)>>
<<goto "Robert_Event_0">>
<</if>>
<<include "CheckRobert_Quest_1">>
<</timed>>
<</nobr>><<nobr>>
<<EachLoc>>
<<SaveLocation>>
<<SetBackground "Media/Locations/Neighborhood/OakStreet/PlayerHome/kitchen.jpg">>
<<timed 0.2s>>
<div class="centre-text">Kitchen</div>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn"><<button "Living Room" "Living_Room_PHome">><</button>></div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
</div>
</fieldset>
</div>
<<PeopleAround>>
<</timed>>
<</nobr>><<nobr>>
<<EachLoc>>
<<SaveLocation>>
<<SetBackground "Media/Locations/Neighborhood/OakStreet/PlayerHome/basement.jpg">>
<<timed 0.2s>>
<div class="centre-text">Basement</div>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn"><<button "Living Room" "Living_Room_PHome">><</button>></div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
</div>
</fieldset>
</div>
<<PeopleAround>>
<</timed>>
<</nobr>><<nobr>>
<<if !$pendingHomeGuestDeparture || $pendingHomeGuestDeparture.index === undefined || !$Characters[$pendingHomeGuestDeparture.index]>>
<<unset $pendingHomeGuestDeparture>>
<<goto $player.info.currentLocation>>
<<else>>
<<HomeGuestDeparturePromptContent>>
<</if>>
<</nobr>><<nobr>>
<<if !$pendingHomeGuestDeparture || $pendingHomeGuestDeparture.index === undefined || !$Characters[$pendingHomeGuestDeparture.index]>>
<<unset $pendingHomeGuestDeparture>>
<<goto $player.info.currentLocation>>
<<else>>
<<set $indexNPC = $pendingHomeGuestDeparture.index>>
<<set $interactionNpc = $Characters[$indexNPC]>>
<<set _returnPassage = $pendingHomeGuestDeparture.returnPassage ? $pendingHomeGuestDeparture.returnPassage : $player.info.currentLocation>>
<<set _stayChance = setup.calculateNpcHomeStayChance ? setup.calculateNpcHomeStayChance($player, $interactionNpc) : 5>>
<<ShowNpcIcon $interactionNpc>>
<<if $pendingHomeGuestDeparture.action == "stay">>
<<set _stayRoll = random(1, 100)>>
<<if _stayRoll <= _stayChance>>
<<Chat $interactionNpc "Alright, I can stay a little longer.">>
<<ChatMessage "They agree to stay for two more hours.">>
<<run setup.lockNpcAtLocationForHours($interactionNpc, $interactionNpc.info.currentLocation, 2, "askedToStayHome")>>
<<else>>
<<Chat $interactionNpc "Sorry, I really need to go now.">>
<<ChatMessage "They still decide to leave.">>
<<run CompleteNpcHomeVisit($indexNPC)>>
<</if>>
<<else>>
<<Chat $interactionNpc "See you later.">>
<<ChatMessage "They leave your home.">>
<<run CompleteNpcHomeVisit($indexNPC)>>
<</if>>
<div class="btn padding-top"><<button "Continue" _returnPassage>><<unset $pendingHomeGuestDeparture>><<unset $interactionNpc $indexNPC>><</button>></div>
<</if>>
<</nobr>><<nobr>>
<<if getQuestState("robert_quest_1") == undefined && getTaskState("robert_quest_1", "Get the serum") != 'completed' && getQuestState("mad_dog_quest1") == "completed" && $player.characterEvents.isEventRegistered($player.info.id, "Robert_Event_0") == true>>
<<goto "Robert_Quest_01">>
<<elseif getQuestState("robert_quest_1") == "active" && getTaskState("robert_quest_1", "Get the serum") == 'completed' && getQuestState("mad_dog_quest1") == "completed" && $player.characterEvents.isEventRegistered($player.info.id, "Robert_Event_0") == true>>
<<if $player.characterEvents.isEventRegistered($player.info.id, "ChooseMaskSerum_Robert") == true>>
<<include "ChangeRobertToAlpha">>
<<if $player.gender() == "Male">>
<<goto "Robert_Request_1_Male_Option1_Mask">>
<<elseif $player.gender() == "Female">>
<<goto "Robert_Request_1_Female_Option1_Mask">>
<<else>>
<<goto "Robert_Request_1_Shemale_Option1_Mask">>
<</if>>
<<elseif $player.characterEvents.isEventRegistered($player.info.id, "ChooseBimboSerum_Robert") == true>>
<<include "ChangeRobertToBimbo">>
<<if $player.gender() == "Male">>
<<goto "Robert_Request_1_Male_Option2_Bimbo">>
<<elseif $player.gender() == "Female">>
<<goto "Robert_Request_1_Female_Option2_Bimbo">>
<<else>>
<<goto "Robert_Request_1_Shemale_Option2_Bimbo">>
<</if>>
<</if>>
<</if>>
<</nobr>>/* Ship deck map (SVG schematic). The SVG is built in
src/scripts/Tournament/shipMap.ts and injected via raw innerHTML inside
<<done>> (after the passage is live) - SugarCube's wikifier chokes on big
SVG strings via <<print>>, but raw innerHTML keeps the SVG intact.
NB: the <<run>> must be a SINGLE expression with no `var` - nobr strips the
newlines, so multi-statement bodies break ("Unexpected token 'var'"). */
<<widget "ShipDeckMap">>
<div class="ship-map-host"></div>
<<done>>
<<run document.querySelectorAll('#passages .ship-map-host').forEach(function (el) { el.innerHTML = renderShipMap(passage()); if (SugarCube.State.variables.ship && SugarCube.State.variables.ship.departed && !(typeof canDisembark === 'function' && canDisembark()) && el.querySelector('[data-ship-target="Ship_Gangway"]')) { el.querySelector('[data-ship-target="Ship_Gangway"]').classList.add('smap-zone--sealed'); el.querySelector('[data-ship-target="Ship_Gangway"]').removeAttribute('data-ship-target'); } if (typeof bindShipMapNavigation === 'function') { bindShipMapNavigation(el); } })>>
<</done>>
<</widget>>
/* Lightweight cruise NPCs present in the current room (PeopleAround analog).
Reads $cruiseRoster (doc 25) via rosterAtLocation; each card is an Approach
button into Ship_NpcInteract. <<capture>> snapshots the loop var so the
deferred click handler sees the right NPC id. */
<<widget "ShipPeople">>
<<set _people = rosterAtLocation($cruiseRoster, passage())>>
<<if _people.length gt 0>>
<<set _life = deckVignettes($cruiseRoster, passage(), getVoyageProgress().day)>>
<<if _life.length gt 0>>
<div class="cruise-life">
<<for _ln range _life>>
<div class="cruise-life__line"><<= _ln>></div>
<</for>>
</div>
<</if>>
<<set _feud = hotFeudPairOnDeck($cruiseRoster, passage())>>
<<if _feud>>
<<set _fcta = "Step into the quarrel between " + _feud.aName + " and " + _feud.bName>>
<div class="cruise-feud-cta"><div class="btn"><<button _fcta>><<set $feudPair = _feud>><<set $feudResult = "">><<goto "Ship_FeudScene">><</button>></div></div>
<</if>>
/* The suitor's move (cruiseDesire.desireSuitorOnDeck): once a day the warmest
admirer on this deck crosses it and ASKS, instead of waiting on his card to be
noticed. Suppressed while the player is caged (nothing he could accept). */
<<if not $ship.caged>>
<<set _suitor = desireSuitorOnDeck($cruiseRoster, passage(), { playerFemStage: femStage($player), playerCorr: ($ship.corr || 0), groomed: $ship.groomed }, getVoyageProgress().day, ($ship.layPartners || []))>>
<<if _suitor>>
<<set _scta = _suitor.name + " sets down his glass and crosses the deck toward you">>
<div class="cruise-suitor-cta"><div class="btn"><<button _scta>><<set $activeNpcId = _suitor.id>><<set $suitorResult = "">><<goto "Ship_DesireApproach">><</button>></div></div>
<</if>>
<</if>>
/* A kept regular with something to say about the player's day (cruiseJealousy):
the boat gossips, and a man you keep KNOWS when you have been elsewhere. */
<<set _jeal = jealousRegularOnDeck($cruiseRoster, ($ship.layPartners || []), passage())>>
<<if _jeal>>
<<set _jcta = _jeal.name + " is waiting for you, and he has plainly heard about your day">>
<div class="cruise-jealous-cta"><div class="btn"><<button _jcta>><<set $activeNpcId = _jeal.id>><<set $jealousResult = "">><<goto "Ship_JealousScene">><</button>></div></div>
<</if>>
<div class="cruise-people">
<<for _p range _people>>
<<capture _p>>
<<set _b = cruiseNpcBlurb(_p)>>
<<set _face = npcFacePath(_b.stage, _p.id)>>
/* Read the contestant's stance toward the player off their cruise trust (with
betrayal / confided overrides) onto the same data-relation palette the city
NPC cards use, so a warming ally greens and a betrayer reddens. */
<<set _trust = Math.max(0, Math.min(100, Math.floor((_p.stats ? _p.stats.trust : 0) || 0)))>>
<<if _p.betrayedYou>>
<<set _rel = "enemy">><<set _relLabel = "Hostile">>
<<elseif _p.confided || _trust >= 70>>
<<set _rel = "close">><<set _relLabel = "Confidant">>
<<elseif _trust >= 40>>
<<set _rel = "friendly">><<set _relLabel = "Warming">>
<<elseif _trust >= 12>>
<<set _rel = "neutral">><<set _relLabel = "Wary">>
<<else>>
<<set _rel = "dislike">><<set _relLabel = "Cold">>
<</if>>
/* Build the card as a city-style location-npc-card so the deck reads like any
other crowd: header badges + Approach, portrait, role eyebrow, name + stance
pill, body line, trust meter - then a cruise footer (goal / intent / wants). */
<<set _card = '<article class="location-npc-card cruise-card" data-relation="' + _rel + '">'>>
<<set _card += '<div class="location-npc-card__header"><div class="location-npc-card__badges">'>>
<<if _p.read>><<set _card += '<span class="location-npc-card__badge location-npc-card__badge--unknown">Read</span>'>><</if>>
<<if _p.regular>><<set _card += '<span class="location-npc-card__badge location-npc-card__badge--regular">Regular</span>'>><<elseif (_p.playerTopped || 0) gt 0>><<set _card += '<span class="location-npc-card__badge location-npc-card__badge--follower">Topped</span>'>><</if>>
<<if _p.betrayedYou>><<set _card += '<span class="location-npc-card__badge location-npc-card__badge--quest">Betrayed you</span>'>><</if>>
<<set _card += '</div><span class="location-npc-card__cta">Approach</span></div>'>>
<<set _card += '<div class="location-npc-card__main"><div class="location-npc-card__avatar-shell"><img class="location-npc-card__avatar" src="' + _face + '" alt=""></div><div class="location-npc-card__content">'>>
<<set _card += '<div class="location-npc-card__eyebrow">' + _b.role + '</div>'>>
<<set _card += '<div class="location-npc-card__name-row"><div class="location-npc-card__name">' + cruiseDisplayName(_p) + '</div><span class="location-npc-card__relation-pill">' + _relLabel + '</span></div>'>>
<<set _card += '<div class="location-npc-card__description">' + _b.gender + ' · Femininity ' + _b.stage + '/6</div>'>>
<<set _card += '<div class="location-npc-card__metric-row"><span class="location-npc-card__metric-label">Trust</span><div class="location-npc-card__metric-bar"><div class="location-npc-card__metric-fill" style="width: ' + _trust + '%"></div></div><span class="location-npc-card__metric-value">' + _trust + '</span></div>'>>
<<set _card += '</div></div>'>>
<<set _card += '<div class="cruise-card__goal">' + _b.goal + '</div>'>>
<<if _b.activity>><<set _card += '<div class="cruise-card__intent">› ' + _b.activity + '</div>'>><</if>>
<<if npcSeeksPlayerForRecovery(_p)>><<set _card += '<div class="cruise-card__wants">› He keeps eyeing you - looking for someone to climb back up off of.</div>'>><</if>>
/* A kept partner, or a warmed mark who simply wants the player (cruiseDesire) - a softer
pull than the recovery-seeker's, surfaced so the deck reads who is drawn to the player. */
<<if _p.regular>><<set _card += '<div class="cruise-card__wants cruise-card__wants--regular">› Your regular - he brightens the moment he catches sight of you.</div>'>>
<<elseif (not npcSeeksPlayerForRecovery(_p)) and npcDesiresPlayer(_p, { playerFemStage: femStage($player), playerCorr: ($ship.corr || 0), groomed: $ship.groomed })>><<set _card += '<div class="cruise-card__wants cruise-card__wants--want">› He watches you across the deck with something warmer than the rest.</div>'>><</if>>
/* The man's strongest standing tie among the manifest - who he leans on or who he
has bad blood with - so the deck reads as a web of allegiances the player can
work, not a row of strangers. Reads off the persistent bond ledger (cruiseBonds). */
<<set _tie = npcStrongestTie(_p, $cruiseRoster)>>
<<if _tie>><<set _card += '<div class="cruise-card__tie cruise-card__tie--' + _tie.kind + '">' + (_tie.kind is "ally" ? "› Tight with " : "› Bad blood with ") + _tie.name + '</div>'>><</if>>
<<set _card += '</article>'>>
<<button _card>>
<<set $activeNpcId = _p.id>>
<<set $schemeBeat = "">>
/* The opener reads BOTH sides: the NPC's mood/trust AND the player's own state
(fem stage, ship rep), so a fallen or feared player gets approached as such. */
<<set _actx = Object.assign({ trust: _p.stats.trust, femStage: cruiseNpcBlurb(_p).stage, playerStage: femStage($player), playerRep: playerRep($ship) }, npcMood(_p))>>
<<set $npcLine = npcSay(_p.archetype, (_p.betrayedYou ? "betrayal" : (((_p.playerTopped || 0) gt 0) ? "aftersex" : "smalltalk")), _actx)>>
/* A kept partner presses his daily tribute on the player as they come by - applied
here in the approach action (once a sleep-day, gated by the sleep-reset flag
regularTributeTaken, NOT the civil day, so a midnight-roll cannot re-collect it),
never during the NpcInteract hub's re-renders. Ship_NpcInteract then shows the line. */
<<if _p.regular and not _p.regularTributeTaken and cruiseNpcBlurb(_p).stage lt 6>>
<<set _trib = regularTribute(_p, getVoyageProgress().day)>>
<<set _p.regularTributeTaken = true>>
<<set _p.tributeLine = _trib.line>>
<<if _trib.chips gt 0>><<set $player.money = $player.money + _trib.chips>><</if>>
<<if _trib.riggedRounds gt 0>><<set $ship.riggedRounds = ($ship.riggedRounds || 0) + _trib.riggedRounds>><</if>>
<<if _trib.tokens gt 0>><<run awardVictoryTokens($cruiseSkills, _trib.tokens)>><</if>>
<</if>>
<<goto "Ship_NpcInteract">>
<</button>>
<</capture>>
<</for>>
</div>
<<else>>
<div class="cruise-people__empty">The deck is quiet right now.</div>
<</if>>
<</widget>>
/* One point of the player's daily sex tank (status.potency, max = the sexStamina
attribute) is spent by every act aboard - the desire nights, the reclaims, the
threesomes, the stall work, the stalls' line. Whoever ends the day with the
tank still FULL takes +1 corruption at sleep (cruiseStamina, plan item 8). */
<<widget "SpendSexStamina">>
<<if $player.status.potency.value gt $player.status.potency.min>>
<<run $player.status.potency.decrease(1)>>
<</if>>
<</widget>>
/* Shared overnight tick for every "sleep until morning" path aboard (the Cabins
bunk and the night-caught "back to your bunk" return). One place owns the whole
night sequence so the two sleep paths cannot drift apart again.
Restores the body's needs with the new day - the «Sirena» keeps its stock fed
and presentable: energy and health to full, the drink slept off, washed at the
basin, fed at the galley bell. Then the usual night machinery: the NPC day tick,
the card squeeze, the daily gate resets and the betrayal resolution. */
<<widget "ShipSleepTick">>
<<set _toMorning = (($dateTime.hours < 7 ? 7 - $dateTime.hours : 31 - $dateTime.hours) * 60) - $dateTime.minutes>>
\* Clear the day's background-play ledger BEFORE the clock jump: whatever the
day-life tick (cruiseDayLife, driven by SpendTime) records during the jump is
exactly the evening the player slept through - turning in at three still
plays the boat's tables through to the ten o'clock tally, on live hands,
the same as if the player had waited it out on deck. */
<<set $ship.dayPlay = null>>
<<SpendTime _toMorning>>
<<set $player.status.energy.value = $player.status.energy.max>>
<<set $player.status.health.value = $player.status.health.max>>
<<set $player.status.alcoholIntoxication.value = $player.status.alcoholIntoxication.min>>
<<set $player.status.dirt.value = $player.status.dirt.min>>
<<set $player.status.satiety.value = $player.status.satiety.max>>
/* The ten o'clock tally (cruiseCardCurfew): if the player turned in before the
house called it, it still happened without them - resolve it silently now,
BEFORE the night tick, and let the morning message carry the news. Sleeping
on unplayed cards does not dodge the mark. */
<<if $ship.cardTallyDone is false>>
<<set $ship.cardTallyDone = true>>
/* $ship.tallyExempt (cheat): the house never counts the player's hand. */
<<set _plLeft = ($ship.tallyExempt or not $cruisePlayerHand) ? 0 : rpsHandCount($cruisePlayerHand)>>
<<set $ship.cardTally = resolveCardCurfew($cruiseRoster, _plLeft, undefined, isFullyFallen(femStage($player), $ship.corr))>>
<<if $ship.cardTally.playerCaught>>
<<run applyFeminizationStage($player, 1)>>
<<set $ship.corr = Math.min(6, ($ship.corr || 0) + 1)>>
<<run adjustPlayerRep($ship, -4)>>
<<set $rpsSqueezeMsg = "You slept through the ten o'clock tally with " + $ship.cardTally.playerLeftover + " unplayed cards still on you. The house found them, read your name to an empty chair, and collected anyway: your body is a stage softer and a point more theirs. On the «Sirena», a hand you never play is a debt you owe.">>
<<else>>
<<set $rpsSqueezeMsg = "">>
<</if>>
<<else>>
<<set $rpsSqueezeMsg = "">>
<</if>>
/* The stamina reckoning (cruiseStamina, plan item 8): a full tank carried
through the whole day soaks up the boat's rot. Checked BEFORE the tank
refreshes with the morning. */
<<if $player.status.potency.max gt 0 and $player.status.potency.value gte $player.status.potency.max>>
<<set $ship.corr = Math.min(6, ($ship.corr || 0) + 1)>>
<<set $staminaMsg = "You carried a full tank through the whole day and slept on it. The «Sirena»'s rot seeps into a body that will not spend itself: +1 corruption. Work it off tomorrow - a partner, the stalls, your own hand - or the boat keeps collecting.">>
<<else>>
<<set $staminaMsg = "">>
<</if>>
<<run $player.status.potency.value = $player.status.potency.max>>
<<set _nightCtx = { chips: ($player.money || 0), disguised: !!$ship.disguised, rep: playerRep($ship), lookout: !!$ship.lookout }>>
<<set $ship.lookout = false>>
<<set _voyageSit = { day: getVoyageProgress().day, totalDays: getVoyageProgress().total }>>
<<set $morningReport = cruiseEndOfDay($cruiseRoster, null, $cruiseAlliances, _nightCtx, _voyageSit)>>
\* Fold the slept-through evening's table play (recorded by the day-life tick
during the SpendTime jump above) into the morning report, so "while you
slept" tells the player what the boat actually played without him. */
<<if $ship.dayPlay and $ship.dayPlay.played gt 0>>
<<set $morningReport.matches.played = $morningReport.matches.played + $ship.dayPlay.played>>
<<set $morningReport.matches.results = $ship.dayPlay.results.concat($morningReport.matches.results)>>
<</if>>
<<set $ship.dayPlay = null>>
<<if $morningReport.playerNight and $morningReport.playerNight.chipsLost gt 0>>
<<set $player.money = Math.max(0, $player.money - $morningReport.playerNight.chipsLost)>>
<</if>>
<<set $cruisePlayerHand = rpsFreshHand()>>
<<set $ship.cardTallyDone = false>>
<<set $ship.cardTally = null>>
/* The commission book turns with the morning, not the civil midnight - the
next open of the book deals a fresh slate (cruiseMissions). */
<<if $cruiseMissions>><<set $cruiseMissions.stale = true>><</if>>
<<set $ship.layPartners = []>>
<<set $ship.wheelSpun = false>>
<<set $ship.riggedRounds = 0>>
<<set $ship.barTakeDone = false>>
<<set $ship.mingleDone = false>>
<<set $ship.galleyTakeDone = false>>
<<set $ship.gloryDone = false>>
<<set $ship.wankSceneDone = false>>
<<set $ship.maidSceneDone = false>>
/* A walk-in scene abandoned mid-render must not leak into the next day's
walk-in (it would name yesterday's man and skip today's side effects). */
<<set $maidClientScene = null>>
<<set $ship.searchDone = false>>
<<set $ship.allInDone = false>>
<<set $ship.ecardDone = false>>
<<set $ship.endureDone = false>>
<<set $ship.fleshSaleDone = false>>
<<set $ship.voyeurDone = false>>
<<set $ship.brandtWatchDone = false>>
<<set $ship.labyrinthDone = false>>
<<set $ship.restedDone = false>>
<<set $ship.eventPicked = false>>
/* Corridor travel events (cruiseTravelEvents): the per-day cap resets with the
morning, and a scene abandoned mid-render must not leak into the new day.
Waking in the cabins is not "entering" them - lastDeck pins the wake deck so
the morning render never rolls an incident. */
<<set $ship.travelFired = 0>>
<<set $ship.travelEvent = null>>
<<set $ship.travelResult = "">>
<<set $ship.travelVideo = "">>
<<set $ship.lastDeck = "Ship_Cabins">>
<<set $ship.vaneBeatDone = false>>
<<set $ship.nessaBeatDone = false>>
<<set $ship.brandtBeatDone = false>>
<<run ($ship.chains || []).forEach(function (c) { c.beatDone = false; })>>
<<set $cruiseDirector.ticksSinceEvent = ($cruiseDirector.ticksSinceEvent || 0) + 1>>
<<set _bt = resolvePlayerBetrayals($cruiseRoster, $cruiseAlliances)>>
<<if _bt.length gt 0>>
<<set _steal = Math.min($player.money, Math.round($player.money * 0.12 * _bt.length))>>
<<set $player.money = $player.money - _steal>>
<<run unlockCruiseAchievement("betrayed")>>
<<set $betrayMsg = _bt[0].name + " sold you out in the night and slipped away with " + _steal + " chips.">>
<<set $betrayer = _bt[0]>>
/* Sticky voyage-long fact for the recap: $betrayer is nulled when the
player confronts it, which used to make the recap forget the betrayal. */
<<set $ship.wasBetrayed = true>>
<</if>>
/* The final wake-up: sleeping through the last night lands on the return day,
and the «Sirena» is already made fast to the pier. The night machinery above
still ran (the last tally, the stamina reckoning, the betrayals - the last
night aboard counts in full), but the morning belongs to the port: no cabins,
no wandering, straight to the forced disembark funnel. */
<<if canDisembark()>>
<<goto "Ship_Docked">>
<<else>>
<<goto "Ship_Cabins">>
<</if>>
<</widget>>
/* Unified cruise scene header: a gold voyage-day eyebrow (while aboard) over the
title and a thin gold rule, so every ship scene reads as one designed family.
$args[0] is the title. Replaces the plain centre-text headings. */
<<widget "ShipHead">>
<div class="cruise-head">
<<if $ship and $ship.onBoard>>
<div class="cruise-head__eyebrow">«Sirena» · Day <<= getVoyageProgress().day>> / <<= getVoyageProgress().total>></div>
<</if>>
<div class="cruise-head__title"><<= $args[0]>></div>
<div class="cruise-head__rule"></div>
</div>
<</widget>>
/* Per-deck atmosphere. Pulls a voiced description for the current passage from
deckAtmosphere() (src/scripts/Tournament/cruiseDecks.ts), which shifts with the
hour, the stretch of the voyage, and how far the player has fallen. Renders
nothing for passages without authored atmosphere, so it is safe to drop into
any ship scene right under <<ShipHead>>. */
<<widget "ShipDeckIntro">>
/* The return day has come: the voyage is OVER and the boat does not keep
guests - any deck the player tries to stand on funnels into Ship_Docked
(forced disembark). Checked FIRST, above the tally: once the boat is made
fast there is nothing left to collect aboard. Also heals old saves already
loitering past their return day. */
<<if $ship and $ship.onBoard and canDisembark()>>
<<goto "Ship_Docked">>
/* Past ten and the tally has not been called yet: the house calls it NOW, over
whatever deck the player is standing on (cruiseCardCurfew). The goto fires
after this passage finishes rendering - one frame of deck, then the scene. */
/* Strictly `is false`: on a save from before the tally existed the flag is
undefined - that save gets the same grace night a fresh boarding gets,
instead of an instant unannounced mark. */
<<elseif $ship and $ship.onBoard and $ship.cardTallyDone is false and ($dateTime.hours gte 22 or $dateTime.hours lt 7)>>
<<goto "Ship_CardTally">>
/* Entering a NEW deck (any route - map, stairs, scene exits) can meet a
corridor incident (cruiseTravelEvents). The roll itself is rare and keyed to
$ship.lastDeck, so re-renders and same-deck returns never fire; the tally
redirect above keeps priority (the roll refuses its window anyway). */
<<elseif rollTravelEvent(passage())>>
<<goto "Ship_TravelEvent">>
<</if>>
<<set _atmo = deckAtmosphere(passage(), { day: getVoyageProgress().day, total: getVoyageProgress().total, femStage: femStage($player), corr: ($ship.corr || 0), night: isNightHour($dateTime.hours) })>>
<<if _atmo isnot "">>
<div class="cruise-deck-intro"><<= _atmo>></div>
<</if>>
<</widget>>
/* Daily event draw for any deck (E9). One event fires per voyage day across the
whole ship (shared $ship.eventPicked, reset at the next sleep); the first
event-drawing deck the player visits wins it, and $ship.eventReturn routes the
"move on" back. $args[0] is the deck key. Theme-tagged events only fire under the
active voyage theme. */
<<widget "ShipDrawEvent">>
<<set _ded = getVoyageProgress().day>>
<<if not $ship.eventPicked>>
<<set $ship.eventPicked = true>>
/* Gangway-tagged events only fire when drawn ON the gangway (the wildcard draw
excludes them so the sealed gangway can't strand the day's event slot) - so
the gangway itself must draw with its real deck key, not the wildcard. */
<<set _drawDeck = ($args[0] === "Ship_Gangway") ? "Ship_Gangway" : "*">>
<<set $ship.event = pickCruiseEvent({ day: _ded, femStage: femStage($player), corr: ($ship.corr || 0), deck: _drawDeck, theme: voyageTheme($ship.boardDay).key, eventBoost: liveDirectorNudges().eventBoost, mercyChance: liveDirectorNudges().mercyChance })>>
<<set $ship.eventReturn = ($ship.event and $ship.event.deck) ? $ship.event.deck : $args[0]>>
<</if>>
<</widget>>
/* The "something draws your eye" call-to-action for the deck that drew today's
event. $args[0] is the deck key; only the drawing deck shows it. */
<<widget "ShipEventCTA">>
<<if $ship.event and ($ship.eventReturn || "Ship_MainHall") === $args[0]>>
<div class="btn"><<button "Something draws your eye...">><<set $ship.eventResult = "">><<goto "Ship_CruiseEvent">><</button>></div>
<</if>>
<</widget>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Cruise/Locations/port.jpg">>
<<timed 0.2s>>
<<ShipHead "Harbor">>
<<GangTurfBadge>>
<<GangStreetMsg>>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn-container gang-base-links">
<<set _gbLbl = siteLinkLabel("GB_Docks")>>
<div class="btn"><<button _gbLbl "GB_Docks">><</button>></div>
</div>
<div class="btn-container">
<div class="btn"><<button "The pier & gangway" "Port_Pier">><</button>></div>
</div>
<div class="padding-top"><<Travel "Leave" "Downtown">></div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
<<if $ship && $ship.brothelDebt && $ship.brothelDebt gt 0>>
<div class="btn"><<button "Work off your debt to the house">><<goto "Port_BrothelIndenture">><</button>></div>
<</if>>
</div>
</fieldset>
</div>
<<PeopleAround>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Cruise/Locations/pier.jpg">>
<<timed 0.2s>>
<<ShipHead "The Pier">>
<div class="grid-row-twice">
<fieldset>
<legend>The «Sirena»</legend>
<<set _recruiterPic = "Media/Cruise/Characters/recruiter.jpg">>
<img class="chat-image" @src="_recruiterPic" alt="Recruiter">
<<ChatMessage "A wiry man in a flashy suit leans off a bollard, grinning like he already knows your bank balance.">>
<<ChatMessage "\"Tight on cash? The «Sirena» sails tonight. Ten days, easy chips, you come back richer. Or you don't come back the same - your call.\"">>
<div class="padding-top">
<<if $ship && $ship.brothelDebt && $ship.brothelDebt gt 0>>
<<ChatMessage "\"Sorry, sweetheart - the house says you sail nowhere till that ledger of yours is clean.\"">>
<div class="btn non-interacting"><<button "Clear your debt to the house before you sail again">><</button>></div>
<<elseif isBoardingWindowOpen()>>
<div class="btn"><<button "Take the recruiter's offer">>
<<run Dialog.setup("Boarding the «Sirena»")>>
<<run Dialog.wiki('<<include "Port_BoardDialog">>')>>
<<run Dialog.open()>>
<</button>></div>
<<else>>
<div class="btn non-interacting"><<button "The «Sirena» sails in the evening (18:00-21:00)">><</button>></div>
<</if>>
</div>
</fieldset>
<fieldset>
<legend>Navigation</legend>
<div class="btn-container">
<div class="btn"><<button "Back to the harbor" "Port">><</button>></div>
</div>
</fieldset>
</div>
<<PeopleAround>>
<</timed>>
<</nobr>><<nobr>>
<div class="board-dialog">
<p><b>⚓ The voyage</b></p>
<p>The «Sirena» sails for <b>10 days</b>. The instant you step aboard, the gangway seals - there is no leaving until she returns to port.</p>
<p>Your money is locked in the purser's escrow for the voyage and handed back when you disembark. Aboard, you gamble with <b>borrowed chips</b>.</p>
<p class="warning-text">⚠ While aboard you <b>cannot save manually</b>. The ship keeps one automatic save each night after you sleep.</p>
<p>Pick your stake - a chip loan, <b>no interest</b> (settled when you step ashore):</p>
<div class="btn-container">
<div class="btn"><<button "Small stake - 500 chips">>
<<run boardShip('S')>><<run Dialog.close()>><<goto "Ship_Departure">>
<</button>></div>
<div class="btn"><<button "Medium stake - 1,500 chips">>
<<run boardShip('M')>><<run Dialog.close()>><<goto "Ship_Departure">>
<</button>></div>
<div class="btn"><<button "High roller - 4,000 chips">>
<<run boardShip('L')>><<run Dialog.close()>><<goto "Ship_Departure">>
<</button>></div>
</div>
<div class="padding-top"><div class="btn"><<button "Not now">><<run Dialog.close()>><</button>></div></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Cruise/Locations/gangway.jpg">>
<<timed 0.2s>>
<<ShipHead "Cast off">>
<<ShipMessage "The gangway clangs up behind you. The engines shudder awake and the «Sirena» slides away from the harbor lights - ten days, and no way back now.">>
<<ShipMessage "High on the promenade deck a man in an immaculate grey suit watches the new arrivals board, hands folded on the rail. He does not wave. He counts.">>
<<ShipMessage "\"Welcome aboard the «Sirena». I am Vane - I own her, and for the next ten days I own your markers too.\" His voice is unhurried, almost gentle. \"Play well and step ashore richer. Play badly...\" A thin smile. \"...and we will find other ways for you to settle.\"">>
<<set _theme = voyageTheme($ship.boardDay)>>
<<ShipMessage _theme.blurb>>
<<set _rg = returningGreeting($cruiseReputation ? $cruiseReputation.voyages : 1)>>
<<if _rg isnot "">>
<<ShipMessage _rg>>
<<run unlockCruiseAchievement('returning')>>
<</if>>
<<run unlockCruiseAchievement('board')>>
<<if ($cruiseReputation ? $cruiseReputation.voyages : 1) lte 1>>
<<ShipMessage "A steward falls in beside you on the stairs and recites the boat by rote, the way a man repeats something he has said a thousand times: \"Tables and the standings board in the main hall - the whole boat reads that board, so mind what it says about you. The wheel and the commission book are in the bar; the book pays in chips, the wheel pays in whatever it feels like. And the house deals every guest a hand of cards each morning.\" He taps your pocket as if the cards were already there. \"Play them by the ten o'clock tally or settle the difference. Unplayed paper gets settled in other coin on this boat.\"">>
<</if>>
<<SpendTime 120>>
<div class="btn padding-top"><<button "Head into the ship" "Ship_MainHall">><</button>></div>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Cruise/Locations/gangway.jpg">>
<<timed 0.2s>>
<<ShipHead "Gangway">>
<<ShipDeckIntro>>
<<ShipDrawEvent "Ship_Gangway">>
<div class="grid-row-twice">
<fieldset>
<legend>Ship</legend>
<<ShipDeckMap>>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="cruise-actions">
<div class="cruise-actgroup cruise-actgroup--rest"><div class="cruise-actgroup__head">Pass the time</div><div class="btn-container">
<<EachActions>>
</div></div>
<div class="cruise-actgroup cruise-actgroup--deck"><div class="cruise-actgroup__head">Going ashore</div><div class="btn-container">
<<if canDisembark()>>
/* Reaching the return day forces the voyage shut (ShipDeckIntro
redirects every deck into Ship_Docked); this button is only the
one-frame fallback before that goto lands. Same funnel. */
<div class="btn"><<button "Disembark - step ashore">>
<<goto "Ship_Docked">>
<</button>></div>
<<else>>
<div class="btn non-interacting"><<button "Gangway sealed - voyage in progress">><</button>></div>
<</if>>
<<ShipEventCTA "Ship_Gangway">>
</div></div>
</div>
</fieldset>
</div>
<<ShipPeople>>
<</timed>>
<</nobr>>/* The forced end of the voyage. Once the clock reaches the return day the boat
does not keep guests: every deck render (ShipDeckIntro) and the final wake-up
(ShipSleepTick) funnel here, and the only way out is ashore through the
settlement. No deck map, no people, no bunk - the tournament is over. Another
run means signing up with the port recruiter again (boardShip builds a fresh
voyage). */
<<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Cruise/Locations/gangway.jpg">>
<<timed 0.2s>>
<<ShipHead "Journey's end">>
<<ShipMessage "The engines die away to nothing and the «Sirena» is made fast against the pier. The ten days are up - the voyage is over, and the boat does not keep guests past the last morning.">>
<<ShipMessage "Stewards move through the decks in pairs, stripping the tables bare and walking everyone toward the gangway with a politeness that does not take no. \"Ashore, please. The house settles at the cage.\" There is no game left to sit at and no bunk left to sleep in.">>
<<ShipMessage "If you want another run at Vane's tables, it starts the way this one did - your name on the recruiter's list at the port, and a fresh marker signed.">>
<div class="btn padding-top"><<button "Step ashore and settle up">>
<<run disembarkShip()>><<goto "Port_VoyageRecap">>
<</button>></div>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Cruise/Locations/main_hall.jpg">>
<<timed 0.2s>>
<<ShipHead "Main Hall">>
<<ShipDeckIntro>>
<<set _vday = getVoyageProgress().day>>
<<if not $ship.eventPicked>>
<<set $ship.eventPicked = true>>
<<set $ship.event = pickCruiseEvent({ day: _vday, femStage: femStage($player), corr: ($ship.corr || 0), deck: "*", theme: voyageTheme($ship.boardDay).key, eventBoost: liveDirectorNudges().eventBoost, mercyChance: liveDirectorNudges().mercyChance })>>
<<set $ship.eventReturn = ($ship.event and $ship.event.deck) ? $ship.event.deck : "Ship_MainHall">>
<</if>>
<<if $ship.onBoard and not $ship.rivals>>
<<set $ship.rivals = []>>
<<for _rv range pickVoyageRivals($ship.boardDay || 0, 2)>>
<<set $ship.rivals.push({ key: _rv.key, beat: 0, disp: 0 })>>
<</for>>
<</if>>
<<if $ship.onBoard and not $ship.chains>>
<<set $ship.chains = []>>
<<for _cv range pickVoyageChains($ship.boardDay || 0, 2)>>
<<set $ship.chains.push({ key: _cv.key, stage: 0, beatDone: false, choices: [] })>>
<</for>>
<</if>>
<div class="cruise-stage-banner"><<= stageAnnouncement(_vday, getVoyageProgress().total)>></div>
/* The name's weather, live on the hub deck: how the boat is treating the player
right now (repTier), so the standing is felt without opening the board. */
<<set _hubRep = repTier(playerRep($ship))>>
<div class="cruise-actnote"><b><<= _hubRep.label>>.</b> <<= _hubRep.line>></div>
<div class="grid-row-twice">
<fieldset>
<legend>Ship</legend>
<<ShipDeckMap>>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="cruise-actions">
<div class="cruise-actgroup cruise-actgroup--rest"><div class="cruise-actgroup__head">Pass the time</div><div class="btn-container">
<<EachActions>>
</div></div>
<div class="cruise-actgroup cruise-actgroup--games"><div class="cruise-actgroup__head">Games</div><div class="btn-container">
<div class="btn"><<button "Check the standings board" "Ship_Standings">><</button>></div>
<<if voyageStage(getVoyageProgress().day, getVoyageProgress().total) === "final" and not $ship.champDone and isFullyFallen(femStage($player), $ship.corr) === false>>
<div class="btn"><<button "Enter the Championship">><<goto "Ship_Championship">><</button>></div>
<</if>>
<<if $player.money gte 50 && isFullyFallen(femStage($player), $ship.corr) === false>>
<div class="btn"><<button "Sit at a table">>
<<set _opp = pickMatchOpponent($cruiseRoster)>>
<<if _opp>>
<<set _tt = tableTasteEffect(_opp.archetype, "rps")>>
<<set $tableTaste = _tt.line>>
<<set $rps = startRpsSession({ npcId: _opp.id, npcName: _opp.name, playerChips: $player.money, npcChips: _opp.chips, playerHand: $cruisePlayerHand, npcHand: _opp.hand, npcSkill: Math.max(0, _opp.stats.azart / 120 + liveDirectorNudges().matchDifficulty + _tt.skillBonus), npcAggression: _opp.stats.azart / 100 + _tt.aggroBonus })>>
<<goto "Ship_RpsMatch">>
<<else>>
<<run UI.alert("No one is free at the tables right now.")>>
<</if>>
<</button>></div>
<</if>>
<<if $player.money gte 100 && isFullyFallen(femStage($player), $ship.corr) === false && not $ship.ecardDone>>
<div class="btn"><<button "Sit at the Empress table">>
<<set _eopp = pickMatchOpponent($cruiseRoster)>>
<<if _eopp>>
/* Same stake clamp as the All-In table: entry only needs 100 chips while
the final-stage minimum is 250, so cap the opening bet at what both
purses can actually cover (floored at the 100 table minimum). */
<<set _ett = tableTasteEffect(_eopp.archetype, "ecard")>>
<<set $tableTaste = _ett.line>>
<<set $ecard = startECardSession({ npcId: _eopp.id, npcName: _eopp.name, playerChips: $player.money, npcChips: _eopp.chips, bet: Math.max(100, Math.min(Math.round(stageMinBet(_vday) * _ett.betMult), $player.money, _eopp.chips)), npcSkill: Math.max(0.1, Math.min(0.9, (_eopp.stats.standing || 40) / 120 + liveDirectorNudges().matchDifficulty + _ett.skillBonus)) })>>
<<goto "Ship_ECardMatch">>
<<else>>
<<run UI.alert("No one is free at the Empress table right now.")>>
<</if>>
<</button>></div>
<</if>>
<<if $player.money gte 200 && isFullyFallen(femStage($player), $ship.corr) === false && not $ship.allInDone>>
<div class="btn"><<button "Chance the dice below decks">>
<<set _dopp = pickMatchOpponent($cruiseRoster)>>
<<if _dopp>>
/* Open the table at a stake BOTH sides can actually cover (floored at
the 200 table minimum). Without the clamp the final-stage opening
bet is 250 while entry only needs 200 chips, so a 200-249 player
would open the table unable to roll. The daily gate ($ship.allInDone)
is NOT spent here - only on the first real throw - so backing out
without playing leaves the attempt intact. */
<<set _dtt = tableTasteEffect(_dopp.archetype, "dice")>>
<<set $tableTaste = _dtt.line>>
<<set $allIn = { npcId: _dopp.id, npcName: _dopp.name, bet: Math.max(200, Math.min(Math.round(stageMinBet(_vday) * _dtt.betMult), $player.money, _dopp.chips)), last: null }>>
<<goto "Ship_AllInMatch">>
<<else>>
<<run UI.alert("No one is dicing below decks right now.")>>
<</if>>
<</button>></div>
<</if>>
<<if $player.money gte 100 && isFullyFallen(femStage($player), $ship.corr) === false && not $ship.endureDone>>
<div class="btn"><<button "Outlast someone at the endurance table">>
<<set _nopp = pickMatchOpponent($cruiseRoster)>>
<<if _nopp>>
/* Same stake clamp as the All-In table (see above). */
<<set _ntt = tableTasteEffect(_nopp.archetype, "endurance")>>
<<set $tableTaste = _ntt.line>>
<<set $endure = startEnduranceSession({ npcId: _nopp.id, npcName: _nopp.name, bet: Math.max(100, Math.min(Math.round(stageMinBet(_vday) * _ntt.betMult), $player.money, _nopp.chips)), playerSkill: ($cruiseSkills.endurance || 0) / 10, npcSkill: Math.max(0.2, Math.min(0.85, (_nopp.stats.standing || 40) / 130 + _ntt.skillBonus)), npcAggression: (_nopp.stats.azart || 30) / 100 + _ntt.aggroBonus, caged: $ship.caged })>>
<<goto "Ship_EnduranceMatch">>
<<else>>
<<run UI.alert("No one will take the endurance challenge right now.")>>
<</if>>
<</button>></div>
<</if>>
</div></div>
<div class="cruise-actgroup cruise-actgroup--floor"><div class="cruise-actgroup__head">On the floor</div><div class="btn-container">
<<set _stg = voyageStage(_vday)>>
<<set _expBeat = (_stg is "qualify" ? 0 : (_stg is "free" ? 1 : 2))>>
<<if $ship.rivals>>
<<for _ri, _rr range $ship.rivals>>
<<if _rr.beat lt 3 and _rr.beat lte _expBeat>>
<<capture _ri>>
<<set _rdef = getRival($ship.rivals[_ri].key)>>
<<if _rdef>>
<div class="btn"><<button _rdef.hook>><<set $activeRival = _ri>><<set $rivalMsg = "">><<goto "Ship_RivalBeat">><</button>></div>
<</if>>
<</capture>>
<</if>>
<</for>>
<</if>>
<<if $ship.chains>>
<<for _cidx, _cc range $ship.chains>>
<<if not isChainDone(getChain(_cc.key), _cc.stage) and not _cc.beatDone>>
<<capture _cidx>>
<<set _cdef = getChain($ship.chains[_cidx].key)>>
<<if _cdef>>
<div class="btn"><<button _cdef.hook>><<set $activeChain = _cidx>><<set $chainMsg = "">><<goto "Ship_ChainBeat">><</button>></div>
<</if>>
<</capture>>
<</if>>
<</for>>
<</if>>
<<if femStage($player) gte 6>>
<div class="btn"><<button "Vane's men are here for you">><<goto "Ship_VipFlagship">><</button>></div>
<</if>>
<<if $ship.event and ($ship.eventReturn || "Ship_MainHall") === "Ship_MainHall">>
<div class="btn"><<button "Something draws your eye...">><<set $ship.eventResult = "">><<goto "Ship_CruiseEvent">><</button>></div>
<</if>>
<<if not $ship.vaneBeatDone>>
<div class="btn"><<button "Vane is watching from the high rail">><<set $ship.vaneBeatDone = true>><<goto "Ship_VaneBeat">><</button>></div>
<</if>>
</div></div>
<div class="cruise-actgroup cruise-actgroup--purser">
<div class="cruise-actgroup__head">The purser</div>
<div class="cruise-purser__status">Chips: <<= $player.money>> · Debt: <<= $ship.loan>> · Femininity: <<= femStage($player)>>/6 · Corruption: <<= $ship.corr>>/6 · Standing: <<= repTier(playerRep($ship)).label>></div>
<div class="btn-container">
<<if femStage($player) lt 6>>
/* Once per sleep-day: the seduce-climb recovery loop is free by
design, so an ungated sale let sell->climb->sell mint 60 chips
per lay. The purser re-prices flesh with the morning. */
<<if not $ship.fleshSaleDone>>
<div class="btn"><<button "Sell feminization (+1, +60 chips)">><<set $ship.fleshSaleDone = true>><<run sellDignity('feminization')>><<run unlockCruiseAchievement('sellSelf')>><<run adjustPlayerRep($ship, -2)>><<goto "Ship_MainHall">><</button>></div>
<<else>>
<div class="cruise-caged-note">The purser has bought his flesh for today - "the house re-prices in the morning."</div>
<</if>>
<<else>>
<div class="btn non-interacting"><<button "Fully feminized">><</button>></div>
<</if>>
<<if canSellCorruption(femStage($player), $ship.corr)>>
<div class="btn"><<button "Sell corruption (+1, +60 chips)">><<run sellDignity('corruption')>><<run unlockCruiseAchievement('sellSelf')>><<run adjustPlayerRep($ship, -2)>><<goto "Ship_MainHall">><</button>></div>
<</if>>
<<if femStage($player) gt 0>>
<div class="btn"><<button "Buy back masculinity (on credit)">><<run buyMasculinity()>><<run unlockCruiseAchievement('buyBack')>><<goto "Ship_MainHall">><</button>></div>
<</if>>
</div>
</div>
</div>
</fieldset>
</div>
<<ShipPeople>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Cruise/Locations/main_hall.jpg">>
<<timed 0.2s>>
<<ShipHead "An Incident">>
<<set _ret = $ship.eventReturn || "Ship_MainHall">>
<<if ($ship.eventResult || "") isnot "">>
/* The result reads top to bottom with its clip in the flow: one card per
blank-line paragraph, the clip at the "[clip]" paragraph (EVENT_CLIP_MARK,
cruiseEvents.ts) or after the last one. The clip is one man and the player, so
the paragraph right above it is that pair alone; a group act keeps everyone
else in the paragraphs before it and after the clip. */
<<set _evVid = $ship.eventVideo || "">>
<<set _evParas = String($ship.eventResult).split("\n\n")>>
<<if not _evParas.includes("[clip]")>><<run _evParas.push("[clip]")>><</if>>
<<for _evPara range _evParas>>
<<if _evPara is "[clip]">>
<<if _evVid isnot "">><<Video _evVid>><</if>>
<<elseif _evPara.trim() isnot "">>
<div class="cruise-event">
<div class="cruise-event__result"><<= formatDialogue(_evPara)>></div>
</div>
<</if>>
<</for>>
<div class="btn padding-top"><<button "Move on" _ret>><<set $ship.eventResult = "">><<set $ship.eventVideo = "">><</button>></div>
<<elseif $ship.event>>
<div class="cruise-event">
<div class="cruise-event__title"><<= $ship.event.title>></div>
<div class="cruise-event__body"><<= formatDialogue($ship.event.body)>></div>
</div>
<div class="cruise-choices">
<<for _i, _ch range $ship.event.choices>>
<<capture _i>>
<div class="btn"><<button _ch.label>><<set $ship.eventResult = applyCruiseEventChoice(_i)>><<run recordDirectorEvent($cruiseDirector)>><<goto "Ship_CruiseEvent">><</button>></div>
<</capture>>
<</for>>
</div>
<<else>>
<div class="cruise-event"><div class="cruise-event__body">The moment passes, and the deck closes over it.</div></div>
<div class="btn padding-top"><<button "Back" _ret>><</button>></div>
<</if>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Cruise/Locations/maintenance_ventilation.jpg">>
<<timed 0.2s>>
<<ShipHead "In Passing">>
<<set _dest = $ship.travelDest || "Ship_MainHall">>
<<if ($ship.travelResult || "") isnot "">>
/* Same flow as Ship_CruiseEvent: one card per paragraph, the clip at the "[clip]"
paragraph or after the last one, so the pair line sits directly above it. */
<<set _evVid = $ship.travelVideo || "">>
<<set _evParas = String($ship.travelResult).split("\n\n")>>
<<if not _evParas.includes("[clip]")>><<run _evParas.push("[clip]")>><</if>>
<<for _evPara range _evParas>>
<<if _evPara is "[clip]">>
<<if _evVid isnot "">><<Video _evVid>><</if>>
<<elseif _evPara.trim() isnot "">>
<div class="cruise-event">
<div class="cruise-event__result"><<= formatDialogue(_evPara)>></div>
</div>
<</if>>
<</for>>
<div class="btn padding-top"><<button "Continue on your way" _dest>><<set $ship.travelResult = "">><<set $ship.travelVideo = "">><</button>></div>
<<elseif $ship.travelEvent>>
<div class="cruise-event">
<div class="cruise-event__title"><<= $ship.travelEvent.title>></div>
<div class="cruise-event__body"><<= formatDialogue($ship.travelEvent.body)>></div>
</div>
<div class="cruise-choices">
<<for _i, _ch range $ship.travelEvent.choices>>
<<capture _i>>
<div class="btn"><<button _ch.label>><<set $ship.travelResult = applyTravelEventChoice(_i)>><<run recordDirectorEvent($cruiseDirector)>><<goto "Ship_TravelEvent">><</button>></div>
<</capture>>
<</for>>
</div>
<<else>>
<div class="cruise-event"><div class="cruise-event__body">The passage is only a passage tonight, and it lets you through.</div></div>
<div class="btn padding-top"><<button "Continue" _dest>><</button>></div>
<</if>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Cruise/Locations/bar.jpg">>
<<timed 0.2s>>
<<ShipHead "Bar">>
<<ShipDeckIntro>>
<div class="grid-row-twice">
<fieldset>
<legend>Ship</legend>
<<ShipDeckMap>>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="cruise-actions">
<<set _vday = getVoyageProgress().day>>
<<if not $ship.eventPicked>>
<<set $ship.eventPicked = true>>
<<set $ship.event = pickCruiseEvent({ day: _vday, femStage: femStage($player), corr: ($ship.corr || 0), deck: "*", theme: voyageTheme($ship.boardDay).key, eventBoost: liveDirectorNudges().eventBoost, mercyChance: liveDirectorNudges().mercyChance })>>
<<set $ship.eventReturn = ($ship.event and $ship.event.deck) ? $ship.event.deck : "Ship_Bar">>
<</if>>
<div class="cruise-actgroup cruise-actgroup--rest"><div class="cruise-actgroup__head">Pass the time</div><div class="btn-container">
<<EachActions>>
</div></div>
<div class="cruise-actgroup cruise-actgroup--games"><div class="cruise-actgroup__head">Games</div><div class="btn-container">
<<if $ship.wheelSpun>>
<div class="btn non-interacting"><<button "Wheel of fortune (spun today)">><</button>></div>
<<else>>
<div class="btn"><<button "Try the wheel of fortune">><<set $wheelResult = null>><<goto "Ship_Wheel">><</button>></div>
<</if>>
<div class="btn"><<button "Try the capsule machine">><<goto "Ship_Gacha">><</button>></div>
<<if not $ship.vipWagerDone and $player.money gte 150>>
<div class="btn"><<button "A VIP at the corner table waves you over">><<goto "Ship_VipWager">><</button>></div>
<</if>>
<div class="btn"><<button "Read the VIP corner's commission book">><<set $missionMsg = "">><<goto "Ship_VipMissions">><</button>></div>
</div></div>
<div class="cruise-actgroup cruise-actgroup--deck"><div class="cruise-actgroup__head">Around the deck</div><div class="btn-container">
<<if not $ship.barTakeDone>>
<div class="btn"><<button "Pocket a bottle from the bar">>
<<set $ship.barTakeDone = true>>
<<set _bottle = (random(1, 100) lte 35) ? "fine_liquor" : "alcohol">>
<<set $cruiseInventory[_bottle] = ($cruiseInventory[_bottle] || 0) + 1>>
<<run UI.alert("You slip a bottle of " + getCruiseItem(_bottle).name.toLowerCase() + " off the bar and into your coat - something for the workbench.")>>
<<SpendTime 15>><<goto "Ship_Bar">>
<</button>></div>
<<else>>
<div class="cruise-people__empty">You've lifted a bottle here today; any more and the staff will notice.</div>
<</if>>
<<if not $ship.mingleDone>>
<div class="btn"><<button "Work the room">>
<<set $ship.mingleDone = true>>
<<set $ship.mingleResult = mingleOutcome()>>
<<if $ship.mingleResult.chips gt 0>><<set $player.money = $player.money + $ship.mingleResult.chips>><</if>>
<<SpendTime 30>>
<<goto "Ship_Mingle">>
<</button>></div>
<<else>>
<div class="cruise-people__empty">You've worked the room today; any harder and you'll wear out your welcome.</div>
<</if>>
</div></div>
<div class="cruise-actgroup cruise-actgroup--floor"><div class="cruise-actgroup__head">On the floor</div><div class="btn-container">
<<if $ship.event and $ship.eventReturn === "Ship_Bar">>
<div class="btn"><<button "Something stirs in the bar...">><<set $ship.eventResult = "">><<goto "Ship_CruiseEvent">><</button>></div>
<</if>>
<<if not $ship.vipBetSeen and (femStage($player) gte 3 or ($ship.corr || 0) gte 3)>>
<div class="btn"><<button "A VIP in the corner is talking about you">><<goto "Ship_VipBetBeat">><</button>></div>
<</if>>
</div></div>
</div>
</fieldset>
</div>
<<ShipPeople>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Cruise/Locations/bar.jpg">>
<<timed 0.2s>>
<<ShipHead "The VIP's Wager">>
<<set _vip = vipPatron($ship.boardDay)>>
<img class="cruise-portrait" src="Media/Cruise/Characters/vip_patron_1.jpg" alt="A VIP patron">
<<ShipMessage _vip.intro>>
<<ShipMessage _vip.pitch>>
/* VIPs and staff never sit at the tables themselves (plan item 6): the corner
table fields a CONTESTANT playing under the VIP's colors - his champion, the
deepest purse still holding cards - and the VIP merely watches his money. */
<<set _champ = pickVipChampion($cruiseRoster)>>
<<if _champ>>
/* Macro args do not evaluate infix expressions - prebuild the line (the
string-concat-in-arg gotcha), and show the books' current name. */
<<set _pitch = "\"I don't play, you understand. I field.\" He tips his glass toward a man being waved over from the floor. \"" + cruiseDisplayName(_champ) + " carries my colors tonight. Beat him and you have beaten my money.\"">>
<<ShipMessage _pitch>>
<div class="cruise-purser__status">A backed hand vs <<= cruiseDisplayName(_champ)>>: ante 150 · his purse runs deep</div>
<div class="cruise-choices">
<div class="btn"><<button "Sit against the VIP's champion">>
<<set $ship.vipWagerDone = true>>
<<set $rps = startRpsSession({ npcId: _champ.id, npcName: _champ.name, playerChips: $player.money, npcChips: _champ.chips, playerHand: $cruisePlayerHand, npcHand: _champ.hand, npcSkill: Math.max(0.5, Math.min(0.9, _champ.stats.azart / 110 + 0.35)), npcAggression: 0.18, bet: 150 })>>
/* Not a Main-Hall table entry: clear the previous sitting's taste
line or it renders over the champion. */
<<set $tableTaste = "">>
<<goto "Ship_RpsMatch">>
<</button>></div>
<div class="btn"><<button "Not tonight" "Ship_Bar">><</button>></div>
</div>
<<else>>
<<ShipMessage "\"I field players, you understand - I don't play.\" He scans the floor for a champion still holding cards, and finds no one worth his colors tonight. \"Another evening, perhaps.\"">>
<div class="btn padding-top"><<button "Leave him to his hunt" "Ship_Bar">><</button>></div>
<</if>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Cruise/Locations/main_hall.jpg">>
<<timed 0.2s>>
<<ShipHead "The Ten O'Clock Tally">>
<<if $ship.cardTallyDone is false>>
<<set $ship.cardTallyDone = true>>
/* $ship.tallyExempt (cheat): the house never counts the player's hand. */
<<set _plLeft = ($ship.tallyExempt or not $cruisePlayerHand) ? 0 : rpsHandCount($cruisePlayerHand)>>
<<set $ship.cardTally = resolveCardCurfew($cruiseRoster, _plLeft, undefined, isFullyFallen(femStage($player), $ship.corr))>>
<<if $ship.cardTally.playerCaught>>
<<run applyFeminizationStage($player, 1)>>
<<set $ship.corr = Math.min(6, ($ship.corr || 0) + 1)>>
<<run adjustPlayerRep($ship, -4)>>
<<set $cruisePlayerHand = { Rock: 0, Scissors: 0, Paper: 0 }>>
<</if>>
<</if>>
<<set _tally = $ship.cardTally>>
<<if _tally>>
<<ShipMessage "At ten sharp the music cuts out. A steward in house colors climbs the little stage with the ledger, and the whole hall goes quiet the way it only does for money and shame. \"The tally,\" he calls. \"Cards on the table or marks on the books.\"">>
<<if _tally.matchesPlayed gt 0>>
<div class="cruise-event"><div class="cruise-event__body">The last hour ran hot - <<= _tally.matchesPlayed>> frantic matches as the whole boat scrambled to empty its hands. Now the room holds its breath while the steward reads.</div></div>
<</if>>
<<if _tally.playerCaught>>
<div class="cruise-event">
<div class="cruise-event__title">Your name is on the list</div>
<div class="cruise-event__body">The steward's eyes find you before his voice does. "<<= $player.info.firstName>>. Holding <<= _tally.playerLeftover>>." The hall turns to look, and the house collects right there in front of everyone: the warmth crawling under your skin is a stage of softness you did not choose, and something in how easily you stand there and let them watch tells you the corruption took too. +1 feminization · +1 corruption. Your leftover cards are swept into the steward's bag - void until the morning deal.</div>
</div>
<<elseif _tally.playerLeftover === 0>>
<div class="cruise-event"><div class="cruise-event__body">Your own hands are empty, and the steward's eyes slide past you. Whatever the ledger takes tonight, it takes from someone else.</div></div>
<</if>>
<<if _tally.victims.length gt 0>>
<div class="cruise-event">
<div class="cruise-event__title">Named and marked</div>
<<for _v range _tally.victims>>
<div class="cruise-event__body">· <b><<= _v.name>></b>, holding <<= _v.leftover>> - <<= _v.reaction>> <span class="cruise-caged-note">(now femininity <<= _v.femStage>>/6)</span></div>
<</for>>
</div>
<<else>>
<div class="cruise-event"><div class="cruise-event__body">For once, the steward closes the ledger unmarked - every contestant found a seat in time. The hall exhales as one.</div></div>
<</if>>
<<if _tally.survivorLines.length gt 0>>
<div class="cruise-event">
<<for _sl range _tally.survivorLines>>
<div class="cruise-event__body cruise-event__body--aside"><<= _sl>></div>
<</for>>
</div>
<</if>>
<<else>>
<<ShipMessage "The tally is done for tonight; the hall has already gone back to its drinks.">>
<</if>>
<div class="btn padding-top"><<button "Slip back into the evening">><<goto $player.info.currentLocation>><</button>></div>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Cruise/Locations/bar.jpg">>
<<timed 0.2s>>
<<ShipHead "The Commission Book">>
<div class="cruise-portrait--row"><img src="Media/Cruise/Characters/vip_patron_1.jpg" alt="A VIP patron"><img src="Media/Cruise/Characters/vip_patron_2.jpg" alt="A VIP patron"></div>
/* Keep the return value: on a save from before the commission book existed
$cruiseMissions is undefined and the heal happens inside the call. */
<<set $cruiseMissions = refreshVipMissions($cruiseMissions, $cruiseRoster, getVoyageProgress().day)>>
<<ShipMessage "The corner table keeps a leather book open beside the ashtray - commissions, posted daily, paid in chips on delivery. The VIPs do not play the tables; they play the PEOPLE at them, and the book is how you get a cut of that game.">>
<<if ($missionMsg || "") isnot "">>
<div class="cruise-event"><div class="cruise-event__result"><<= $missionMsg>></div></div>
<</if>>
<<set _activeLive = $cruiseMissions.active.filter(function (m) { return !m.claimed; })>>
<<if _activeLive.length gt 0>>
<div class="cruise-event"><div class="cruise-event__title">Your commissions</div>
<<for _mi range _activeLive>>
<<capture _mi>>
<<set _prog = vipMissionProgress(_mi, $cruiseRoster)>>
<div class="cruise-event__body">
<b><<= _mi.label>></b> · pays <<= _mi.reward>> chips<br>
<<= _mi.desc>><br>
<span class="cruise-caged-note"><<= _prog.note>></span>
</div>
<<if _prog.done>>
<div class="btn"><<button "Collect the bounty">>
<<set _pay = claimVipMission($cruiseMissions, _mi.id, $cruiseRoster)>>
<<if _pay gt 0>>
<<set $player.money = $player.money + _pay>>
<<run adjustPlayerRep($ship, 3)>>
<<set $missionMsg = "The VIP counts out " + _pay + " chips without haggling - the book pays what the book posts. \"A pleasure doing people with you.\"">>
<</if>>
<<goto "Ship_VipMissions">>
<</button>></div>
<</if>>
<</capture>>
<</for>>
</div>
<</if>>
<<if $cruiseMissions.offers.length gt 0>>
<div class="cruise-event"><div class="cruise-event__title">Posted today</div>
<<for _mo range $cruiseMissions.offers>>
<<capture _mo>>
<div class="cruise-event__body">
<b><<= _mo.label>></b> · pays <<= _mo.reward>> chips<br>
<<= _mo.desc>>
</div>
<<if _activeLive.length lt VIP_MISSION_MAX_ACTIVE>>
<div class="btn"><<button "Take the commission">>
<<run acceptVipMission($cruiseMissions, _mo.id)>>
<<set $missionMsg = "">>
<<goto "Ship_VipMissions">>
<</button>></div>
<<else>>
<div class="cruise-caged-note">Your hands are full - deliver what you carry before taking more.</div>
<</if>>
<</capture>>
<</for>>
</div>
<<else>>
<div class="cruise-people__empty">Today's page is bare - every posted commission has been taken. The book turns with the morning.</div>
<</if>>
<div class="btn padding-top"><<button "Close the book" "Ship_Bar">><</button>></div>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Cruise/Locations/bar.jpg">>
<<timed 0.2s>>
<<ShipHead "The VIP Corner">>
<<set $ship.vipBetSeen = true>>
<img class="cruise-portrait" src="Media/Cruise/Characters/vip_patron_2.jpg" alt="A VIP patron">
<<set _vipBetLine = vipBetOnPlayerSeeded($ship.boardDay || 0)>>
<<ShipMessage _vipBetLine>>
<<ShipMessage "You are a line in someone's private book now - a number that pays out whichever way you break. There is nothing to say to it, so you say nothing, and file it away with everything else the «Sirena» has taught you about your own price.">>
<div class="btn padding-top"><<button "Walk it off" "Ship_Bar">><</button>></div>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Cruise/Locations/bar.jpg">>
<<timed 0.2s>>
<<ShipHead "Working the room">>
<<if $ship.mingleResult>>
<div class="cruise-mingle">
<div class="cruise-mingle__text"><<= formatDialogue($ship.mingleResult.text)>></div>
<<if $ship.mingleResult.chips gt 0>>
<div class="cruise-mingle__chips">+<<= $ship.mingleResult.chips>> chips, worked loose from the crowd</div>
<</if>>
</div>
<</if>>
<div class="cruise-choices">
<div class="btn"><<button "Back to the bar" "Ship_Bar">><</button>></div>
</div>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Cruise/Locations/bar.jpg">>
<<timed 0.2s>>
<<ShipHead "The Capsule Machine">>
<div class="cruise-gacha__intro">A squat brass capsule machine hunches in the corner, the house's colours painted up its side. Fifty chips a pull. Most capsules are junk - that is the whole point.</div>
<<if $ship.gachaResult>>
<div @class="'gacha-stage gacha-stage--' + $ship.gachaResult.tier">
<div class="gacha-capsule" aria-hidden="true">
<span class="gacha-burst"></span>
<span class="gacha-spark"></span>
<span class="gacha-capsule__half gacha-capsule__half--top"></span>
<span class="gacha-capsule__half gacha-capsule__half--bottom"></span>
<span class="gacha-capsule__seam"></span>
</div>
<div class="gacha-prize">
<div class="gacha-prize__tier"><<= $ship.gachaResult.tier.toUpperCase()>></div>
<div class="gacha-prize__label"><<= $ship.gachaResult.label>></div>
</div>
</div>
<</if>>
<<if $ship.gachaCrowd and $ship.gachaCrowd isnot "">>
<div class="cruise-gacha-crowd"><<= $ship.gachaCrowd>></div>
<</if>>
<<if $ship.gachaNpc>>
<div class="cruise-gacha-npc"><<= formatDialogue($ship.gachaNpc)>></div>
<</if>>
<div class="rps-chips"><span>Your chips: <b><<= $player.money>></b></span></div>
<div class="cruise-choices">
<<if $player.money gte GACHA_COST>>
<div class="btn"><<button "Feed it and pull (50 chips)">>
<<set $player.money = $player.money - GACHA_COST>>
<<set _prize = pullGacha()>>
<<set $ship.gachaResult = _prize>>
<<set $ship.gachaCrowd = gachaPullFlavor(_prize.tier)>>
<<if _prize.kind is "chips">>
<<set $player.money = $player.money + _prize.chips>>
<<else>>
<<set $cruiseInventory[_prize.id] = ($cruiseInventory[_prize.id] || 0) + 1>>
<</if>>
<<if $cruiseRoster and $cruiseRoster.length gt 0 and random(1, 100) lte 45>>
<<set _gn = $cruiseRoster.random()>>
<<set $ship.gachaNpc = npcGachaBeat(_gn.name, _prize.tier)>>
<<else>>
<<set $ship.gachaNpc = "">>
<</if>>
<<SpendTime 10>>
<<goto "Ship_Gacha">>
<</button>></div>
<<else>>
<div class="cruise-people__empty">You are short of the 50 chips a pull costs.</div>
<</if>>
<div class="btn"><<button "Step away from the machine">><<set $ship.gachaResult = null>><<set $ship.gachaNpc = "">><<set $ship.gachaCrowd = "">><<goto "Ship_Bar">><</button>></div>
</div>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Cruise/Locations/communal_cabins.jpg">>
<<timed 0.2s>>
<<set _toMorning = (($dateTime.hours < 7 ? 7 - $dateTime.hours : 31 - $dateTime.hours) * 60) - $dateTime.minutes>>
<<ShipHead "Communal Cabins">>
<<ShipDeckIntro>>
<<ShipDrawEvent "Ship_Cabins">>
<<if $betrayMsg isnot "">>
<<ShipMessage $betrayMsg>>
<<set $betrayMsg = "">>
<</if>>
<<if $betrayer>>
<div class="cruise-feud-cta"><div class="btn"><<button "Confront the one who sold you out">><<set $betrayReaction = "">><<goto "Ship_BetrayalScene">><</button>></div></div>
<</if>>
<<if $restMsg>>
<<ShipMessage $restMsg>>
<<set $restMsg = "">>
<</if>>
<<if $rpsSqueezeMsg>>
<<ShipMessage $rpsSqueezeMsg>>
<<set $rpsSqueezeMsg = "">>
<</if>>
<<if $staminaMsg>>
<<ShipMessage $staminaMsg>>
<<set $staminaMsg = "">>
<</if>>
<<if $morningReport>>
<<set _fell = $morningReport.seductions.filter(function (s) { return s.ok; })>>
<<set _esc = liveDirectorNudges().escalation>>
<div class="morning-report">
<div class="morning-report__title">While you slept</div>
<div class="morning-report__line morning-report__mood"><<if _esc gte 0.67>>The last days close in - debts come due and the desperate turn reckless.<<elseif _esc gte 0.34>>The voyage has its hooks in everyone now; the easy marks are mostly spent.<<else>>The «Sirena» is still finding her rhythm - everyone sizing each other up.<</if>></div>
/* The count folds in the day-life tick's evening play (cruiseDayLife): turn
in early and the tables still run through to the tally without you. */
<<if $morningReport.matches.played gt 0>>
<div class="morning-report__line"><<= $morningReport.matches.played>> <<= $morningReport.matches.played is 1 ? "match was" : "matches were">> played out at the tables after you turned in.</div>
<</if>>
<<set _hl = cruiseMatchHighlight($morningReport)>>
<<if _hl>><div class="morning-report__line">· <<= _hl>></div><</if>>
<<for _s range _fell>>
<div class="morning-report__line">· <<= cruiseSeductionLine(_s.seducer, _s.target, $cruiseRoster)>></div>
<</for>>
/* The night's society moved too: robberies, fresh pacts, schemes and the men
who turned on each other. Show the sharpest few so the deck reads as a
living, scheming crowd the player woke up behind. */
<<if $morningReport.society and $morningReport.society.events.length gt 0>>
<<for _ev range $morningReport.society.events.slice(0, 3)>>
<div class="morning-report__line morning-report__line--society">· <<= _ev.text>></div>
<</for>>
<</if>>
/* The night's moves against the PLAYER (cruiseNightThreat): a bunk gone
through, a friend who stood between, poison poured into a warm ear. Shown
last and loud - these are the lines that cost or saved him something. */
<<if $morningReport.playerNight and $morningReport.playerNight.events.length gt 0>>
<<for _pev range $morningReport.playerNight.events>>
<div @class="'morning-report__line morning-report__line--player morning-report__line--' + _pev.type">● <<= _pev.text>></div>
<</for>>
<</if>>
/* The stamina reckoning (cruiseStamina): who the boat's rot found sitting
on a full tank, and a light beat about the ones who handled it. */
<<if $morningReport.stamina and $morningReport.stamina.corrupted.length gt 0>>
<<for _sc range $morningReport.stamina.corrupted.slice(0, 2)>>
<div class="morning-report__line morning-report__line--society">· <<= _sc.name>> carried a full tank past midnight - the rot found him (corruption <<= _sc.corr>>/6).</div>
<</for>>
<</if>>
<<if $morningReport.stamina and $morningReport.stamina.relieved.length gt 0>>
<div class="morning-report__line">· <<= $morningReport.stamina.relieved.length>> of the men slipped off to the head before midnight and came back lighter.</div>
<</if>>
<<if $morningReport.stamina and $morningReport.stamina.maidServed and $morningReport.stamina.maidServed.length gt 0>>
<div class="morning-report__line">· <<= $morningReport.stamina.maidServed[0].name>> paid a maid her five hundred rather than risk the mark<<if $morningReport.stamina.maidServed.length gt 1>> - and he was not the only one<</if>>.</div>
<</if>>
<<set _feud = cruiseFeudHighlight($cruiseRoster)>>
<<if _feud>><div class="morning-report__line">· <<= _feud>></div><</if>>
</div>
<<set $morningReport = null>>
<</if>>
<div class="grid-row-twice">
<fieldset>
<legend>Ship</legend>
<<ShipDeckMap>>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="cruise-actions">
<<set _vday = getVoyageProgress().day>>
<div class="cruise-actgroup cruise-actgroup--rest"><div class="cruise-actgroup__head">Pass the time</div><div class="btn-container">
<<EachActions>>
<<if not $ship.restedDone>>
<div class="btn"><<button "Rest in your bunk">>
<<set $ship.restedDone = true>>
<<run $player.status.energy.increase(25)>>
<<set $restMsg = ['You stretch out in the cramped bunk and make yourself rest, even with the «Sirena» grinding on around you. Not much, but enough to push on a while.', 'You lie back and shut your eyes against the noise of the lower decks. The rest comes thin and uneasy, but it comes.', 'You steal an hour horizontal while the cabins are half empty. The ceiling hangs close and the air is stale, but your legs stop aching.'].random()>>
<<SpendTime 90>>
<<goto "Ship_Cabins">>
<</button>></div>
<<else>>
<div class="cruise-people__empty">You have taken what rest you can today; lie down again and you will only stare at the bunk above.</div>
<</if>>
/* The night telegraphs itself (cruiseNightThreat): a fat purse in a room
of low-trust predators draws eyes, and the player can answer it - a
paid watcher at the bunk turns any robbery into a scare instead. */
<<if not $ship.lookout>>
<<set _nw = nightRobberyWarning($cruiseRoster, $player.money)>>
<<if _nw>>
<div class="cruise-caged-note"><<= _nw.text>></div>
<<if $player.money gte 40>>
<div class="btn" data-tip="A deckhand watches your bunk tonight: any robbery attempt is caught, purse intact."><<button "Pay a deckhand to watch your bunk (40 chips)">>
<<set $player.money -= 40>>
<<set $ship.lookout = true>>
<<goto "Ship_Cabins">>
<</button>></div>
<</if>>
<</if>>
<<else>>
<div class="cruise-people__empty">Your paid man is already picking his spot in the shadows by your bunk - tonight, at least, the purse sleeps guarded.</div>
<</if>>
<div class="btn"><<button "Sleep until morning">>
<<ShipSleepTick>>
<</button>></div>
</div></div>
<div class="cruise-actgroup cruise-actgroup--deck"><div class="cruise-actgroup__head">Around the deck</div><div class="btn-container">
<div class="btn"><<button "Hone your skills">><<goto "Ship_Skills">><</button>></div>
</div></div>
<div class="cruise-actgroup cruise-actgroup--floor"><div class="cruise-actgroup__head">On the floor</div><div class="btn-container">
<div class="btn"><<button "Speak with the maid">><<goto "Ship_MaidEncounter">><</button>></div>
/* The maids' side trade (cruiseMaid, plan item 9): 500 chips settles you. */
<<if $player.money gte MAID_SERVICE_COST and $player.status.potency.value gt $player.status.potency.min and not ($ship.caged and $player.genitalia() is "Penis")>>
<<set _maidLbl = "Have a maid settle you (" + MAID_SERVICE_COST + " chips)">>
<div class="btn"><<button _maidLbl>>
<<set $player.money = $player.money - MAID_SERVICE_COST>>
<<SpendSexStamina>>
<<run $player.status.horny.decrease(50)>>
<<set $maidService = maidServiceScene($player.genitalia())>>
<<SpendTime 30>>
<<goto "Ship_MaidService">>
<</button>></div>
<<elseif $ship.caged and $player.genitalia() is "Penis">>
<div class="cruise-caged-note">The maids know better than to try to settle a caged cock - "the owner's locks are the owner's business."</div>
<</if>>
/* Walking in on a contestant being settled (once a day). */
<<if not $ship.maidSceneDone>>
<<set _mcl = maidClientOnDeck($cruiseRoster, "Ship_Cabins")>>
<<if _mcl>>
<div class="cruise-suitor-cta"><div class="btn"><<button "A service curtain is half drawn, and the sounds behind it are not housekeeping">><<set $activeNpcId = _mcl.id>><<set $ship.maidSceneDone = true>><<goto "Ship_MaidClient">><</button>></div></div>
<</if>>
<</if>>
<<ShipEventCTA "Ship_Cabins">>
</div></div>
</div>
</fieldset>
</div>
<<ShipPeople>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Cruise/Locations/communal_cabins.jpg">>
<<timed 0.2s>>
<<ShipHead "Settled">>
<img class="cruise-portrait" src="Media/Cruise/Characters/maid_1.jpg" alt="A maid of the «Sirena»">
<<if $maidService>>
<<ShipMessage $maidService.intro>>
/* Body-aware media: the maid (Female) works the player - dom side is the
one being serviced, matching the gloryhole's table semantics. Empty picks
render as a clean no-op if the pair is filtered off. */
<<set _dg = $player.gender()>>
<<SetOralPick _dg "Female">><<Video _pick>>
<div class="cruise-event"><div class="cruise-event__result"><<= formatDialogue($maidService.act)>></div></div>
<<if $player.genitalia() is "Penis">>
<<SetOralCumInPick _dg "Female">><<if _pick is "">><<SetOralPick _dg "Female">><</if>><<Video _pick>>
<</if>>
<div class="cruise-afterglow"><<= $maidService.afterglow>></div>
<<set $maidService = null>>
<<else>>
<<ShipMessage "The maid has already moved on down the row of bunks, apron pockets a little heavier.">>
<</if>>
<div class="btn padding-top"><<button "Straighten your clothes" "Ship_Cabins">><</button>></div>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Cruise/Locations/communal_cabins.jpg">>
<<timed 0.2s>>
<<ShipHead "Housekeeping">>
<<set _npc = getRosterEntry($cruiseRoster, $activeNpcId)>>
<<if _npc>>
<<if not $maidClientScene>>
<<set $maidClientScene = maidClientScene(_npc)>>
<</if>>
/* The maid works his cock through both tableau registers, so the clip only
fits a body that still has one - a stage-6 (Female) client gets text alone.
SetSexPickByTable gates the content-filter pair itself. */
<<if _npc.gender isnot "Female">>
<<set _dg = _npc.gender>>
<<SetOralPick _dg "Female">><<Video _pick>>
<</if>>
<div class="cruise-event"><div class="cruise-event__body"><<= $maidClientScene.tableau>></div></div>
<div class="cruise-event"><div class="cruise-event__result"><<= formatDialogue($maidClientScene.reaction)>></div></div>
<div class="btn padding-top"><<button "Let the curtain fall" "Ship_Cabins">><<set $maidClientScene = null>><</button>></div>
<<else>>
<<ShipMessage "The curtain is drawn back and the linen cart already gone - whatever was settled here is settled.">>
<div class="btn padding-top"><<button "Move on" "Ship_Cabins">><</button>></div>
<</if>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Cruise/Locations/communal_cabins.jpg">>
<<timed 0.2s>>
<<ShipHead "The Maid">>
<img class="cruise-portrait" src="Media/Cruise/Characters/maid_1.jpg" alt="Nessa, a maid of the «Sirena»">
<<if ($nessaMsg || "") isnot "">>
<div class="cruise-event"><div class="cruise-event__result"><<= formatDialogue($nessaMsg)>></div></div>
<div class="btn padding-top"><<button "Leave her to her work" "Ship_Cabins">><<set $nessaMsg = "">><</button>></div>
<<elseif not $ship.maidVisits>>
<<ShipMessage "A maid works down the row of bunks, stripping sheets without looking too hard at who is in them. She is one of the only women the «Sirena» keeps aboard, and she has learned not to ask questions.">>
<<ShipMessage "\"Nessa,\" she offers, not slowing. \"Ten days pier to pier. Most who board don't step off the same. The owner takes his cut in chips - or in whatever's left when the chips run out. I just change the linens.\"">>
<<ShipMessage "\"They keep a few of us aboard for the same reason they keep the bar stocked: something to settle the crew. We learned fast to watch the floor and not the faces.\"">>
<<if not $ship.maidGift>>
<<ShipMessage "She glances at the door, then presses a folded scrap of cloth into your hands. \"For the workbench, or whatever you need. Don't say where you got it.\"">>
<<set $ship.maidGift = true>>
<<set $cruiseInventory["cloth"] = ($cruiseInventory["cloth"] || 0) + 1>>
<</if>>
<<set $ship.maidVisits = ($ship.maidVisits || 0) + 1>>
<div class="btn padding-top"><<button "Leave her to her work" "Ship_Cabins">><</button>></div>
<<elseif ($ship.nessaBeat || 0) lt 3 and not $ship.nessaBeatDone>>
<<set _nb = nessaArcBeat(($ship.nessaBeat || 0), ($ship.nessaDisp || 0))>>
<<ShipMessage _nb.text>>
<<if _nb.final>>
<div class="btn padding-top"><<button "Take what she offers">>
<<if _nb.effect and _nb.effect.tokens>><<run awardVictoryTokens($cruiseSkills, _nb.effect.tokens)>><</if>>
<<if _nb.effect and _nb.effect.chips>><<set $player.money = Math.max(0, $player.money + _nb.effect.chips)>><</if>>
<<if nessaBand($ship.nessaDisp || 0) is "ally">><<run unlockCruiseAchievement("nessaAlly")>><</if>>
<<set $ship.nessaBeat = 3>><<set $ship.nessaBeatDone = true>>
<<set $nessaMsg = (_nb.effect ? _nb.effect.note : "She goes back to her work.")>>
<<goto "Ship_MaidEncounter">>
<</button>></div>
<<else>>
<div class="cruise-choices">
<<for _ci, _ch range _nb.choices>>
<<set _nres = _ch.result>>
<<set _ndisp = _ch.disp>>
<<capture _nres, _ndisp>>
<div class="btn"><<button _ch.label>>
<<set $ship.nessaDisp = ($ship.nessaDisp || 0) + _ndisp>>
<<set $ship.nessaBeat = ($ship.nessaBeat || 0) + 1>>
<<set $ship.nessaBeatDone = true>>
<<set $nessaMsg = _nres>>
<<goto "Ship_MaidEncounter">>
<</button>></div>
<</capture>>
<</for>>
</div>
<</if>>
<<else>>
<<set _maid = maidLine({ day: getVoyageProgress().day, femStage: femStage($player) })>>
<<ShipMessage _maid>>
<<set $ship.maidVisits = ($ship.maidVisits || 0) + 1>>
<<if nessaBand($ship.nessaDisp || 0) is "ally" and not $ship.nessaIntimate>>
<div class="cruise-actnote">Something unspoken sits between you and Nessa now - the one person aboard who has wanted nothing from you.</div>
<div class="btn"><<button "Stay a while with her" "Ship_NessaIntimate">><</button>></div>
<</if>>
<div class="btn padding-top"><<button "Leave her to her work" "Ship_Cabins">><</button>></div>
<</if>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Cruise/Locations/communal_cabins.jpg">>
<<timed 0.2s>>
<<ShipHead "Nessa">>
<img class="cruise-portrait" src="Media/Cruise/Characters/maid_1.jpg" alt="Nessa">
<<if ($nessaSceneRole || "") is "">>
<<ShipMessage "In the quiet after her rounds she lingers by your bunk, and for once neither of you is performing for the «Sirena». What happens next is yours to choose - and hers, freely given either way.">>
<div class="cruise-actnote">The one thing aboard the «Sirena» that costs nothing. There is no ledger here, and no stage of you will move for it - only how you want her.</div>
/* Same cage gate as every other player-top path (make-a-move, champion's
night, the suitor CTA): a caged cock cannot deliver the topping clips. */
<<if not ($ship.caged and $player.genitalia() is "Penis")>>
<div class="btn"><<button "Take her, slow">><<set $nessaSceneRole = "top">><<goto "Ship_NessaIntimate">><</button>></div>
<<else>>
<div class="cruise-caged-note">The cage settles that question before you can ask it - taking her is not on tonight's table.</div>
<</if>>
<div class="btn"><<button "Let her take you (she has a strap)">><<set $nessaSceneRole = "bottom">><<goto "Ship_NessaIntimate">><</button>></div>
<div class="btn padding-top"><<button "Just lie here with her">>
<<set $ship.nessaIntimate = true>>
<<set $nessaMsg = "You stay until her shift calls her back, and nothing is owed in either direction. It is the most rest you have had since the gangway.">>
<<goto "Ship_MaidEncounter">>
<</button>></div>
<<else>>
<<set _role = $nessaSceneRole>>
<<set _ns = nessaIntimateScene(_role)>>
<<set _pg = $player.gender()>>
<<ShipMessage _ns.lead>>
<<if _role is "top">>
/* The player takes Nessa (Female): dom = the player, sub = Female, vaginal. */
<<SetOralPick _pg "Female">><<Video _pick>>
<<ShipMessage _ns.beat>>
<<SetVagPick _pg "Female">><<Video _pick>>
<<SetVagCumInPick _pg "Female">><<if _pick is "">><<SetVagPick _pg "Female">><</if>><<Video _pick>>
<<else>>
/* Nessa takes the player with a strap: dom = Female, sub = the player. The
otherwise-unused Female-dom strap media (E4). Body-aware: a fully-feminized
player (vagina) is taken vaginally, a body that still has a penis anally. */
<<SetStrapFacePick "Female" _pg>><<Video _pick>>
<<ShipMessage _ns.beat>>
<<if _pg is "Female">><<SetVagPick "Female" _pg>><<else>><<SetAnalPick "Female" _pg>><</if>><<Video _pick>>
<</if>>
<div class="cruise-afterglow"><<= formatDialogue(_ns.afterglow)>></div>
<div class="btn padding-top"><<button "Stay until her shift calls">>
<<set $ship.nessaIntimate = true>>
<<set $nessaSceneRole = "">>
<<set $nessaMsg = "She slips back to her rounds before the watch changes, and the «Sirena» is none the wiser. Whatever the voyage took from you, it did not get that.">>
<<goto "Ship_MaidEncounter">>
<</button>></div>
<</if>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Cruise/Locations/main_hall.jpg">>
<<timed 0.2s>>
<<ShipHead "The Owner">>
<img class="cruise-portrait" src="Media/Cruise/Characters/owner_director.jpg" alt="Vane, owner of the «Sirena»">
<<set _vane = vaneObservation({ day: getVoyageProgress().day, total: getVoyageProgress().total, femStage: femStage($player), corr: ($ship.corr || 0) })>>
<<ShipMessage _vane>>
<<ShipMessage "He does not wait to be answered. By the time you think of something worth saying, his attention has already moved on down the floor, counting.">>
<div class="btn padding-top"><<button "Hold his gaze a moment, then look away" "Ship_MainHall">><</button>></div>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Cruise/Locations/lower_deck.jpg">>
<<timed 0.2s>>
<<ShipHead "The Master-at-Arms">>
<img class="cruise-portrait" src="Media/Cruise/Characters/guard_1.jpg" alt="Brandt, the master-at-arms">
<<if ($brandtMsg || "") isnot "">>
<div class="cruise-event"><div class="cruise-event__result"><<= formatDialogue($brandtMsg)>></div></div>
<div class="btn padding-top"><<button "Step aside and let him pass" "Ship_LowerDeck">><<set $brandtMsg = "">><</button>></div>
<<elseif ($ship.brandtBeat || 0) lt 3 and not $ship.brandtBeatDone>>
<<set _bb = brandtArcBeat(($ship.brandtBeat || 0), ($ship.brandtDisp || 0))>>
<<ShipMessage _bb.text>>
<<if _bb.final>>
<<if brandtBand($ship.brandtDisp || 0) === "owned">>
/* The owned band's tax has two denominations (E13): chips, or the player
chooses to settle it in his cabin - explicit, spares the 100 chips. */
<div class="cruise-choices">
<div class="btn"><<button "Pay his tax in chips">>
<<if _bb.effect and _bb.effect.chips>><<set $player.money = Math.max(0, $player.money + _bb.effect.chips)>><</if>>
<<set $ship.brandtBeat = 3>><<set $ship.brandtBeatDone = true>>
<<set $brandtMsg = (_bb.effect ? _bb.effect.note : "He moves on, satisfied.")>>
<<goto "Ship_BrandtBeat">>
<</button>></div>
<div class="btn"><<button "Settle it off the books">>
<<set $ship.brandtBeat = 3>><<set $ship.brandtBeatDone = true>>
<<if ($ship.corr || 0) lt 6>><<set $ship.corr = ($ship.corr || 0) + 1>><</if>>
<<goto "Ship_BrandtCollect">>
<</button>></div>
</div>
<<else>>
<div class="btn padding-top"><<button "Hear his verdict">>
<<if _bb.effect and _bb.effect.tokens>><<run awardVictoryTokens($cruiseSkills, _bb.effect.tokens)>><</if>>
<<if _bb.effect and _bb.effect.chips>><<set $player.money = Math.max(0, $player.money + _bb.effect.chips)>><</if>>
<<set $ship.brandtBeat = 3>><<set $ship.brandtBeatDone = true>>
<<set $brandtMsg = (_bb.effect ? _bb.effect.note : "He moves on, satisfied.")>>
<<goto "Ship_BrandtBeat">>
<</button>></div>
<</if>>
<<else>>
<div class="cruise-choices">
<<for _bci, _bch range _bb.choices>>
<<set _bres = _bch.result>>
<<set _bdisp = _bch.disp>>
<<capture _bres, _bdisp>>
<div class="btn"><<button _bch.label>>
<<set $ship.brandtDisp = ($ship.brandtDisp || 0) + _bdisp>>
<<set $ship.brandtBeat = ($ship.brandtBeat || 0) + 1>>
<<set $ship.brandtBeatDone = true>>
<<set $brandtMsg = _bres>>
<<goto "Ship_BrandtBeat">>
<</button>></div>
<</capture>>
<</for>>
</div>
<</if>>
<<else>>
<<set _brandt = brandtObservation({ day: getVoyageProgress().day, femStage: femStage($player), corr: ($ship.corr || 0) })>>
<<ShipMessage _brandt>>
<<ShipMessage "You hold still until his attention moves on. Aboard the «Sirena», drawing Brandt's eye is the kind of mistake that ends up as a name on his list.">>
<div class="btn padding-top"><<button "Step aside and let him pass" "Ship_LowerDeck">><</button>></div>
<</if>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Cruise/Locations/lower_deck.jpg">>
<<timed 0.2s>>
<<ShipHead "Off the Books">>
<img class="cruise-portrait" src="Media/Cruise/Characters/guard_1.jpg" alt="Brandt, the master-at-arms">
<<set _bc = brandtCollectScene(femStage($player), $player.gender())>>
<<ShipMessage _bc.lead>>
<<ShipMessage _bc.act>>
<<set _dg = "Male">>
<<set _sg = $player.gender()>>
<<SetOralPick _dg _sg>><<Video _pick>>
/* Body-aware finish like the other group-use scenes: Female is taken vaginally,
a body still carrying a penis anally. */
<<if _sg is "Female">>
<<SetVagPick _dg _sg>><<Video _pick>>
<<SetVagCumInPick _dg _sg>><<if _pick is "">><<SetVagPick _dg _sg>><</if>><<Video _pick>>
<<else>>
<<SetAnalPick _dg _sg>><<Video _pick>>
<<SetAnalCumInPick _dg _sg>><<if _pick is "">><<SetAnalPick _dg _sg>><</if>><<Video _pick>>
<</if>>
<div class="cruise-afterglow"><<= formatDialogue(_bc.afterglow)>></div>
<div class="btn padding-top"><<button "Back to the deck" "Ship_LowerDeck">><</button>></div>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Cruise/Locations/main_hall.jpg">>
<<timed 0.2s>>
<<ShipHead "Bad Blood">>
<<if not $feudPair>>
<<goto $player.info.currentLocation>>
<<elseif $feudResult isnot "">>
/* The confrontation has played out (watched, stoked, defused, or bet on): cool
both men below the feud-shown threshold so the same quarrel cannot be re-entered
and re-skimmed on the spot. The daily social tick can let it fester again later.
Done here, the common post-action render, so it holds even if the player leaves
without taking the "Step away" button. */
<<set _fa = getRosterEntry($cruiseRoster, $feudPair.aId)>><<if _fa>><<set _fa.rivalHeat = 0>><</if>>
<<set _fb = getRosterEntry($cruiseRoster, $feudPair.bId)>><<if _fb>><<set _fb.rivalHeat = 0>><</if>>
<div class="cruise-afterglow"><<= formatDialogue($feudResult)>></div>
<div class="btn padding-top"><<button "Step away" $player.info.currentLocation>><<set $feudPair = null>><<set $feudResult = "">><</button>></div>
<<else>>
<<set _fintro = "The bad blood between " + $feudPair.aName + " and " + $feudPair.bName + " has finally found a deck to spill onto. The room is already half-turned to watch.">>
<<ShipMessage _fintro>>
<div class="cruise-choices">
<div class="btn"><<button "Watch it play out">>
<<set $feudResult = feudActionText('watch', $feudPair.aName, $feudPair.bName)>>
<<SpendTime 20>><<goto "Ship_FeudScene">>
<</button>></div>
<div class="btn"><<button "Stoke it, and skim the side-bets">>
<<set $feudResult = feudActionText('stoke', $feudPair.aName, $feudPair.bName)>>
<<set $player.money = $player.money + 40>>
<<set _fa = getRosterEntry($cruiseRoster, $feudPair.aId)>><<if _fa>><<run adjustCruiseStat(_fa.stats, "azart", 6)>><</if>>
<<set _fb = getRosterEntry($cruiseRoster, $feudPair.bId)>><<if _fb>><<run adjustCruiseStat(_fb.stats, "azart", 6)>><</if>>
<<SpendTime 30>><<goto "Ship_FeudScene">>
<</button>></div>
<div class="btn"><<button "Step between them and cool it">>
<<set $feudResult = feudActionText('defuse', $feudPair.aName, $feudPair.bName)>>
<<set _fa = getRosterEntry($cruiseRoster, $feudPair.aId)>><<if _fa>><<run adjustCruiseStat(_fa.stats, "trust", 8)>><</if>>
<<set _fb = getRosterEntry($cruiseRoster, $feudPair.bId)>><<if _fb>><<run adjustCruiseStat(_fb.stats, "trust", 8)>><</if>>
<<SpendTime 20>><<goto "Ship_FeudScene">>
<</button>></div>
<<if $player.money gte 60>>
<div class="btn"><<button "Lay 60 chips on who comes out on top">>
<<if random(0, 99) lt 50>>
<<set $player.money = $player.money + 90>>
<<set $feudResult = "You read the room right - your man lands the telling blow, and the quiet side-bets pay out. You walk away ninety chips richer and no cleaner for it.">>
<<else>>
<<set $player.money = Math.max(0, $player.money - 60)>>
<<set $feudResult = "Your man folds first, the way the «Sirena» always seems to know they will, and your stake goes into someone else's pocket. The house does love a side-bet.">>
<</if>>
<<SpendTime 25>><<goto "Ship_FeudScene">>
<</button>></div>
<</if>>
</div>
<</if>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Cruise/Locations/main_hall.jpg">>
<<timed 0.2s>>
<<ShipHead "A Man With His Nerve Up">>
<<set _npc = getRosterEntry($cruiseRoster, $activeNpcId)>>
<<if not _npc>>
<<goto $player.info.currentLocation>>
<<elseif $suitorResult isnot "">>
/* The approach has been answered (spurned, gently or not): show how it landed
and let the deck move on. The suitor's move is spent for the day either way. */
<div class="cruise-afterglow"><<= formatDialogue($suitorResult)>></div>
<div class="btn padding-top"><<button "Move on" $player.info.currentLocation>><<set $suitorResult = "">><</button>></div>
<<else>>
/* He came to YOU (cruiseDesire.desireSuitorOnDeck): the wanting man crossing the
deck instead of waiting on his card. Accepting rides the same warm rails as the
dossier's desire encounter; refusing has a price, because want refused curdles -
and a public humiliation is remembered by everyone who watched. */
<div class="cruise-proposition cruise-proposition--want">
<div class="cruise-proposition__label"><<= _npc.name>> has stopped waiting to be noticed. <<= cruiseKinkLabel(npcKink(_npc))>></div>
<div class="cruise-proposition__line"><<= formatDialogue(desireProposition(_npc.archetype))>></div>
</div>
<div class="cruise-choices">
<<set _desCost = effectiveEnergyCost(15, $cruiseSkills)>>
<<if $player.status.energy.value gte _desCost>>
<div class="btn" data-tip="Top him. He wants this - it lands, lifts his trust, and a stage of him passes to you."><<button "Take him up on it">>
<<set _ec = effectiveEnergyCost(15, $cruiseSkills)>>
<<SpendEnergy $player _ec>>
<<set _n = getRosterEntry($cruiseRoster, $activeNpcId)>>
<<set _n.desireApproached = true>>
<<set $climaxScene = { pStage: femStage($player), pGender: $player.gender(), nStage: cruiseNpcBlurb(_n).stage, nGender: _n.gender, playerPenetrates: true }>>
<<run resolveDesireEncounter(_n)>>
<<run recordCruiseLay($ship, _n.id)>><<SpendSexStamina>><<run adjustPlayerRep($ship, 2)>>
<<if femStage($player) gt 0>><<run applyFeminizationStage($player, -1)>><</if>>
<<set $climaxDesire = true>>
<<run unlockCruiseAchievement("seduce")>>
<<set $npcLine = pickCruiseLine(_n.archetype, "seduced", npcMood(_n))>>
<<SpendTime 60>>
<<goto "Ship_Climax">>
<</button>></div>
<div class="btn" data-tip="Let him have the night his way while you steer it. It lands, and a stage of him still passes to you."><<button "Let him lead tonight">>
<<set _ec = effectiveEnergyCost(15, $cruiseSkills)>>
<<SpendEnergy $player _ec>>
<<set _n = getRosterEntry($cruiseRoster, $activeNpcId)>>
<<set _n.desireApproached = true>>
<<set $climaxScene = { pStage: femStage($player), pGender: $player.gender(), nStage: cruiseNpcBlurb(_n).stage, nGender: _n.gender, playerPenetrates: false }>>
<<run resolveDesireEncounter(_n)>>
<<run recordCruiseLay($ship, _n.id)>><<SpendSexStamina>><<run adjustPlayerRep($ship, 2)>>
<<if femStage($player) gt 0>><<run applyFeminizationStage($player, -1)>><</if>>
<<set $climaxDesire = true>>
<<run unlockCruiseAchievement("seduce")>>
<<set $npcLine = pickCruiseLine(_n.archetype, "seduced", npcMood(_n))>>
<<SpendTime 60>>
<<goto "Ship_Climax">>
<</button>></div>
<<else>>
<div class="cruise-caged-note">Whatever you might want to answer, you are too worn to give anyone a night - you could only turn him away.</div>
<</if>>
<div class="btn" data-tip="Let him down easy. It costs a little of the trust the want was built on."><<button "Turn him down gently">>
<<set _n = getRosterEntry($cruiseRoster, $activeNpcId)>>
<<set _reb = resolveDesireRebuff(_n, 'gentle')>>
<<set $suitorResult = _reb.note + ' "' + pickCruiseLine(_n.archetype, "rebuffed", npcMood(_n)) + '"'>>
<<SpendTime 10>>
<<goto "Ship_DesireApproach">>
<</button>></div>
<div class="btn" data-tip="Crush him in front of the deck. He will never come to you again - and the men who watched cool toward you too."><<button "Laugh in his face">>
<<set _n = getRosterEntry($cruiseRoster, $activeNpcId)>>
<<set _reb = resolveDesireRebuff(_n, 'cruel', $cruiseRoster)>>
<<set $suitorResult = _reb.note + ' "' + pickCruiseLine(_n.archetype, "rebuffed", npcMood(_n)) + '"'>>
<<SpendTime 10>>
<<goto "Ship_DesireApproach">>
<</button>></div>
</div>
<</if>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Cruise/Locations/main_hall.jpg">>
<<timed 0.2s>>
<<ShipHead "What Am I To You">>
<<set _npc = getRosterEntry($cruiseRoster, $activeNpcId)>>
<<if not _npc>>
<<goto $player.info.currentLocation>>
<<elseif $jealousResult isnot "">>
<<if ($jealousVideo || "") isnot "">><<Video $jealousVideo>><</if>>
<div class="cruise-afterglow"><<= formatDialogue($jealousResult)>></div>
<div class="btn padding-top"><<button "Move on" $player.info.currentLocation>><<set $jealousResult = "">><<set $jealousVideo = "">><</button>></div>
<<else>>
/* A kept regular has heard about the player's day (cruiseJealousy). Three
answers: cheap words (trust dips), the claiming beat (18+; reaffirms the
arrangement and honestly counts as a lay of its own), or defiance (his
remaining trust decides whether the arrangement survives at all). */
<div class="cruise-proposition cruise-proposition--jealous">
<div class="cruise-proposition__label"><<= _npc.name>> is your regular - and today you were somebody else's afternoon. He knows. The whole deck knows.</div>
<div class="cruise-proposition__line"><<= formatDialogue(jealousGreeting(_npc.archetype))>></div>
</div>
<div class="cruise-choices">
<div class="btn" data-tip="Words. He takes them, but the arrangement holds a little less warmly than before."><<button "Reassure him">>
<<set _n = getRosterEntry($cruiseRoster, $activeNpcId)>>
<<set _jr = resolveJealousy(_n, 'reassure')>>
<<set $jealousResult = _jr.note>>
<<set $jealousVideo = "">>
<<SpendTime 15>>
<<goto "Ship_JealousScene">>
<</button>></div>
<<set _clmCost = effectiveEnergyCost(15, $cruiseSkills)>>
<<if $player.status.energy.value gte _clmCost>>
<div class="btn" data-tip="Answer him in the only language the «Sirena» respects. Reaffirms the arrangement (trust up), and counts as tonight's company."><<button "Remind him what he is to you">>
<<set _ec = effectiveEnergyCost(15, $cruiseSkills)>>
<<SpendEnergy $player _ec>>
<<set _n = getRosterEntry($cruiseRoster, $activeNpcId)>>
<<run resolveJealousy(_n, 'claim')>>
<<run recordCruiseLay($ship, _n.id)>><<SpendSexStamina>><<run adjustPlayerRep($ship, 2)>>
<<set _cs = jealousClaimScene(_n.gender is "Female")>>
/* The claim is the player taking him (every CLAIM_ACT line has the
player as the hand on the wheel): dom = player's body, pose by
what the regular's body offers. Filter-gated inside the table. */
<<set _dg = $player.gender()>>
<<set _sg = _n.gender>>
<<if _sg is "Female">><<SetVagPick _dg _sg>><<else>><<SetAnalPick _dg _sg>><</if>>
<<set $jealousVideo = _pick>>
<<set $jealousResult = _cs.lead + "<br><br>" + _cs.act + "<br><br>" + _cs.afterglow>>
<<SpendTime 60>>
<<goto "Ship_JealousScene">>
<</button>></div>
<<else>>
<div class="cruise-caged-note">The answer he is really asking for takes more than you have left tonight.</div>
<</if>>
<div class="btn" data-tip="Nobody owns you. If what is left of his trust cannot carry that, the arrangement - and his tribute - dies here."><<button "Tell him he does not own you">>
<<set _n = getRosterEntry($cruiseRoster, $activeNpcId)>>
<<set _jr = resolveJealousy(_n, 'defy')>>
<<set $jealousResult = _jr.note>>
<<set $jealousVideo = "">>
<<SpendTime 10>>
<<goto "Ship_JealousScene">>
<</button>></div>
</div>
<</if>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Cruise/Locations/communal_cabins.jpg">>
<<timed 0.2s>>
<<ShipHead "Settling Up">>
<<if not $betrayer>>
<<goto "Ship_Cabins">>
<<elseif $betrayReaction isnot "">>
<div class="cruise-afterglow"><<= formatDialogue($betrayReaction)>></div>
<div class="btn padding-top"><<button "Leave it there" "Ship_Cabins">><<set $betrayer = null>><<set $betrayReaction = "">><</button>></div>
<<else>>
<<set _bnpc = getRosterEntry($cruiseRoster, $betrayer.id)>>
<<set _bintro = "You run " + $betrayer.name + " down where the rats go to ground, and he knows why you have come before you open your mouth.">>
<<ShipMessage _bintro>>
<<if _bnpc>>
<<set _excuse = betrayalExcuse(_bnpc.archetype)>>
<<ShipMessage _excuse>>
<<else>>
<<ShipMessage "But he has slipped off into the churn of the «Sirena», and you will not get the satisfaction of his face tonight.">>
<</if>>
<div class="cruise-choices">
<div class="btn"><<button "Get in his face">>
<<set $betrayReaction = betrayalReactionText('rage')>>
<<if _bnpc>><<run adjustCruiseStat(_bnpc.stats, "fear", 14)>><<set _bnpc.betrayedYou = "rage">><</if>>
<<goto "Ship_BetrayalScene">>
<</button>></div>
<div class="btn"><<button "Mark him, and walk away cold">>
<<set $betrayReaction = betrayalReactionText('cold')>>
<<if _bnpc>><<run adjustCruiseStat(_bnpc.stats, "fear", 8)>><<set _bnpc.betrayedYou = "cold">><</if>>
<<goto "Ship_BetrayalScene">>
<</button>></div>
<div class="btn"><<button "Let it go - it is what the ship makes of men">>
<<set $betrayReaction = betrayalReactionText('letgo')>>
<<if _bnpc>><<set _bnpc.betrayedYou = "letgo">><</if>>
<<goto "Ship_BetrayalScene">>
<</button>></div>
<<if _bnpc and cruiseNpcBlurb(_bnpc).stage lt 6 and not $ship.caged>>
<div class="btn"><<button "Make him pay in flesh">>
<<set _bn = getRosterEntry($cruiseRoster, $betrayer.id)>>
<<if $gameSettings.contentFilter.nonConsent === true>>
<<set $climaxScene = { pStage: femStage($player), pGender: $player.gender(), nStage: cruiseNpcBlurb(_bn).stage, nGender: _bn.gender, playerPenetrates: true }>>
<<run resolvePlayerSeduction(_bn, { playerFemStage: femStage($player), playerTops: true, persuasionLevel: $cruiseSkills.persuasion }, function () { return 0; })>><<run recordCruiseLay($ship, _bn.id)>><<SpendSexStamina>><<run adjustPlayerRep($ship, 2)>>
<<if femStage($player) gt 0>><<run applyFeminizationStage($player, -1)>><</if>>
<<if _bn>><<set _bn.betrayedYou = "flesh">><</if>>
<<goto "Ship_BetrayalFlesh">>
<<else>>
<<set $betrayReaction = "You weigh taking it out of his hide - but that is non-consensual content, switched off in your settings, so you settle for a cold promise instead. To play scenes like this, enable \"Non-consensual content (18+)\" in Settings.">>
<<if _bn>><<set _bn.betrayedYou = "cold">><</if>>
<<goto "Ship_BetrayalScene">>
<</if>>
<</button>></div>
<</if>>
</div>
<</if>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Cruise/Locations/communal_cabins.jpg">>
<<timed 0.2s>>
<<ShipHead "Settling Up">>
<<if not $betrayer>>
<<goto "Ship_Cabins">>
<<else>>
<<set _bn = getRosterEntry($cruiseRoster, $betrayer.id)>>
/* Bodies were snapshotted before the transfer in Ship_BetrayalScene, so the
betrayer is shown as he was during the act (player tops, dom = player).
The fallback reads the live roster entry - $betrayer itself carries only
{ id, name }, so it never has a gender to offer. */
<<set _sc = $climaxScene || { pStage: femStage($player), pGender: $player.gender(), nStage: (_bn ? cruiseNpcBlurb(_bn).stage : 0), nGender: (_bn ? _bn.gender : "Male") }>>
<<set $climaxScene = null>>
<<set _fl = betrayalFleshScene(true)>>
<<ShipMessage _fl.intro>>
<<set _dg = _sc.pGender>>
<<set _sg = _sc.nGender>>
<<set _pose = (_sg is "Female") ? "Vag" : "Anal">>
<<set _cb = cruiseClimaxBeats((_bn ? _bn.archetype : "predator"), true, _pose, { playerGains: true })>>
<<ShipMessage _cb.oralBeat>>
/* A fully-feminized (Female) player topping a Shemale betrayer has no plain
oral clip (Female|Shemale Oral is disabled), so fall back to the strap-to-face
beat the way the cum beat below falls back - no blank video. */
<<SetOralPick _dg _sg>><<if _pick is "">><<SetStrapFacePick _dg _sg>><</if>><<Video _pick>>
<<ShipMessage _cb.penBeat>>
<<if _sg is "Female">><<SetVagPick _dg _sg>><<else>><<SetAnalPick _dg _sg>><</if>><<Video _pick>>
<<ShipMessage _cb.cumBeat>>
<<if _sg is "Female">><<if _cb.cumIn>><<SetVagCumInPick _dg _sg>><<else>><<SetVagCumOutPick _dg _sg>><</if>><<else>><<if _cb.cumIn>><<SetAnalCumInPick _dg _sg>><<else>><<SetAnalCumOutPick _dg _sg>><</if>><</if>>
<<if _pick is "">><<if _sg is "Female">><<SetVagPick _dg _sg>><<else>><<SetAnalPick _dg _sg>><</if>><</if>><<Video _pick>>
<div class="cruise-afterglow"><<= formatDialogue(_fl.afterglow)>></div>
<div class="btn padding-top"><<button "Leave him there" "Ship_Cabins">><<set $betrayer = null>><<set $betrayReaction = "">><</button>></div>
<</if>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Cruise/Locations/lower_deck.jpg">>
<<timed 0.2s>>
<<ShipHead "Through the Gap">>
<<run unlockCruiseAchievement("voyeurWatch")>>
/* E3: if a real hunt is in progress aboard (a hunter fixed on its mark in the sim),
the voyeur surfaces THAT pair with media routed by their actual bodies, behind the
consent gate. Otherwise the generic prose voyeur pool. */
<<set _pred = peepablePredation($cruiseRoster)>>
<<if _pred and $gameSettings.contentFilter.nonConsent === true>>
<<set _vintro = "Through the gap it is no stranger tonight but " + _pred.hunterName + ", working " + _pred.preyName + " over in the dark - the same hunt you have watched circle the decks for days, finally run to ground.">>
<<ShipMessage _vintro>>
<<set _vpose = (_pred.preyGender is "Female") ? "Vag" : "Anal">>
<<SetOralPick _pred.hunterGender _pred.preyGender>><<Video _pick>>
<<if _vpose is "Vag">><<SetVagPick _pred.hunterGender _pred.preyGender>><<else>><<SetAnalPick _pred.hunterGender _pred.preyGender>><</if>><<Video _pick>>
<<if _vpose is "Vag">><<SetVagCumInPick _pred.hunterGender _pred.preyGender>><<else>><<SetAnalCumInPick _pred.hunterGender _pred.preyGender>><</if>><<if _pick is "">><<if _vpose is "Vag">><<SetVagPick _pred.hunterGender _pred.preyGender>><<else>><<SetAnalPick _pred.hunterGender _pred.preyGender>><</if>><</if>><<Video _pick>>
<<set _vafter = _pred.preyName + " will be a stage softer by morning, and neither he nor " + _pred.hunterName + " knows you watched the «Sirena» take another inch of a man in the dark. You did. It settles in you like a swallowed stone.">>
<div class="cruise-afterglow"><<= formatDialogue(_vafter)>></div>
<<if ($ship.corr || 0) lt 6 and ($ship.corr || 0) lt femStage($player)>><<set $ship.corr = ($ship.corr || 0) + 1>><</if>>
<<else>>
<<set _v = voyeurScene()>>
<<ShipMessage _v.setup>>
<<if not _v.explicit or $gameSettings.contentFilter.nonConsent === true>>
<<ShipMessage _v.payoff>>
<<if ($ship.corr || 0) lt 6 and ($ship.corr || 0) lt femStage($player)>>
<<set $ship.corr = ($ship.corr || 0) + 1>>
<div class="cruise-caged-note">Watching costs you something - you sink a little further into it.</div>
<</if>>
<<else>>
<<ShipMessage "What you are watching through the gap is non-consensual content, switched off in your settings. You pull back before it goes any further, and catch only the shape of it.">>
<div class="cruise-caged-note">To play scenes like this, enable "Non-consensual content (18+)" in Settings. It is off by default.</div>
<</if>>
<</if>>
<<if random(1, 100) lte 18>>
<<set _vcaught = Math.min($player.money, 30)>>
<<set $player.money = $player.money - _vcaught>>
<<set _vcaughtMsg = "A throat clears behind you. A steward has been watching you watch, and the «Sirena» fines curiosity like everything else - " + _vcaught + " chips, and a look that says he will remember your face.">>
<<ShipMessage _vcaughtMsg>>
<</if>>
<div class="btn padding-top"><<button "Pull away from the gap" "Ship_LowerDeck">><</button>></div>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Cruise/Locations/upper_deck.jpg">>
<<timed 0.2s>>
<<ShipHead "Upper Deck">>
<<ShipDeckIntro>>
<<ShipDrawEvent "Ship_UpperDeck">>
<div class="grid-row-twice">
<fieldset>
<legend>Ship</legend>
<<ShipDeckMap>>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="cruise-actions">
<div class="cruise-actgroup cruise-actgroup--rest"><div class="cruise-actgroup__head">Pass the time</div><div class="btn-container">
<<EachActions>>
</div></div>
<div class="cruise-actgroup cruise-actgroup--deck"><div class="cruise-actgroup__head">Around the deck</div><div class="btn-container">
<div class="btn"><<button "Stand at the rail">><<SpendTime 15>><<goto "Ship_Rail">><</button>></div>
<<ShipEventCTA "Ship_UpperDeck">>
</div></div>
</div>
</fieldset>
</div>
<<ShipPeople>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Cruise/Locations/upper_deck.jpg">>
<<timed 0.2s>>
<<ShipHead "At the Rail">>
<div class="cruise-reflection"><<= playerReflection(femStage($player), ($ship.corr || 0))>></div>
<<set _bodynote = playerBodyNote(femStage($player), $player.gender())>>
<<if _bodynote isnot "">><div class="cruise-reflection cruise-reflection--body"><<= _bodynote>></div><</if>>
<div class="cruise-choices">
<div class="btn"><<button "Step back from the rail" "Ship_UpperDeck">><</button>></div>
</div>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Cruise/Locations/lower_deck.jpg">>
<<timed 0.2s>>
<<ShipHead "Lower Deck">>
<<ShipDeckIntro>>
<div class="grid-row-twice">
<fieldset>
<legend>Ship</legend>
<<ShipDeckMap>>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="cruise-actions">
<<set _vday = getVoyageProgress().day>>
<<if not $ship.eventPicked>>
<<set $ship.eventPicked = true>>
<<set $ship.event = pickCruiseEvent({ day: _vday, femStage: femStage($player), corr: ($ship.corr || 0), deck: "*", theme: voyageTheme($ship.boardDay).key, eventBoost: liveDirectorNudges().eventBoost, mercyChance: liveDirectorNudges().mercyChance })>>
<<set $ship.eventReturn = ($ship.event and $ship.event.deck) ? $ship.event.deck : "Ship_LowerDeck">>
<</if>>
<div class="cruise-actgroup cruise-actgroup--rest"><div class="cruise-actgroup__head">Pass the time</div><div class="btn-container">
<<EachActions>>
</div></div>
<div class="cruise-actgroup cruise-actgroup--deck"><div class="cruise-actgroup__head">Around the deck</div><div class="btn-container">
/* Sleep-reset flag, not the civil day - a midnight <<Wait>> must not
re-arm the watch (project midnight-roll rule). */
<<if not $ship.voyeurDone>>
<div class="btn"><<button "Find a gap to watch through">><<set $ship.voyeurDone = true>><<goto "Ship_Voyeur">><</button>></div>
<</if>>
<<if femStage($player) gte 6>>
<div class="btn"><<button "The crew has work for you">><<goto "Ship_CrewUse">><</button>></div>
<</if>>
</div></div>
<div class="cruise-actgroup cruise-actgroup--floor"><div class="cruise-actgroup__head">On the floor</div><div class="btn-container">
<<if $ship.event and $ship.eventReturn === "Ship_LowerDeck">>
<div class="btn"><<button "Something is happening below...">><<set $ship.eventResult = "">><<goto "Ship_CruiseEvent">><</button>></div>
<</if>>
/* Sleep-reset flag, not the civil day (midnight-roll rule). */
<<if not $ship.brandtWatchDone>>
<div class="btn"><<button "Brandt is running his watch">><<set $ship.brandtWatchDone = true>><<goto "Ship_BrandtBeat">><</button>></div>
<</if>>
<<if voyageStage(_vday, getVoyageProgress().total) === "final" and isFullyFallen(femStage($player), $ship.corr) === false>>
<<if not $ship.labyrinthDone>>
<div class="btn"><<button "Follow the chalk arrows to the wreckmaster's maze">><<set $labyrinth = null>><<set $labMsg = "">><<goto "Ship_Labyrinth">><</button>></div>
<<else>>
<div class="cruise-people__empty">The hatch to the wreckmaster's maze is chained until the rows re-arm - one walk a day is all the bilge sells.</div>
<</if>>
<</if>>
</div></div>
</div>
</fieldset>
</div>
<<ShipPeople>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Cruise/Locations/restroom.jpg">>
<<timed 0.2s>>
<<ShipHead "Restroom">>
<<ShipDeckIntro>>
<<ShipDrawEvent "Ship_Restroom">>
<div class="grid-row-twice">
<fieldset>
<legend>Ship</legend>
<<ShipDeckMap>>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="cruise-actions">
<div class="cruise-actgroup cruise-actgroup--rest"><div class="cruise-actgroup__head">Pass the time</div><div class="btn-container">
<<EachActions>>
</div></div>
<<set _vday = getVoyageProgress().day>>
<div class="cruise-actgroup cruise-actgroup--deck"><div class="cruise-actgroup__head">Around the deck</div><div class="btn-container">
<div class="btn"><<button "Check yourself in the mirror">><<SpendTime 10>><<goto "Ship_Mirror">><</button>></div>
/* Spend the tank by hand (cruiseStamina, plan item 8): a stall, fifteen
minutes, one point of the day's sex stamina - and a chance of company. */
<<if $ship.caged and $player.genitalia() is "Penis">>
<div class="cruise-caged-note">The cage sits snug around your cock. Whatever the day's tank demands, your own hand is off the table.</div>
<<elseif $player.status.potency.value gt $player.status.potency.min>>
<div class="btn"><<button "Slip into a stall and take yourself in hand">>
<<SpendSexStamina>><<SpendTime 15>>
<<run $player.status.horny.decrease(40)>>
<<set $wankCaught = playerWankCaught($cruiseRoster)>>
<<goto "Ship_ToiletJerk">>
<</button>></div>
<<else>>
<div class="cruise-people__empty">Your tank is spent for the day; the stall holds nothing you still need.</div>
<</if>>
/* Walking in on an unspent contestant mid-stroke (once a day). */
<<if not $ship.wankSceneDone>>
<<set _wank = restroomWanker($cruiseRoster, $dateTime.hours)>>
<<if _wank>>
<<set _wcta = "A stall door hangs ajar - someone is in there, and he is not using the plumbing">>
<div class="cruise-suitor-cta"><div class="btn"><<button _wcta>><<set $activeNpcId = _wank.id>><<set $wankResult = "">><<set $ship.wankSceneDone = true>><<goto "Ship_CaughtWanker">><</button>></div></div>
<</if>>
<</if>>
/* The cage only matters to a body that still has a cock in it - a
stage-6 body with a vagina works the stall regardless (same
qualifier as the stall-jerk and maid gates). */
<<if femStage($player) gte 4 and not ($ship.caged and $player.genitalia() is "Penis")>>
<<if not $ship.gloryDone>>
<<set _ghCost = effectiveEnergyCost(20, $cruiseSkills)>>
<<if $player.status.energy.value gte _ghCost>>
<div class="btn"><<button "Kneel at the gloryhole">>
<<set $ship.gloryDone = true>><<set $ship.gloryLong = false>><<SpendSexStamina>><<set _ec = effectiveEnergyCost(20, $cruiseSkills)>><<SpendEnergy $player _ec>><<SpendTime 45>><<goto "Ship_Gloryhole">>
<</button>></div>
<<set _ghLongCost = effectiveEnergyCost(35, $cruiseSkills)>>
<<if $player.status.energy.value gte _ghLongCost>>
<div class="btn"><<button "Work the stall until the line dies">>
<<set $ship.gloryDone = true>><<set $ship.gloryLong = true>><<SpendSexStamina>><<set _ecl = effectiveEnergyCost(35, $cruiseSkills)>><<SpendEnergy $player _ecl>><<SpendTime 150>><<goto "Ship_Gloryhole">>
<</button>></div>
<</if>>
<<else>>
<div class="cruise-caged-note">Too worn out to kneel here right now.</div>
<</if>>
<<else>>
<div class="cruise-people__empty">You have worked the stall once today; there is nothing left in you for the line.</div>
<</if>>
<<elseif $ship.caged and $player.genitalia() is "Penis">>
<div class="cruise-caged-note">Caged as you are, the stall has nothing for you.</div>
<<else>>
<div class="cruise-people__empty">A grimy stall with a hole worked into the partition. Nothing here for you - yet.</div>
<</if>>
<<ShipEventCTA "Ship_Restroom">>
</div></div>
</div>
</fieldset>
</div>
<<ShipPeople>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Cruise/Locations/restroom.jpg">>
<<timed 0.2s>>
<<ShipHead "A Stall of Your Own">>
/* Solo clip by the player's body - same pools and no pair-filter gate as the
city Jerk_off (contentFilter governs pairs, not the player's own hand). */
<<switch $player.gender()>>
<<case "Male">>
<<set _pick = 'Media\\Sex\\JerkOff\\Male\\' + Random(0, 6, false) + '.mp4'>>
<<case "Female">>
<<set _pick = 'Media\\Sex\\JerkOff\\Female\\' + Random(0, 8, false) + '.mp4'>>
<<case "Shemale">>
<<set _pick = 'Media\\Sex\\JerkOff\\Shemale\\0.mp4'>>
<</switch>>
<<Video _pick>>
<<if $player.genitalia() is "Penis">>
<<ShipMessage "You bolt the stall door, get your cock out and work yourself with the brisk, joyless economy the «Sirena» teaches - this is not pleasure, it is bookkeeping. You cum into the bowl, breathe, and feel the day's tank drop below full: whatever else the boat takes tonight, the rot will not collect on that.">>
<<else>>
<<ShipMessage "You bolt the stall door, hike up and get two fingers into your cunt, grinding the heel of your hand where it counts. The «Sirena» has made this arithmetic too: you ride your own hand until you cum, biting your sleeve quiet, and the day's tank drops below full - the rot will not collect on that tonight.">>
<</if>>
<<if $wankCaught>>
<div class="cruise-event"><div class="cruise-event__result"><<= $wankCaught.line>></div></div>
<<run adjustPlayerRep($ship, -2)>>
<<set $wankCaught = null>>
<</if>>
<div class="btn padding-top"><<button "Straighten up and step out" "Ship_Restroom">><</button>></div>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Cruise/Locations/restroom.jpg">>
<<timed 0.2s>>
<<ShipHead "Someone Else's Arithmetic">>
<<set _npc = getRosterEntry($cruiseRoster, $activeNpcId)>>
<<if not _npc>>
<<ShipMessage "The stall is empty by the time you look - just a swinging door and the smell of bleach.">>
<div class="btn padding-top"><<button "Step back out" "Ship_Restroom">><</button>></div>
<<elseif ($wankResult || "") isnot "">>
<div class="cruise-event"><div class="cruise-event__result"><<= formatDialogue($wankResult)>></div></div>
<div class="btn padding-top"><<button "Leave him to it" "Ship_Restroom">><<set $wankResult = "">><</button>></div>
<<else>>
/* Bareword function calls are not evaluated as macro args - prebuild. */
<<set _tableau = wankerTableau(_npc)>>
/* The mid-stroke clip matches the body the tableau describes (roster gender
is body-aware). Solo clips, but gated on the player-NPC pair like the
alley gloryhole - the "lend a hand" option makes this a pair scene. */
<<switch _npc.gender>>
<<case "Male">>
<<set _pick = 'Media\\Sex\\JerkOff\\Male\\' + Random(0, 6, false) + '.mp4'>>
<<case "Female">>
<<set _pick = 'Media\\Sex\\JerkOff\\Female\\' + Random(0, 8, false) + '.mp4'>>
<<case "Shemale">>
<<set _pick = 'Media\\Sex\\JerkOff\\Shemale\\0.mp4'>>
<<default>>
<<set _pick = "">>
<</switch>>
<<if _pick isnot "" and CheckContentFilter(_npc.gender)>><<Video _pick>><</if>>
<<ShipMessage _tableau>>
<div class="cruise-choices">
<div class="btn" data-tip="Stay quiet and watch. If he never notices, he finishes; some men notice and bolt - and some perform."><<button "Watch from the doorway">>
<<set _out = caughtWankerOutcome(_npc, "watch")>>
<<run $player.status.horny.increase(15)>>
<<set $wankResult = _out.line>>
<<SpendTime 10>>
<<goto "Ship_CaughtWanker">>
<</button>></div>
<div class="btn" data-tip="Make sure he knows he was seen. Shame and fear, and the story will travel - but he leaves unfinished."><<button "Announce yourself">>
<<set _out = caughtWankerOutcome(_npc, "announce")>>
<<set $wankResult = _out.line>>
<<SpendTime 5>>
<<goto "Ship_CaughtWanker">>
<</button>></div>
<<if $player.status.energy.value gte 10 and $player.status.potency.value gt $player.status.potency.min>>
<div class="btn" data-tip="Step in and finish him yourself. Costs a point of your own tank; buys real trust."><<button "Lend him a hand">>
<<set _out = caughtWankerOutcome(_npc, "help")>>
<<SpendSexStamina>>
<<SpendEnergy $player 10>>
<<run recordCruiseLay($ship, _npc.id)>>
<<set $wankResult = _out.line>>
<<SpendTime 20>>
<<goto "Ship_CaughtWanker">>
<</button>></div>
<</if>>
<div class="btn"><<button "Back out quietly">>
<<set _out = caughtWankerOutcome(_npc, "leave")>>
<<set $wankResult = _out.line>>
<<goto "Ship_CaughtWanker">>
<</button>></div>
</div>
<</if>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Cruise/Locations/restroom.jpg">>
<<timed 0.2s>>
<<ShipHead "The Mirror">>
<<set _bn = playerBodyNote(femStage($player), $player.gender())>>
<<if _bn isnot "">>
<div class="cruise-reflection cruise-reflection--body"><<= _bn>></div>
<<else>>
<div class="cruise-reflection cruise-reflection--body">You find your own face in the spotted glass and hold it a moment. Still yours, for now - the «Sirena» has not started on you yet. A man with ten days to get clear. You try to believe him.</div>
<</if>>
<<if ($mirrorMsg || "") isnot "">><div class="cruise-event"><div class="cruise-event__result"><<= formatDialogue($mirrorMsg)>></div></div><<set $mirrorMsg = "">><</if>>
<div class="cruise-choices">
<<set _cos = [{ id: "lipstick", line: "You work the lipstick on in the spotted glass, slow, the way you have watched women do it without ever meaning to learn. It suits the face the «Sirena» has been building. That is the part that stays with you." }, { id: "makeup_kit", line: "You sit with the kit and do the whole thing - eyes, cheeks, mouth - and the man who boarded gets a little harder to find in the glass. You are getting good at this. You decide not to wonder when that happened." }, { id: "lingerie", line: "You change into the lingerie in the privacy of the stall. It fits the body the «Sirena» gave you better than anything you packed. You catch yourself turning to find the line of it, and stop, and turn back anyway." }]>>
<<for _cm range _cos>>
<<capture _cm>>
<<if ($cruiseInventory[_cm.id] || 0) gt 0>>
<<set _it = getCruiseItem(_cm.id)>>
<<set _mlbl = "Put on the " + (_it ? _it.name.toLowerCase() : _cm.id)>>
<div class="btn"><<button _mlbl>>
<<set $cruiseInventory[_cm.id] = $cruiseInventory[_cm.id] - 1>>
<<set $ship.groomed = true>>
<<set $mirrorMsg = _cm.line>>
<<goto "Ship_Mirror">>
<</button>></div>
<</if>>
<</capture>>
<</for>>
<<if $ship.disguised>>
<div class="btn"><<button "Shed the disguise">><<set $ship.disguised = false>><<set $mirrorMsg = "You strip off the borrowed crew look. Just another marked guest in the glass again.">><<goto "Ship_Mirror">><</button>></div>
<</if>>
<<if $ship.groomed>><div class="cruise-actnote">You have made of yourself what you can with what the «Sirena» left you.</div><</if>>
<div class="btn"><<button "Step back" "Ship_Restroom">><</button>></div>
</div>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Cruise/Locations/restroom.jpg">>
<<timed 0.2s>>
<<ShipHead "The Stall">>
<<set _dg = "Male">>
<<set _sg = $player.gender()>>
<<set _long = !!$ship.gloryLong>>
<<set _pay = _long ? 170 : 70>>
<<set _gh = _long ? gloryholeLongScene(_pay) : gloryholeScene(_pay)>>
<<ShipMessage _gh.setup>>
<<set _ghbody = gloryholeBodyLine(femStage($player), $player.gender())>>
<<ShipMessage _ghbody>>
/* Each clip is one stranger and the player, so the line directly above it names that
one man (_gh.first / next / cum); the line and the queue stay in the setup, the
body beat, the long shift's middle and the afterglow. */
<<ShipMessage _gh.first>>
<<SetOralPick _dg _sg>><<Video _pick>>
<<if _long>>
<<ShipMessage _gh.middle>>
<<ShipMessage _gh.next>>
<<SetOralPick _dg _sg>><<Video _pick>>
<</if>>
<<ShipMessage _gh.cum>>
<<SetOralCumInPick _dg _sg>><<Video _pick>>
/* E4: a breasted player gets put to the otherwise-unused titfuck media (the resolver
coerces the sub to Female). Gated at stage 4 - always true at the stall. */
<<if femStage($player) gte 4>>
<<set _tfbeat = "Then one man decides your mouth is not the only use you are good for - he pulls you up by the shoulders and puts your breasts to work around his cock instead. You let him. The «Sirena» built the things for this as much as anything else.">>
<<ShipMessage _tfbeat>>
<<SetTitfuckPic _dg _sg>><<Video _pick>>
<<set _tfcum = "He cums across your tits in thick ropes, some of it reaching your chin, and is gone without a word.">>
<<ShipMessage _tfcum>>
<<SetTitfuckCumPic _dg _sg>><<Video _pick>>
<</if>>
<<set $player.money = $player.money + _pay>>
<<if ($ship.corr || 0) lt 6 and ($ship.corr || 0) lt femStage($player)>><<set $ship.corr = ($ship.corr || 0) + 1>><</if>>
<div class="cruise-afterglow"><<= formatDialogue(_gh.afterglow)>></div>
<div class="btn padding-top"><<button "Clean up and leave" "Ship_Restroom">><</button>></div>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Cruise/Locations/main_hall.jpg">>
<<timed 0.2s>>
<<ShipHead "Settling Up">>
<<set _wk = ($wagerScene and $wagerScene.kind) ? $wagerScene.kind : "feminization">>
<<set _wn = ($wagerScene and $wagerScene.npcName) ? $wagerScene.npcName : "The winner">>
<<set _wc = wagerCollectionScene(_wk, _wn, femStage($player), $player.gender())>>
<<ShipMessage _wc.lead>>
<<ShipMessage _wc.act>>
<<if _wc.explicit>>
<<set _dg = ($wagerScene and $wagerScene.npcGender) ? $wagerScene.npcGender : "Male">>
<<set _sg = $player.gender()>>
<<SetOralPick _dg _sg>><<Video _pick>>
<<SetOralCumInPick _dg _sg>><<Video _pick>>
<</if>>
<div class="cruise-afterglow"><<= formatDialogue(_wc.afterglow)>></div>
<div class="btn padding-top"><<button "Back to the hall" "Ship_MainHall">><<set $wagerScene to null>><</button>></div>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Cruise/Locations/bridge.jpg">>
<<timed 0.2s>>
<<ShipHead "Bridge">>
<<ShipDeckIntro>>
<div class="grid-row-twice">
<fieldset>
<legend>Ship</legend>
<<ShipDeckMap>>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="cruise-actions">
<div class="cruise-actgroup cruise-actgroup--rest"><div class="cruise-actgroup__head">Pass the time</div><div class="btn-container">
<<EachActions>>
</div></div>
<div class="cruise-actgroup cruise-actgroup--deck"><div class="cruise-actgroup__head">Around the deck</div><div class="btn-container">
<<if isNightHour($dateTime.hours)>>
<<if not $ship.searchDone>>
<div class="btn"><<button "Search the bridge (night)">>
<<set $ship.searchDone = true>><<set $nightResult = resolveNightSearch({ stealth: $cruiseSkills.stealth, lockpick: $cruiseSkills.lockpick, disguised: $ship.disguised, patrolBonus: themeHooks(voyageTheme($ship.boardDay).key).patrolGuards, baseHaul: 200 })>>
<<if $nightResult.caught>><<set _pen = caughtPenalty($player.money, $ship.loan)>><<set $player.money = $player.money - _pen.chipsLost>><<set $nightResult.chipsLost = _pen.chipsLost>><<run adjustPlayerRep($ship, -3)>><<else>><<set $player.money = $player.money + $nightResult.haul>><<if $nightResult.material>><<set $cruiseInventory[$nightResult.material] = ($cruiseInventory[$nightResult.material] || 0) + 1>><</if>><</if>>
<<SpendTime 45>><<goto "Ship_NightSearch">>
<</button>></div>
<<else>>
<div class="cruise-people__empty">You have already risked one search tonight; chance a second room before the watch turns over and they will have you. The rest keeps until tomorrow's dark.</div>
<</if>>
<<else>>
<div class="cruise-people__empty">Brandt's watch holds the bridge through the day. The hatch only goes quiet after dark - or for a guest the guard has some reason to wave through.</div>
<</if>>
</div></div>
</div>
</fieldset>
</div>
<<ShipPeople>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Cruise/Locations/radio_room.jpg">>
<<timed 0.2s>>
<<ShipHead "Radio Room">>
<<ShipDeckIntro>>
<div class="grid-row-twice">
<fieldset>
<legend>Ship</legend>
<<ShipDeckMap>>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="cruise-actions">
<div class="cruise-actgroup cruise-actgroup--rest"><div class="cruise-actgroup__head">Pass the time</div><div class="btn-container">
<<EachActions>>
</div></div>
<div class="cruise-actgroup cruise-actgroup--deck"><div class="cruise-actgroup__head">Around the deck</div><div class="btn-container">
<<if isNightHour($dateTime.hours)>>
<<if not $ship.searchDone>>
<div class="btn"><<button "Search the radio room (night)">>
<<set $ship.searchDone = true>><<set $nightResult = resolveNightSearch({ stealth: $cruiseSkills.stealth, lockpick: $cruiseSkills.lockpick, disguised: $ship.disguised, patrolBonus: themeHooks(voyageTheme($ship.boardDay).key).patrolGuards, baseHaul: 160 })>>
<<if $nightResult.caught>><<set _pen = caughtPenalty($player.money, $ship.loan)>><<set $player.money = $player.money - _pen.chipsLost>><<set $nightResult.chipsLost = _pen.chipsLost>><<run adjustPlayerRep($ship, -3)>><<else>><<set $player.money = $player.money + $nightResult.haul>><<if $nightResult.material>><<set $cruiseInventory[$nightResult.material] = ($cruiseInventory[$nightResult.material] || 0) + 1>><</if>><</if>>
<<SpendTime 45>><<goto "Ship_NightSearch">>
<</button>></div>
<<else>>
<div class="cruise-people__empty">You have already risked one search tonight; chance a second room before the watch turns over and they will have you. The rest keeps until tomorrow's dark.</div>
<</if>>
<<else>>
<div class="cruise-people__empty">A crewman leans by the radio-room door all day, bored and watchful. After dark the post thins - or a word in the right ear, or a key, opens what the «Sirena» would rather keep shut.</div>
<</if>>
</div></div>
</div>
</fieldset>
</div>
<<ShipPeople>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Cruise/Locations/owner_stateroom.jpg">>
<<timed 0.2s>>
<<ShipHead "Owner's Stateroom">>
<<ShipDeckIntro>>
<div class="grid-row-twice">
<fieldset>
<legend>Ship</legend>
<<ShipDeckMap>>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="cruise-actions">
<div class="cruise-actgroup cruise-actgroup--rest"><div class="cruise-actgroup__head">Pass the time</div><div class="btn-container">
<<EachActions>>
</div></div>
<div class="cruise-actgroup cruise-actgroup--deck"><div class="cruise-actgroup__head">Around the deck</div><div class="btn-container">
<<if isNightHour($dateTime.hours)>>
<<if not $ship.searchDone>>
<div class="btn"><<button "Rifle the stateroom (night)">>
<<set $ship.searchDone = true>><<set $nightResult = resolveNightSearch({ stealth: $cruiseSkills.stealth, lockpick: $cruiseSkills.lockpick, disguised: $ship.disguised, patrolBonus: themeHooks(voyageTheme($ship.boardDay).key).patrolGuards, baseHaul: 300 })>>
<<if $nightResult.caught>><<set _pen = caughtPenalty($player.money, $ship.loan)>><<set $player.money = $player.money - _pen.chipsLost>><<set $nightResult.chipsLost = _pen.chipsLost>><<run adjustPlayerRep($ship, -3)>><<else>><<set $player.money = $player.money + $nightResult.haul>><<if $nightResult.material>><<set $cruiseInventory[$nightResult.material] = ($cruiseInventory[$nightResult.material] || 0) + 1>><</if>><</if>>
<<SpendTime 45>><<goto "Ship_NightSearch">>
<</button>></div>
<<else>>
<div class="cruise-people__empty">You have already risked one search tonight; chance a second room before the watch turns over and they will have you. The rest keeps until tomorrow's dark.</div>
<</if>>
<<else>>
<div class="cruise-people__empty">Vane's stateroom stays locked and guarded while he holds court below. Only the dead of night, when the owner sleeps and the watch is thin, gives you any chance at that door.</div>
<</if>>
</div></div>
</div>
</fieldset>
</div>
<<ShipPeople>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Cruise/Locations/engine_room_hold.jpg">>
<<timed 0.2s>>
<<ShipHead "Engine Room">>
<<ShipDeckIntro>>
<<ShipDrawEvent "Ship_EngineRoom">>
<div class="grid-row-twice">
<fieldset>
<legend>Ship</legend>
<<ShipDeckMap>>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="cruise-actions">
<div class="cruise-actgroup cruise-actgroup--rest"><div class="cruise-actgroup__head">Pass the time</div><div class="btn-container">
<<EachActions>>
</div></div>
<div class="cruise-actgroup cruise-actgroup--deck"><div class="cruise-actgroup__head">Around the deck</div><div class="btn-container">
<div class="btn"><<button "Use the workbench">><<set $craftMsg = "">><<goto "Ship_Crafting">><</button>></div>
<<ShipEventCTA "Ship_EngineRoom">>
</div></div>
</div>
</fieldset>
</div>
<<ShipPeople>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Cruise/Locations/galley.jpg">>
<<timed 0.2s>>
<<ShipHead "Galley">>
<<ShipDeckIntro>>
<<ShipDrawEvent "Ship_Galley">>
<div class="grid-row-twice">
<fieldset>
<legend>Ship</legend>
<<ShipDeckMap>>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="cruise-actions">
<div class="cruise-actgroup cruise-actgroup--rest"><div class="cruise-actgroup__head">Pass the time</div><div class="btn-container">
<<EachActions>>
</div></div>
<div class="cruise-actgroup cruise-actgroup--deck"><div class="cruise-actgroup__head">Around the deck</div><div class="btn-container">
<div class="btn"><<button "Find the quartermaster">><<set $shopMsg = "">><<goto "Ship_Shop">><</button>></div>
<<set _vday = getVoyageProgress().day>>
<<if not $ship.galleyTakeDone>>
<div class="btn"><<button "Swipe a ration from the galley">>
<<set $ship.galleyTakeDone = true>>
<<set $cruiseInventory["food_ration"] = ($cruiseInventory["food_ration"] || 0) + 1>>
<<run UI.alert("You pocket a sealed food ration while the cook's back is turned.")>>
<<SpendTime 15>><<goto "Ship_Galley">>
<</button>></div>
<<else>>
<div class="cruise-people__empty">You've already lifted a ration today; pushing it would draw eyes.</div>
<</if>>
<<ShipEventCTA "Ship_Galley">>
</div></div>
</div>
</fieldset>
</div>
<<ShipPeople>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Cruise/Locations/main_hall.jpg">>
<<timed 0.2s>>
<<ShipHead "Restricted RPS">>
<div class="rps-table rps-game">
<img class="rps-deck-banner" src="Media/Cruise/Items/rps_cards.jpg" alt="Rock, scissors and paper - the three cards of the game">
<div class="rps-vs">You vs <<= $rps.npcName>></div>
<<if ($tableTaste || "") isnot "">><div class="rps-banter cruise-table-taste"><<= $tableTaste>></div><</if>>
<div class="rps-chips">
<span>Your chips: <b><<= $rps.playerChips>></b></span>
<span>Pot: <b><<= $rps.pot>></b></span>
<span><<= $rps.npcName>>: <b><<= $rps.npcChips>></b></span>
</div>
<div class="rps-bet">Ante per round: <<= $rps.bet>> · Round <<= $rps.round>></div>
<<if ($ship.riggedRounds || 0) gt 0>><div class="rps-reveal"><span class="rps-win">Rigged - the next <<= $ship.riggedRounds>> round(s) fall your way.</span></div><</if>>
<<if $rps.last>>
<<set _pcImg = "Media/Cruise/Items/rps_" + $rps.last.playerCard.toLowerCase() + "_card.png">>
<<set _ncImg = "Media/Cruise/Items/rps_" + $rps.last.npcCard.toLowerCase() + "_card.png">>
<<set _playedCls = "rps-played rps-played--" + $rps.last.outcome>>
<<set _pSideCls = "rps-played__side" + ($rps.last.outcome === "win" ? " is-winner" : ($rps.last.outcome === "lose" ? " is-loser" : ""))>>
<<set _nSideCls = "rps-played__side" + ($rps.last.outcome === "lose" ? " is-winner" : ($rps.last.outcome === "win" ? " is-loser" : ""))>>
<div @class="_playedCls">
<div @class="_pSideCls">
<span class="rps-played__frame"><img class="rps-played__img" @src="_pcImg" @alt="$rps.last.playerCard"></span>
<span class="rps-played__who">You</span>
</div>
<span class="rps-played__vs">vs</span>
<div @class="_nSideCls">
<span class="rps-played__frame"><img class="rps-played__img" @src="_ncImg" @alt="$rps.last.npcCard"></span>
<span class="rps-played__who"><<= $rps.npcName>></span>
</div>
</div>
<div class="rps-reveal">
You played <b><<= $rps.last.playerCard>></b>, they played <b><<= $rps.last.npcCard>></b> -
<<if $rps.last.outcome === "win">><span class="rps-win">you take the pot (+<<= $rps.last.potWon>>)</span><<elseif $rps.last.outcome === "lose">><span class="rps-lose">they take the pot</span><<else>><span class="rps-draw">draw - pot carries over</span><</if>>
</div>
<<set _bopp = getRosterEntry($cruiseRoster, $rps.npcId)>>
<<if _bopp and not $rps.over and random(1, 100) lte 60>>
<div class="rps-banter">"<<= rpsTableTalk(_bopp.archetype, $rps.last.outcome)>>"</div>
<</if>>
<</if>>
<<if $rps.over>>
<<if $rps.dignity and not $rps.dignityResolved>>
<<set _mnet = rpsSessionResult($rps).net>>
<<set _dwres = resolveDignityWager($rps.dignity, _mnet, $rps.npcChips)>>
<<set $rps.playerChips = $rps.playerChips + _dwres.chipsGained>>
<<set $rps.npcChips = Math.max(0, $rps.npcChips - _dwres.chipsGained)>>
/* Apply the FULL resolver verdict: femStagesLost scales with the wager's
points (corrGained below already does), so a multi-point pledge must not
silently under-apply the body loss. Today points is always 1. */
<<if _dwres.femStagesLost gt 0>><<for _fsl = 0; _fsl lt _dwres.femStagesLost; _fsl++>><<run applyFeminizationStage($player, 1)>><</for>><</if>>
<<if _dwres.corrGained gt 0>><<set $ship.corr = Math.min(6, ($ship.corr || 0) + _dwres.corrGained)>><</if>>
<<set $rps.dignityOutcome = _dwres.outcome>>
<<set $rps.dignityLine = dignityWagerLine(_dwres, $rps.dignity.kind)>>
<<set $rps.dignityResolved = true>>
<</if>>
<<set _net = rpsSessionResult($rps).net>>
<<set _resCls = "rps-result rps-result--" + (_net gt 0 ? "win" : (_net lt 0 ? "lose" : "even"))>>
<div @class="_resCls">
<<if _net gt 0>>You walk away up <b><<= _net>></b> chips.<<elseif _net lt 0>>You walk away down <b><<= Math.abs(_net)>></b> chips.<<else>>You break even.<</if>>
</div>
<<if $rps.dignityResolved>>
<<set _dwCls = "cruise-bodybet-result cruise-bodybet-result--" + $rps.dignityOutcome>>
<div @class="_dwCls"><<= $rps.dignityLine>></div>
<</if>>
<<set _oppEntry = getRosterEntry($cruiseRoster, $rps.npcId)>>
<<if _oppEntry>>
<<set _oppLine = pickCruiseLine(_oppEntry.archetype, (rpsSessionResult($rps).won ? "lose" : "win"), npcMood(_oppEntry))>>
<<ShipMessage _oppLine>>
<</if>>
<<set _leaveLbl = ($rps.dignityOutcome === "lost") ? "Settle up - he collects" : "Leave the table">>
<div class="btn"><<button _leaveLbl>>
<<set $player.money = $rps.playerChips>>
<<set _opp = getRosterEntry($cruiseRoster, $rps.npcId)>>
<<if _opp>><<set _opp.chips = $rps.npcChips>><<set _opp.hand = $rps.npcHand>>
<<if rpsSessionResult($rps).won>><<run adjustCruiseStat(_opp.stats, "fear", 6)>><<run adjustCruiseStat(_opp.stats, "standing", -3)>><<else>><<run adjustCruiseStat(_opp.stats, "standing", 4)>><<run adjustCruiseStat(_opp.stats, "azart", 3)>><</if>>
<</if>>
<<set $cruisePlayerHand = $rps.playerHand>>
<<if rpsSessionResult($rps).won>><<run awardVictoryTokens($cruiseSkills, 1)>><<run unlockCruiseAchievement("firstWin")>><</if>>
<<run recordMatchResult($cruiseDirector, rpsSessionResult($rps).won)>><<run adjustPlayerRep($ship, rpsSessionResult($rps).won ? 2 : -1)>>
/* A WON body pledge echoes further than chips: the deck watched a man
stake flesh against you and lose it. The name gets heavier for it. */
<<if $rps.dignityOutcome === "won">>
<<run adjustPlayerRep($ship, 2)>>
<<if _opp>><<run adjustCruiseStat(_opp.stats, "fear", 4)>><</if>>
<</if>>
/* A lost body pledge is not settled by a line of text: the winner collects
in Ship_WagerCollection. Snapshot what the scene needs before $rps dies. */
<<set _collect = ($rps.dignityOutcome === "lost" and $rps.dignity) ? true : false>>
<<if _collect>><<set $wagerScene = { kind: $rps.dignity.kind, npcName: $rps.npcName, npcGender: (_opp and _opp.gender) ? _opp.gender : "Male" }>><</if>>
<<set $rps to null>>
<<if _collect>><<goto "Ship_WagerCollection">><<else>><<goto "Ship_MainHall">><</if>>
<</button>></div>
<<else>>
<<set _rpsTell = rpsReadTell($rps.npcHand, ($cruiseSkills ? $cruiseSkills.persuasion : 0))>>
<<if _rpsTell isnot "">><div class="rps-reveal"><span class="rps-draw"><<= _rpsTell>></span></div><</if>>
<div class="rps-ante">
<span class="rps-ante__label">Set the ante</span>
<span class="rps-ante__current" title="Current ante per round"><<= $rps.bet>></span>
<div class="btn rps-ante__btn"><<button "-50">><<set $rps.bet = Math.max(50, ($rps.bet || 50) - 50)>><<set $rps.raiseMsg = "">><<goto "Ship_RpsMatch">><</button>></div>
<div class="btn rps-ante__btn"><<button "+50">><<set _cap = Math.max(50, Math.min($rps.playerChips, $rps.npcChips))>><<set _prop = Math.min(_cap, ($rps.bet || 50) + 50)>><<set _rd = cruiseRaiseDecision($rps.npcId, $rps.bet, _prop, $rps.npcChips)>><<if _rd.ok>><<set $rps.bet = _prop>><<set $rps.raiseMsg = "">><<else>><<set $rps.raiseMsg = _rd.message>><</if>><<goto "Ship_RpsMatch">><</button>></div>
<div class="btn rps-ante__btn"><<button "+200">><<set _cap = Math.max(50, Math.min($rps.playerChips, $rps.npcChips))>><<set _prop = Math.min(_cap, ($rps.bet || 50) + 200)>><<set _rd = cruiseRaiseDecision($rps.npcId, $rps.bet, _prop, $rps.npcChips)>><<if _rd.ok>><<set $rps.bet = _prop>><<set $rps.raiseMsg = "">><<else>><<set $rps.raiseMsg = _rd.message>><</if>><<goto "Ship_RpsMatch">><</button>></div>
<div class="btn rps-ante__btn"><<button "Shove">><<set _prop = Math.max(50, Math.min($rps.playerChips, $rps.npcChips))>><<set _rd = cruiseRaiseDecision($rps.npcId, $rps.bet, _prop, $rps.npcChips)>><<if _rd.ok>><<set $rps.bet = _prop>><<set $rps.raiseMsg = "">><<else>><<set $rps.raiseMsg = _rd.message>><</if>><<goto "Ship_RpsMatch">><</button>></div>
</div>
<<if ($rps.raiseMsg || "") isnot "">><div class="rps-banter cruise-raise-refusal"><<= $rps.npcName>>: "<<= $rps.raiseMsg>>"</div><</if>>
<<if $rps.round === 0 and not $rps.dignity>>
<<set _dopt = dignityStakeOptions(femStage($player), ($ship.corr || 0))>>
<<if _dopt.feminization or _dopt.corruption>>
<div class="cruise-bodybet">
<div class="cruise-bodybet__label">Put your body in the pot</div>
<div class="cruise-bodybet__hint">Pledge a mark of your own flesh alongside the chips. Win the match and he covers it; lose and your body pays instead.</div>
<div class="cruise-bodybet__opts">
<<if _dopt.feminization>>
<<set _fv = dignityWagerValue("feminization", 1)>>
<<set _fLbl = 'Stake a feminization stage <span class="cruise-bodybet__val">+' + _fv + '</span>'>>
<div class="btn cruise-bodybet__btn"><<button _fLbl>><<set _prop = ($rps.bet || 50) + _fv>><<set _rd = cruiseRaiseDecision($rps.npcId, $rps.bet, _prop, $rps.npcChips)>><<if _rd.ok>><<set $rps.dignity = { kind: "feminization", points: 1, value: _fv }>><<set $rps.raiseMsg = "">><<else>><<set $rps.raiseMsg = _rd.message>><</if>><<goto "Ship_RpsMatch">><</button>></div>
<</if>>
<<if _dopt.corruption>>
<<set _cv = dignityWagerValue("corruption", 1)>>
<<set _cLbl = 'Stake a point of corruption <span class="cruise-bodybet__val">+' + _cv + '</span>'>>
<div class="btn cruise-bodybet__btn"><<button _cLbl>><<set _prop = ($rps.bet || 50) + _cv>><<set _rd = cruiseRaiseDecision($rps.npcId, $rps.bet, _prop, $rps.npcChips)>><<if _rd.ok>><<set $rps.dignity = { kind: "corruption", points: 1, value: _cv }>><<set $rps.raiseMsg = "">><<else>><<set $rps.raiseMsg = _rd.message>><</if>><<goto "Ship_RpsMatch">><</button>></div>
<</if>>
</div>
</div>
<</if>>
<<elseif $rps.dignity>>
<div class="cruise-bodybet is-pledged">
<div class="cruise-bodybet__label">Your body is in the pot</div>
<div class="cruise-bodybet__hint"><<if $rps.dignity.kind === "feminization">>A stage of your masculinity<<else>>A point of your nerve<</if>> rides on this match, worth <span class="cruise-bodybet__val"><<= $rps.dignity.value>></span> chips. Win and he pays; lose and you wear it.</div>
</div>
<</if>>
<<set _rockLbl = '<span class="rps-card__pip">' + $rps.playerHand.Rock + '</span><img class="rps-card__img" src="Media/Cruise/Items/rps_rock_card.png" alt="Rock"><span class="rps-card__name">Rock</span>'>>
<<set _scisLbl = '<span class="rps-card__pip">' + $rps.playerHand.Scissors + '</span><img class="rps-card__img" src="Media/Cruise/Items/rps_scissors_card.png" alt="Scissors"><span class="rps-card__name">Scissors</span>'>>
<<set _papLbl = '<span class="rps-card__pip">' + $rps.playerHand.Paper + '</span><img class="rps-card__img" src="Media/Cruise/Items/rps_paper_card.png" alt="Paper"><span class="rps-card__name">Paper</span>'>>
<div class="rps-cards">
<<if canPlayCard($rps, "Rock")>>
<div class="btn rps-card rps-card--face"><<button _rockLbl>><<set _rig = ($ship.riggedRounds || 0) gt 0>><<run playerPlayCard($rps, "Rock", undefined, { forceLose: _rig })>><<if _rig>><<set $ship.riggedRounds = $ship.riggedRounds - 1>><</if>><<set $rps.raiseMsg = "">><<goto "Ship_RpsMatch">><</button>></div>
<<else>>
<div class="btn rps-card rps-card--face non-interacting"><<button _rockLbl>><</button>></div>
<</if>>
<<if canPlayCard($rps, "Scissors")>>
<div class="btn rps-card rps-card--face"><<button _scisLbl>><<set _rig = ($ship.riggedRounds || 0) gt 0>><<run playerPlayCard($rps, "Scissors", undefined, { forceLose: _rig })>><<if _rig>><<set $ship.riggedRounds = $ship.riggedRounds - 1>><</if>><<set $rps.raiseMsg = "">><<goto "Ship_RpsMatch">><</button>></div>
<<else>>
<div class="btn rps-card rps-card--face non-interacting"><<button _scisLbl>><</button>></div>
<</if>>
<<if canPlayCard($rps, "Paper")>>
<div class="btn rps-card rps-card--face"><<button _papLbl>><<set _rig = ($ship.riggedRounds || 0) gt 0>><<run playerPlayCard($rps, "Paper", undefined, { forceLose: _rig })>><<if _rig>><<set $ship.riggedRounds = $ship.riggedRounds - 1>><</if>><<set $rps.raiseMsg = "">><<goto "Ship_RpsMatch">><</button>></div>
<<else>>
<div class="btn rps-card rps-card--face non-interacting"><<button _papLbl>><</button>></div>
<</if>>
</div>
<<if not $rps.dignity>>
<div class="btn padding-top"><<button "Fold and leave" "Ship_MainHall">>
<<set $player.money = $rps.playerChips>>
<<set _opp = getRosterEntry($cruiseRoster, $rps.npcId)>>
<<if _opp>><<set _opp.chips = $rps.npcChips>><<set _opp.hand = $rps.npcHand>><</if>>
<<set $cruisePlayerHand = $rps.playerHand>>
<<set $rps to null>>
<</button>></div>
<<else>>
<div class="cruise-caged-note">Your body is in the pot. There is no folding now - play the hand out.</div>
<</if>>
<</if>>
</div>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Cruise/Locations/main_hall.jpg">>
<<timed 0.2s>>
<<ShipHead "The Empress Table">>
<<set _side = $ecard.playerSide>>
<<set _special = (_side === "empress" ? "Empress" : "Slave")>>
<div class="rps-table rps-game">
<div class="rps-vs">You vs <<= $ecard.npcName>> · Game <<= $ecard.game>>/<<= $ecard.gamesPerMatch>></div>
<<if ($tableTaste || "") isnot "">><div class="rps-banter cruise-table-taste"><<= $tableTaste>></div><</if>>
<div class="rps-chips">
<span>Your chips: <b><<= $ecard.playerChips>></b></span>
<span>Stake: <b><<= $ecard.bet>></b></span>
<span><<= $ecard.npcName>>: <b><<= $ecard.npcChips>></b></span>
</div>
<div class="rps-bet">You hold the <b><<= _special>></b> side · Round <<= $ecard.round>> · Won <<= $ecard.gamesWon>> / Lost <<= $ecard.gamesLost>></div>
<div class="rps-reveal"><span class="rps-draw">Empress beats Citizen · Citizen beats Slave · Slave beats Empress <<if _side === "slave">>(your upset pays <<= Math.min($ecard.bet * 5, $ecard.npcChips)>>)<<else>>(that upset costs you <<= Math.min($ecard.bet * 5, $ecard.playerChips)>>)<</if>>.</span></div>
<<if $ecard.last>>
<div class="rps-reveal">
You played <b><<= $ecard.last.playerCard>></b>, they played <b><<= $ecard.last.npcCard>></b> -
<<if $ecard.last.result === "playerGame">><span class="rps-win">you take the game (+<<= Math.abs($ecard.last.swing)>>)</span><<elseif $ecard.last.result === "npcGame">><span class="rps-lose">they take the game (-<<= Math.abs($ecard.last.swing)>>)</span><<else>><span class="rps-draw">both Citizens - the round is a wash, play on</span><</if>>
</div>
<</if>>
<<if $ecard.over>>
<<set _net = eCardSessionResult($ecard).net>>
<<set _resCls = "rps-result rps-result--" + (_net gt 0 ? "win" : (_net lt 0 ? "lose" : "even"))>>
<div @class="_resCls">
<<if _net gt 0>>You leave the Empress table up <b><<= _net>></b> chips.<<elseif _net lt 0>>You leave the Empress table down <b><<= Math.abs(_net)>></b> chips.<<else>>You break even at the Empress table.<</if>>
</div>
<<set _oppEntry = getRosterEntry($cruiseRoster, $ecard.npcId)>>
<<if _oppEntry>>
<<set _oppLine = pickCruiseLine(_oppEntry.archetype, (eCardSessionResult($ecard).won ? "lose" : "win"), npcMood(_oppEntry))>>
<<ShipMessage _oppLine>>
<</if>>
<div class="btn"><<button "Leave the table" "Ship_MainHall">>
<<set $player.money = $ecard.playerChips>>
<<set _opp = getRosterEntry($cruiseRoster, $ecard.npcId)>>
<<if _opp>><<set _opp.chips = $ecard.npcChips>>
<<if eCardSessionResult($ecard).won>><<run adjustCruiseStat(_opp.stats, "fear", 6)>><<run adjustCruiseStat(_opp.stats, "standing", -3)>><<else>><<run adjustCruiseStat(_opp.stats, "standing", 4)>><<run adjustCruiseStat(_opp.stats, "azart", 3)>><</if>>
<</if>>
/* A victory token needs a victory worth the name - a win that paid
nothing (chipless opponent) mints no token. */
<<if eCardSessionResult($ecard).won>><<if eCardSessionResult($ecard).net gt 0>><<run awardVictoryTokens($cruiseSkills, 1)>><</if>><<run unlockCruiseAchievement("firstWin")>><<run unlockCruiseAchievement("empressTable")>><</if>>
<<run recordMatchResult($cruiseDirector, eCardSessionResult($ecard).won)>><<run adjustPlayerRep($ship, eCardSessionResult($ecard).won ? 2 : -1)>>
<<set $ecard to null>>
<</button>></div>
<<elseif $ecard.gameOver>>
<div class="btn"><<button "Deal the next game">><<run eCardNextGame($ecard)>><<goto "Ship_ECardMatch">><</button>></div>
<div class="btn padding-top"><<button "Cash out and leave" "Ship_MainHall">>
<<set $player.money = $ecard.playerChips>>
<<set _opp = getRosterEntry($cruiseRoster, $ecard.npcId)>>
<<if _opp>><<set _opp.chips = $ecard.npcChips>><</if>>
/* A banked mid-match cash-out is still a played game: the director
tracks it like any other result (it used to slip past him). */
<<run recordMatchResult($cruiseDirector, eCardSessionResult($ecard).net gt 0)>>
<<set $ecard to null>>
<</button>></div>
<<else>>
<<if $ecard.last === null and $ecard.game === 1>>
<div class="rps-ante">
<span class="rps-ante__label">Set the stake</span>
<div class="btn rps-ante__btn"><<button "-50">><<set $ecard.bet = Math.max(100, ($ecard.bet || 100) - 50)>><<set $ecard.raiseMsg = "">><<goto "Ship_ECardMatch">><</button>></div>
<div class="btn rps-ante__btn"><<button "+50">><<set _cap = Math.max(100, Math.min($ecard.playerChips, $ecard.npcChips))>><<set _prop = Math.min(_cap, ($ecard.bet || 100) + 50)>><<set _rd = cruiseRaiseDecision($ecard.npcId, $ecard.bet, _prop, $ecard.npcChips)>><<if _rd.ok>><<set $ecard.bet = _prop>><<set $ecard.raiseMsg = "">><<else>><<set $ecard.raiseMsg = _rd.message>><</if>><<goto "Ship_ECardMatch">><</button>></div>
<div class="btn rps-ante__btn"><<button "+200">><<set _cap = Math.max(100, Math.min($ecard.playerChips, $ecard.npcChips))>><<set _prop = Math.min(_cap, ($ecard.bet || 100) + 200)>><<set _rd = cruiseRaiseDecision($ecard.npcId, $ecard.bet, _prop, $ecard.npcChips)>><<if _rd.ok>><<set $ecard.bet = _prop>><<set $ecard.raiseMsg = "">><<else>><<set $ecard.raiseMsg = _rd.message>><</if>><<goto "Ship_ECardMatch">><</button>></div>
</div>
<<if ($ecard.raiseMsg || "") isnot "">><div class="rps-banter cruise-raise-refusal"><<= $ecard.npcName>>: "<<= $ecard.raiseMsg>>"</div><</if>>
<</if>>
<<set _citLbl = '<span class="ecard-choice__kind">Common</span><span class="ecard-choice__name">Citizen</span>'>>
<<set _spLbl = '<span class="ecard-choice__kind">Special</span><span class="ecard-choice__name">' + _special + '</span>'>>
<<set _spCls = "btn rps-card ecard-choice ecard-choice--" + (_side === "empress" ? "empress" : "slave")>>
<div class="rps-cards">
/* The daily gate ($ship.ecardDone) is spent on the first card actually
played - backing out before playing leaves the attempt intact, the
same contract as the dice table's allInDone. */
<<if canPlayECard($ecard, "Citizen")>>
<div class="btn rps-card ecard-choice"><<button _citLbl>><<set $ship.ecardDone = true>><<run playerPlayECard($ecard, "Citizen")>><<goto "Ship_ECardMatch">><</button>></div>
<<else>>
<div class="btn rps-card ecard-choice non-interacting"><<button _citLbl>><</button>></div>
<</if>>
<<if canPlayECard($ecard, _special)>>
<div @class="_spCls"><<button _spLbl>><<set $ship.ecardDone = true>><<run playerPlayECard($ecard, _special)>><<goto "Ship_ECardMatch">><</button>></div>
<<else>>
<div class="btn rps-card ecard-choice non-interacting"><<button "Special card (spent)">><</button>></div>
<</if>>
</div>
<div class="btn padding-top"><<button "Fold and leave" "Ship_MainHall">>
<<set $player.money = $ecard.playerChips>>
<<set _opp = getRosterEntry($cruiseRoster, $ecard.npcId)>>
<<if _opp>><<set _opp.chips = $ecard.npcChips>><</if>>
<<set $ecard to null>>
<</button>></div>
<</if>>
</div>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Cruise/Locations/lower_deck.jpg">>
<<timed 0.2s>>
<<ShipHead "All-In Dice">>
<<set _opp = getRosterEntry($cruiseRoster, $allIn.npcId)>>
<<set _luck = Math.max(0, Math.min(1, (($player.attributes && $player.attributes.luck) ? $player.attributes.luck : 30) / 100))>>
<div class="rps-table rps-game">
<div class="rps-vs">Three dice, one throw, winner takes all - you vs <<= $allIn.npcName>></div>
<<if ($tableTaste || "") isnot "">><div class="rps-banter cruise-table-taste"><<= $tableTaste>></div><</if>>
<div class="rps-chips">
<span>Your chips: <b><<= $player.money>></b></span>
<span>Stake: <b><<= $allIn.bet>></b></span>
<span><<= $allIn.npcName>>: <b><<= (_opp ? _opp.chips : 0)>></b></span>
</div>
<div class="rps-reveal"><span class="rps-draw">Pinzoro (1-1-1) > any triple > 4-5-6 > a pair's odd die > 1-2-3 > no combo.</span></div>
<<if $allIn.last>>
<<set _pd = $allIn.last.playerHand.dice>><<set _nd = $allIn.last.npcHand.dice>>
<<set _p0 = _pd[0]>><<set _p1 = _pd[1]>><<set _p2 = _pd[2]>>
<<set _n0 = _nd[0]>><<set _n1 = _nd[1]>><<set _n2 = _nd[2]>>
<<set _alPCls = "alin-side" + ($allIn.last.outcome === "win" ? " is-winner" : ($allIn.last.outcome === "lose" ? " is-loser" : ""))>>
<<set _alNCls = "alin-side" + ($allIn.last.outcome === "lose" ? " is-winner" : ($allIn.last.outcome === "win" ? " is-loser" : ""))>>
<div class="alin-roll">
<div @class="_alPCls">
<div class="alin-dice"><span class="ship-die" @data-face="_p0"></span><span class="ship-die" @data-face="_p1"></span><span class="ship-die" @data-face="_p2"></span></div>
<span class="alin-hand">You · <<= $allIn.last.playerHand.rank>></span>
</div>
<span class="alin-vs">vs</span>
<div @class="_alNCls">
<div class="alin-dice"><span class="ship-die" @data-face="_n0"></span><span class="ship-die" @data-face="_n1"></span><span class="ship-die" @data-face="_n2"></span></div>
<span class="alin-hand"><<= $allIn.npcName>> · <<= $allIn.last.npcHand.rank>></span>
</div>
</div>
<div class="rps-reveal">
<<if $allIn.last.outcome === "win">><span class="rps-win">you take the pot (+<<= $allIn.bet>>)</span><<elseif $allIn.last.outcome === "lose">><span class="rps-lose">they take the pot (-<<= $allIn.bet>>)</span><<else>><span class="rps-draw">a push - stakes return</span><</if>>
</div>
<</if>>
<<if ($allIn.lastTalk || "") isnot "">><<ShipMessage $allIn.lastTalk>><</if>>
<<set _canRoll = $player.money gte $allIn.bet and _opp and _opp.chips gte $allIn.bet>>
<<if _canRoll>>
<<if $allIn.last === null>>
<div class="rps-ante">
<span class="rps-ante__label">Set the stake</span>
<div class="btn rps-ante__btn"><<button "-100">><<set $allIn.bet = Math.max(200, ($allIn.bet || 200) - 100)>><<set $allIn.raiseMsg = "">><<goto "Ship_AllInMatch">><</button>></div>
<div class="btn rps-ante__btn"><<button "+100">><<set _cap = Math.min($player.money, _opp.chips)>><<set _prop = Math.min(_cap, ($allIn.bet || 200) + 100)>><<set _rd = cruiseRaiseDecision($allIn.npcId, $allIn.bet, _prop, _opp.chips)>><<if _rd.ok>><<set $allIn.bet = _prop>><<set $allIn.raiseMsg = "">><<else>><<set $allIn.raiseMsg = _rd.message>><</if>><<goto "Ship_AllInMatch">><</button>></div>
<div class="btn rps-ante__btn"><<button "Shove">><<set _prop = Math.max(200, Math.min($player.money, _opp.chips))>><<set _rd = cruiseRaiseDecision($allIn.npcId, $allIn.bet, _prop, _opp.chips)>><<if _rd.ok>><<set $allIn.bet = _prop>><<set $allIn.raiseMsg = "">><<else>><<set $allIn.raiseMsg = _rd.message>><</if>><<goto "Ship_AllInMatch">><</button>></div>
</div>
<<if ($allIn.raiseMsg || "") isnot "">><div class="rps-banter cruise-raise-refusal"><<= $allIn.npcName>>: "<<= $allIn.raiseMsg>>"</div><</if>>
<</if>>
<div class="btn"><<button "Throw the dice">>
<<set $ship.allInDone = true>>
<<set _pl = Math.max(0, Math.min(1, (($player.attributes && $player.attributes.luck) ? $player.attributes.luck / 100 : 0.3)))>>
<<set _r = resolveAllInRound(_pl, 0.3, $allIn.bet)>>
<<set _o = getRosterEntry($cruiseRoster, $allIn.npcId)>>
<<if _r.outcome === "win">><<set _gain = Math.min($allIn.bet, (_o ? _o.chips : 0))>><<set $player.money += _gain>><<if _o>><<set _o.chips -= _gain>><</if>>
<<if _r.playerHand.strength gte 70>><<run awardVictoryTokens($cruiseSkills, 1)>><<run unlockCruiseAchievement("diceWin")>><</if>>
<<elseif _r.outcome === "lose">><<set _loss = Math.min($allIn.bet, $player.money)>><<set $player.money -= _loss>><<if _o>><<set _o.chips += _loss>><</if>><</if>>
<<set $allIn.last = _r>>
<<if _o>><<set $allIn.lastTalk = pickCruiseLine(_o.archetype, (_r.outcome === "win" ? "lose" : _r.outcome === "lose" ? "win" : "greet"), npcMood(_o))>><</if>>
/* The director tracks only decisive throws - a push zeroed his win
streak as if it were a loss. */
<<if _r.outcome isnot "draw">><<run recordMatchResult($cruiseDirector, _r.outcome === "win")>><</if>>
/* Standing moves once per sitting, on the first decisive throw - the
other tables score the match, not every hand - and a push is
neither a win nor a loss. */
<<if not $allIn.repDone and _r.outcome isnot "draw">>
<<run adjustPlayerRep($ship, _r.outcome === "win" ? 2 : -1)>>
<<set $allIn.repDone = true>>
<</if>>
<<goto "Ship_AllInMatch">>
<</button>></div>
<<else>>
<div class="rps-result"><<if not _opp or _opp.chips lt $allIn.bet>>Your opponent is tapped out.<<else>>You are out of chips to cover the stake.<</if>></div>
<</if>>
<div class="btn padding-top"><<button "Leave the table" "Ship_MainHall">>
<<set $allIn = null>>
<</button>></div>
</div>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Cruise/Locations/bar.jpg">>
<<timed 0.2s>>
<<ShipHead "The Endurance Table">>
<div class="rps-table rps-game">
<div class="rps-vs">Hold out longer than <<= $endure.npcName>> - first to break loses</div>
<<if ($tableTaste || "") isnot "">><div class="rps-banter cruise-table-taste"><<= $tableTaste>></div><</if>>
<div class="rps-bet">Stake <<= $endure.bet>> chips</div>
<<set _pw = "width:" + Math.max(0, Math.min(100, $endure.playerResolve)) + "%">>
<<set _nw = "width:" + Math.max(0, Math.min(100, $endure.npcResolve)) + "%">>
<div class="endure-meters">
<div class="endure-bar">
<div class="endure-bar__head"><span>You</span><b><<= Math.max(0, Math.round($endure.playerResolve))>></b></div>
<span class="endure-bar__track"><span class="endure-bar__fill endure-bar__fill--me" @style="_pw"></span></span>
</div>
<div class="endure-bar">
<div class="endure-bar__head"><span><<= $endure.npcName>></span><b><<= Math.max(0, Math.round($endure.npcResolve))>></b></div>
<span class="endure-bar__track"><span class="endure-bar__fill endure-bar__fill--them" @style="_nw"></span></span>
</div>
</div>
<<if $endure.caged>><div class="cruise-caged-note">The cage bites with every breath - you strain harder to hold the edge.</div><</if>>
<<if $endure.last>>
<div class="rps-reveal">
You <<if $endure.last.tempo === "press">>bore down<<else>>held steady<</if>>, they <<if $endure.last.npcTempo === "press">>bore down<<else>>held steady<</if>> - you lost <b><<= $endure.last.playerHit>></b>, they lost <b><<= $endure.last.npcHit>></b>.
</div>
<</if>>
<<if not $endure.over and ($endure.lastTalk || "") isnot "">><<ShipMessage $endure.lastTalk>><</if>>
<<if $endure.over>>
<<set _er = enduranceResult($endure)>>
<<set _oppEntry = getRosterEntry($cruiseRoster, $endure.npcId)>>
<<set _pot = _er.won ? Math.min($endure.bet, (_oppEntry ? _oppEntry.chips : 0)) : Math.min($endure.bet, $player.money)>>
<div class="rps-result"><<if _er.won>>They break first - you take the pot (+<<= _pot>>).<<else>>You break first. The pot is theirs (-<<= _pot>>).<</if>></div>
<<if _oppEntry>>
<<set _oppLine = pickCruiseLine(_oppEntry.archetype, (_er.won ? "lose" : "win"), npcMood(_oppEntry))>>
<<ShipMessage _oppLine>>
<</if>>
<div class="btn"><<button "Leave the table" "Ship_MainHall">>
<<set _o = getRosterEntry($cruiseRoster, $endure.npcId)>>
/* Token only when the pot actually paid - a chipless opponent is no
victory worth minting for. */
<<if _er.won>><<set _gain = Math.min($endure.bet, (_o ? _o.chips : 0))>><<set $player.money += _gain>><<if _o>><<set _o.chips -= _gain>><</if>><<if _gain gt 0>><<run awardVictoryTokens($cruiseSkills, 1)>><</if>><<run unlockCruiseAchievement("firstWin")>><<run unlockCruiseAchievement("ironNerve")>>
<<else>><<set _loss = Math.min($endure.bet, $player.money)>><<set $player.money -= _loss>><<if _o>><<set _o.chips += _loss>><</if>><</if>>
<<run recordMatchResult($cruiseDirector, _er.won)>><<run adjustPlayerRep($ship, _er.won ? 2 : -1)>>
<<set $endure to null>>
<</button>></div>
<<else>>
<div class="rps-cards">
/* The daily gate ($ship.endureDone) is spent on the first exchange -
standing up before it starts leaves the attempt intact (allInDone
contract). */
<div class="btn rps-card endure-act endure-act--hold"><<button "Hold steady">><<set $ship.endureDone = true>><<run enduranceExchange($endure, "hold")>><<set _eo = getRosterEntry($cruiseRoster, $endure.npcId)>><<if _eo and $endure.last>><<set $endure.lastTalk = pickCruiseLine(_eo.archetype, ($endure.last.playerHit lt $endure.last.npcHit ? "lose" : $endure.last.playerHit gt $endure.last.npcHit ? "win" : "greet"), npcMood(_eo))>><</if>><<goto "Ship_EnduranceMatch">><</button>></div>
<div class="btn rps-card endure-act endure-act--press"><<button "Bear down">><<set $ship.endureDone = true>><<run enduranceExchange($endure, "press")>><<set _eo = getRosterEntry($cruiseRoster, $endure.npcId)>><<if _eo and $endure.last>><<set $endure.lastTalk = pickCruiseLine(_eo.archetype, ($endure.last.playerHit lt $endure.last.npcHit ? "lose" : $endure.last.playerHit gt $endure.last.npcHit ? "win" : "greet"), npcMood(_eo))>><</if>><<goto "Ship_EnduranceMatch">><</button>></div>
</div>
<<if $endure.last>>
/* Yielding a live duel IS breaking first: settle the stake against the
yielder, otherwise the open meters make this a free peek-and-bail
(stay when ahead, walk when behind). Standing up before the first
exchange still costs nothing, same as backing out of the dice. */
<div class="btn padding-top"><<button "Yield the duel (forfeit the stake)" "Ship_MainHall">>
<<set _yo = getRosterEntry($cruiseRoster, $endure.npcId)>>
<<set _yloss = Math.min($endure.bet, $player.money)>><<set $player.money -= _yloss>><<if _yo>><<set _yo.chips += _yloss>><</if>>
<<run recordMatchResult($cruiseDirector, false)>><<run adjustPlayerRep($ship, -1)>>
<<set $endure to null>>
<</button>></div>
<<else>>
<div class="btn padding-top"><<button "Stand up before it starts" "Ship_MainHall">>
<<set $endure to null>>
<</button>></div>
<</if>>
<</if>>
</div>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Cruise/Locations/engine_room_hold.jpg">>
<<timed 0.2s>>
<<ShipHead "The Bilge Maze">>
<div class="rps-table rps-game">
<<if not $labyrinth>>
<<if ($labMsg || "") === "">><<set $labMsg = wreckmasterLine("intro")>><</if>>
<<ShipMessage $labMsg>>
<<set _lint = ($player.attributes and $player.attributes.intelligence) ? $player.attributes.intelligence.value : 0>>
<<set _ldex = ($player.attributes and $player.attributes.dexterity) ? $player.attributes.dexterity.value : 0>>
<div class="rps-reveal"><span class="rps-draw">Seven rows, three hatches each, one of the three flooded. Every dry row grows the pot; the far bulkhead pays a bonus on top. A flooded hatch drowns the whole stake.</span></div>
<div class="rps-chips">
<span>Your ear: <b><<= labyrinthListenCount(_lint)>></b> listens a run, right about <b><<= Math.round(labyrinthListenAccuracy(_lint) * 100)>>%</b> of the time</span>
<span>Your hands: <b><<= Math.round(labyrinthSaveChance(_ldex) * 100)>>%</b> to catch one bad step</span>
</div>
<<for _lb range labyrinthBuyIns()>>
<<capture _lb>>
<<if $player.money gte _lb>>
<<set _lbl = "Stake " + _lb + " chips and go down">>
<div class="btn"><<button _lbl>>
<<set $player.money -= _lb>>
<<set $ship.labyrinthDone = true>>
<<set $labyrinth = startLabyrinthRun(_lb, ($player.attributes.intelligence ? $player.attributes.intelligence.value : 0))>>
<<set $labMsg = "">>
<<SpendTime 60>>
<<goto "Ship_Labyrinth">>
<</button>></div>
<</if>>
<</capture>>
<</for>>
<<if $player.money lt 250>>
<div class="rps-result">The wreckmaster looks at your purse and does not even uncross his arms. The maze starts at 250 chips.</div>
<</if>>
<<set _dso = dignityStakeOptions(femStage($player), ($ship.corr || 0))>>
<<if _dso.feminization or _dso.corruption>>
<div class="cruise-actnote">The wreckmaster takes more than chips. A wet stake rides the maze like money: climb out and the house pays its worth, drown and the crew collects it below, in person, on the plates.</div>
<<if _dso.feminization>>
<<set _wsf = dignityWagerValue("feminization")>>
<<set _wslbl = "Wet stake: pledge a stage of your body (rides as " + _wsf + " chips)">>
<div class="btn"><<button _wslbl>>
<<set $ship.labyrinthDone = true>>
<<set $labyrinth = startLabyrinthRun(dignityWagerValue("feminization"), ($player.attributes.intelligence ? $player.attributes.intelligence.value : 0), Math.random, "feminization")>>
<<set $labMsg = "">>
<<SpendTime 60>>
<<goto "Ship_Labyrinth">>
<</button>></div>
<</if>>
<<if _dso.corruption>>
<<set _wsc = dignityWagerValue("corruption")>>
<<set _wsclbl = "Wet stake: pledge your nerve (rides as " + _wsc + " chips)">>
<div class="btn"><<button _wsclbl>>
<<set $ship.labyrinthDone = true>>
<<set $labyrinth = startLabyrinthRun(dignityWagerValue("corruption"), ($player.attributes.intelligence ? $player.attributes.intelligence.value : 0), Math.random, "corruption")>>
<<set $labMsg = "">>
<<SpendTime 60>>
<<goto "Ship_Labyrinth">>
<</button>></div>
<</if>>
<</if>>
<div class="btn padding-top"><<button "Back up the ladder" "Ship_LowerDeck">><<set $labMsg = "">><</button>></div>
<<else>>
<div class="rps-vs">The wreckmaster's maze - row <<= Math.min($labyrinth.step + 1, $labyrinth.steps)>> of <<= $labyrinth.steps>></div>
<div class="rps-chips">
<span>Pot: <b><<= $labyrinth.pot>></b></span>
<span>Listens left: <b><<= $labyrinth.listensLeft>></b></span>
<span><<if $labyrinth.saveUsed>>Your one catch is spent<<else>>One catch in your hands yet<</if>></span>
</div>
<<if ($labMsg || "") isnot "">><<ShipMessage $labMsg>><</if>>
<<if $labyrinth.outcome === "running">>
<<set _m0 = labyrinthMarkFor($labyrinth, 0)>>
<<set _m1 = labyrinthMarkFor($labyrinth, 1)>>
<<set _m2 = labyrinthMarkFor($labyrinth, 2)>>
<div class="rps-reveal">
<<if _m0 === "flooded">><span class="rps-lose">left: your ear says it drinks</span><<elseif _m0 === "safe">><span class="rps-win">left: your ear says dry</span><</if>>
<<if _m1 === "flooded">><span class="rps-lose">middle: your ear says it drinks</span><<elseif _m1 === "safe">><span class="rps-win">middle: your ear says dry</span><</if>>
<<if _m2 === "flooded">><span class="rps-lose">right: your ear says it drinks</span><<elseif _m2 === "safe">><span class="rps-win">right: your ear says dry</span><</if>>
</div>
<<if $labyrinth.listensLeft gt 0>>
<div class="rps-ante">
<span class="rps-ante__label">Press an ear to the steel</span>
<<if _m0 === "">><div class="btn rps-ante__btn"><<button "Listen left">><<set _lv = labyrinthListen($labyrinth, 0, ($player.attributes.intelligence ? $player.attributes.intelligence.value : 0))>><<set $labMsg = labyrinthListenLine(_lv)>><<goto "Ship_Labyrinth">><</button>></div><</if>>
<<if _m1 === "">><div class="btn rps-ante__btn"><<button "Listen middle">><<set _lv = labyrinthListen($labyrinth, 1, ($player.attributes.intelligence ? $player.attributes.intelligence.value : 0))>><<set $labMsg = labyrinthListenLine(_lv)>><<goto "Ship_Labyrinth">><</button>></div><</if>>
<<if _m2 === "">><div class="btn rps-ante__btn"><<button "Listen right">><<set _lv = labyrinthListen($labyrinth, 2, ($player.attributes.intelligence ? $player.attributes.intelligence.value : 0))>><<set $labMsg = labyrinthListenLine(_lv)>><<goto "Ship_Labyrinth">><</button>></div><</if>>
</div>
<</if>>
<div class="rps-ante">
<span class="rps-ante__label">Pick a hatch</span>
<div class="btn rps-ante__btn"><<button "Left hatch">><<set _lr = labyrinthStep($labyrinth, 0, ($player.attributes.dexterity ? $player.attributes.dexterity.value : 0))>><<include "Ship_LabyrinthResolve">><<goto "Ship_Labyrinth">><</button>></div>
<div class="btn rps-ante__btn"><<button "Middle hatch">><<set _lr = labyrinthStep($labyrinth, 1, ($player.attributes.dexterity ? $player.attributes.dexterity.value : 0))>><<include "Ship_LabyrinthResolve">><<goto "Ship_Labyrinth">><</button>></div>
<div class="btn rps-ante__btn"><<button "Right hatch">><<set _lr = labyrinthStep($labyrinth, 2, ($player.attributes.dexterity ? $player.attributes.dexterity.value : 0))>><<include "Ship_LabyrinthResolve">><<goto "Ship_Labyrinth">><</button>></div>
</div>
<<if $labyrinth.step gt 0>>
<div class="btn"><<button "Climb out with the pot">>
<<set _lpay = labyrinthCashOut($labyrinth)>>
<<set $player.money += _lpay>>
<<set $labMsg = wreckmasterLine("cashed")>>
<<goto "Ship_Labyrinth">>
<</button>></div>
<</if>>
<<else>>
<div class="rps-result">
<<if $labyrinth.outcome === "busted">><span class="rps-lose">The bilge kept your stake.</span>
<<elseif $labyrinth.outcome === "cleared">><span class="rps-win">The far bulkhead paid the full pot (+<<= $labyrinth.pot>> chips).</span>
<<else>><span class="rps-win">You climbed out with +<<= $labyrinth.pot>> chips.</span><</if>>
</div>
<<if $labyrinth.outcome === "busted" and $labyrinth.bodyStake isnot "none">>
<div class="btn padding-top"><<button "The crew comes to collect the wet stake">><<goto "Ship_BilgeCollection">><</button>></div>
<<else>>
<div class="btn padding-top"><<button "Back up the ladder" "Ship_LowerDeck">><<set $labyrinth = null>><<set $labMsg = "">><</button>></div>
<</if>>
<</if>>
<</if>>
</div>
<</timed>>
<</nobr>><<nobr>>
<<if _lr === "cleared">>
<<set $player.money += $labyrinth.pot>>
<<set $ship.mazeCleared = true>>
<<run unlockCruiseAchievement("mazeCleared")>>
<<run awardVictoryTokens($cruiseSkills, 2)>>
<<set $labMsg = wreckmasterLine("cleared")>>
<<elseif _lr === "busted">>
<<set $labMsg = wreckmasterLine("busted")>>
/* A drowned wet stake is collected in the flesh: the body change lands here
(post-loss body picks the collection scene's register, like the tables). */
<<if $labyrinth.bodyStake === "feminization">>
<<run applyFeminizationStage($player, 1)>>
<<elseif $labyrinth.bodyStake === "corruption">>
<<set $ship.corr = Math.min(6, ($ship.corr || 0) + 1)>>
<</if>>
<<elseif _lr === "saved">>
<<set $labMsg = wreckmasterLine("saved")>>
<<else>>
<<set $labMsg = wreckmasterLine("safe")>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Cruise/Locations/engine_room_hold.jpg">>
<<timed 0.2s>>
<<ShipHead "Settling the Wet Stake">>
<<set _bk = ($labyrinth and $labyrinth.bodyStake) ? $labyrinth.bodyStake : "feminization">>
<<set _bc = bilgeCollectionScene(_bk, femStage($player), $player.gender())>>
<<ShipMessage _bc.lead>>
<<ShipMessage _bc.act>>
<<if _bc.explicit>>
<<set _sg = $player.gender()>>
/* Each clip is one man and the player: its pair line sits directly above it; the
rest of the crew is in the act before and the tail after. */
<<ShipMessage _bc.oral>>
<<SetOralPick "Male" _sg>><<Video _pick>>
<<ShipMessage _bc.cum>>
<<SetOralCumInPick "Male" _sg>><<Video _pick>>
<<ShipMessage _bc.tail>>
<</if>>
<div class="cruise-afterglow"><<= formatDialogue(_bc.afterglow)>></div>
<div class="btn padding-top"><<button "Climb back up the ladder" "Ship_LowerDeck">><<set $labyrinth = null>><<set $labMsg = "">><</button>></div>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Cruise/Locations/communal_cabins.jpg">>
<<timed 0.2s>>
<<ShipHead "The Champion's Night">>
<<if not $champNight>>
<<ShipMessage "The hall has gone back to its games and the night has moved on without you.">>
<div class="btn padding-top"><<button "Back to the hall" "Ship_MainHall">><</button>></div>
<<elseif ($champNight.role || "") is "">>
<<set _cnl = championNightScene("", $champNight.npcName, femStage($player), $player.gender()).lead>>
<<ShipMessage _cnl>>
<div class="cruise-actnote">Nothing on the table tonight: no chips, no ledger, no stage of you or of him moving. The title pays in a different coin, and it pays on your terms.</div>
<<if not $ship.caged>>
<div class="btn"><<button "Take him">><<set $champNight.role = "top">><<goto "Ship_ChampionNight">><</button>></div>
<</if>>
<div class="btn"><<button "Have him serve, on your terms">><<set $champNight.role = "bottom">><<goto "Ship_ChampionNight">><</button>></div>
<div class="btn padding-top"><<button "Send him off with a drink">>
<<set $ship.champNight = true>>
<<set $champNight = null>>
<<goto "Ship_MainHall">>
<</button>></div>
<<else>>
<<set _role = $champNight.role>>
<<set _cn = championNightScene(_role, $champNight.npcName, femStage($player), $player.gender())>>
<<set _pg = $player.gender()>>
<<set _ng = $champNight.npcGender || "Male">>
<<ShipMessage _cn.lead>>
<<if _role is "top">>
<<if _pg is "Female">>
/* The champion straps on: Female-dom media, pose by the admirer's body. */
<<SetStrapFacePick "Female" _ng>><<Video _pick>>
<<ShipMessage _cn.beat>>
<<if _ng is "Female">><<SetVagPick "Female" _ng>><<else>><<SetAnalPick "Female" _ng>><</if>><<Video _pick>>
<<else>>
<<SetOralPick _pg _ng>><<Video _pick>>
<<ShipMessage _cn.beat>>
<<if _ng is "Female">>
<<SetVagPick _pg _ng>><<Video _pick>>
<<SetVagCumInPick _pg _ng>><<if _pick is "">><<SetVagPick _pg _ng>><</if>><<Video _pick>>
<<else>>
<<SetAnalPick _pg _ng>><<Video _pick>>
<<SetAnalCumInPick _pg _ng>><<if _pick is "">><<SetAnalPick _pg _ng>><</if>><<Video _pick>>
<</if>>
<</if>>
<<else>>
/* He serves at the champion's command: dom = the admirer's body, sub = the
champion's, pose by the champion's genitals. */
<<SetOralPick _ng _pg>><<Video _pick>>
<<ShipMessage _cn.beat>>
<<if _pg is "Female">>
<<SetVagPick _ng _pg>><<Video _pick>>
<<SetVagCumInPick _ng _pg>><<if _pick is "">><<SetVagPick _ng _pg>><</if>><<Video _pick>>
<<else>>
<<SetAnalPick _ng _pg>><<Video _pick>>
<<SetAnalCumInPick _ng _pg>><<if _pick is "">><<SetAnalPick _ng _pg>><</if>><<Video _pick>>
<</if>>
<</if>>
<div class="cruise-afterglow"><<= formatDialogue(_cn.afterglow)>></div>
<div class="btn padding-top"><<button "Sleep like a champion">>
<<set $ship.champNight = true>>
<<set $ship.layPartners = ($ship.layPartners || [])>>
<<run $ship.layPartners.push($champNight.npcId)>>
<<set $champNight = null>>
<<goto "Ship_MainHall">>
<</button>></div>
<</if>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Cruise/Locations/main_hall.jpg">>
<<timed 0.2s>>
<<ShipHead "The Championship">>
/* The bracket is snapshotted at buy-in ($ship.champSeeds): seeds derive from
live chips, so recomputing per render could swap the round-2/3 opponent
between the board shown at buy-in and the round actually played. */
<<set _seeds = $ship.champSeeds || championshipSeeds($cruiseRoster, { name: "You", chips: $player.money, femStage: femStage($player), corr: ($ship.corr || 0) })>>
<<if ($ship.champMsg || "") isnot "">>
<div class="cruise-afterglow"><<= formatDialogue($ship.champMsg)>></div>
<<if $ship.champRound and not $ship.champDone>>
<div class="btn padding-top"><<button "Take the next round">><<set $ship.champMsg = "">><<goto "Ship_Championship">><</button>></div>
<<else>>
<<if $ship.champWon and not $ship.champNight>>
/* The title's other prize (E17 extension): the deck's most willing admirer,
on the champion's terms, outside the masculinity economy entirely. */
<div class="btn"><<button "Let the night find its champion">>
<<set $ship.champMsg = "">>
<<set _adm = championAdmirer($cruiseRoster, { playerFemStage: femStage($player), playerCorr: ($ship.corr || 0) }, $ship.layPartners || [])>>
<<if _adm>>
<<set $champNight = { npcId: _adm.id, npcName: _adm.name, npcGender: _adm.gender, role: "" }>>
<<goto "Ship_ChampionNight">>
<<else>>
<<set $ship.champNight = true>>
<<run UI.alert("The hall empties around its champion tonight - nobody left standing dares.")>>
<<goto "Ship_MainHall">>
<</if>>
<</button>></div>
<</if>>
<div class="btn padding-top"><<button "Leave the floor" "Ship_MainHall">><<set $ship.champMsg = "">><</button>></div>
<</if>>
<<elseif $ship.champDone>>
<<ShipMessage "The championship bracket has been run for this voyage. The «Sirena» only crowns once a trip.">>
<<if $ship.champWon and not $ship.champNight>>
<div class="btn"><<button "Let the night find its champion">>
<<set _adm = championAdmirer($cruiseRoster, { playerFemStage: femStage($player), playerCorr: ($ship.corr || 0) }, $ship.layPartners || [])>>
<<if _adm>>
<<set $champNight = { npcId: _adm.id, npcName: _adm.name, npcGender: _adm.gender, role: "" }>>
<<goto "Ship_ChampionNight">>
<<else>>
<<set $ship.champNight = true>>
<<run UI.alert("The hall empties around its champion tonight - nobody left standing dares.")>>
<<goto "Ship_MainHall">>
<</if>>
<</button>></div>
<</if>>
<div class="btn padding-top"><<button "Leave the floor" "Ship_MainHall">><</button>></div>
<<elseif not $ship.champRound>>
<<ShipMessage "The house clears the center of the hall and sets the championship bracket under the lights. To take it you must beat the boat's three strongest in a row - lose a single round and you are out.">>
<div class="rps-table rps-game">
<div class="rps-vs">The bracket: <<for _si, _sn range _seeds>><<if _si gt 0>> · <</if>><<= _sn>><</for>></div>
<div class="rps-bet">Buy-in <b><<= CHAMPIONSHIP_BUYIN>></b> chips · the title pays <b><<= championshipPot(CHAMPIONSHIP_ROUNDS)>></b></div>
</div>
<<if _seeds.length lt CHAMPIONSHIP_ROUNDS>>
<div class="cruise-caged-note">Too few contestants are still standing to field a full bracket. The championship is off this voyage.</div>
<div class="btn padding-top"><<button "Leave the floor" "Ship_MainHall">><</button>></div>
<<elseif $player.money gte CHAMPIONSHIP_BUYIN>>
<div class="btn"><<button "Buy in and take your seat">>
<<set $player.money = $player.money - CHAMPIONSHIP_BUYIN>>
<<set $ship.champRound = 1>>
<<set $ship.champSeeds = _seeds>>
<<goto "Ship_Championship">>
<</button>></div>
<div class="btn padding-top"><<button "Walk away" "Ship_MainHall">><</button>></div>
<<else>>
<div class="cruise-caged-note">You cannot cover the buy-in of <<= CHAMPIONSHIP_BUYIN>> chips.</div>
<div class="btn padding-top"><<button "Leave the floor" "Ship_MainHall">><</button>></div>
<</if>>
<<else>>
<<set _round = $ship.champRound>>
<<set _opp = _seeds[_round - 1]>>
<<if not _opp>><<set _opp = "the house champion">><</if>>
<div class="rps-table rps-game">
<div class="rps-vs">Round <<= _round>> / <<= CHAMPIONSHIP_ROUNDS>> · You vs <b><<= _opp>></b></div>
<div class="rps-bet">Banked so far <b><<= championshipPot(_round - 1)>></b> · your read of the round <b><<= championshipWinChance(_round)>>%</b></div>
</div>
<div class="btn"><<button "Play the round">>
<<set _opp2 = _seeds[$ship.champRound - 1]>><<if not _opp2>><<set _opp2 = "the house champion">><</if>>
<<if resolveChampionshipRound($ship.champRound)>>
<<if $ship.champRound gte CHAMPIONSHIP_ROUNDS>>
<<set $player.money = $player.money + championshipPot(CHAMPIONSHIP_ROUNDS)>>
<<set $ship.champDone = true>><<set $ship.champRound = 0>><<set $ship.champWon = true>><<run adjustPlayerRep($ship, 10)>>
/* The title gets its own achievement - this used to fire
profitBaron ('walk off 2000 ahead') for a 1400-chip bracket. */
<<run unlockCruiseAchievement("champion")>>
<<set $ship.champMsg = "You beat " + _opp2 + " in the final and take the championship of the «Sirena» to a hall on its feet. The title pot is yours - " + championshipPot(CHAMPIONSHIP_ROUNDS) + " chips - and for one night the boat belongs to you instead of the other way around.">>
<<else>>
<<set $ship.champRound = $ship.champRound + 1>>
<<set $ship.champMsg = "You put " + _opp2 + " out of the bracket and advance. The lights feel hotter with every round you survive.">>
<</if>>
<<else>>
<<set _kept = championshipPot($ship.champRound - 1)>>
<<set $player.money = $player.money + _kept>>
<<set $ship.champDone = true>><<set $ship.champRound = 0>>
<<set $ship.champMsg = _opp2 + " knocks you out of the bracket. You keep what you cleared on the way - " + _kept + " chips - and the «Sirena» keeps the rest, the way she keeps everything in the end.">>
<</if>>
<<SpendTime 30>>
<<goto "Ship_Championship">>
<</button>></div>
<div class="btn padding-top"><<button "Forfeit and keep what you have banked">>
<<set _kept = championshipPot($ship.champRound - 1)>>
<<set $player.money = $player.money + _kept>>
<<set $ship.champDone = true>><<set $ship.champRound = 0>>
<<set $ship.champMsg = "You stand up from the table while you are still ahead, banking " + _kept + " chips. On the «Sirena», walking away a winner is its own kind of championship.">>
<<goto "Ship_Championship">>
<</button>></div>
<</if>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Cruise/Locations/main_hall.jpg">>
<<timed 0.2s>>
<<ShipHead "The Standings Board">>
<<run unlockCruiseAchievement("standings")>>
<<set _vday = getVoyageProgress().day>>
<<set _me = { name: "You", chips: $player.money, femStage: femStage($player), corr: ($ship.corr || 0) }>>
<<set _stand = computeStandings($cruiseRoster, _me)>>
<div class="cruise-stage-banner"><<= stageInfo(voyageStage(_vday)).blurb>></div>
<div class="cruise-standings">
<div class="cruise-standings__me">You stand <b>#<<= _stand.playerRank>></b> of <<= _stand.total>> aboard, with <b><<= $player.money>></b> in chips against a <b><<= $ship.loan>></b> debt.</div>
<<set _repT = repTier(playerRep($ship))>>
<div class="cruise-standings__me"><b><<= _repT.label>></b> (standing <<= playerRep($ship)>>/100) - <<= _repT.line>></div>
/* Build the board as one HTML string and emit it whole - a conditional macro
inside the <tr> tag is swallowed by the browser's HTML parser, so the row
markup has to be assembled in script first. */
<<set _tbl = '<table class="cruise-standings__table"><tr><th>#</th><th>Name</th><th>Chips</th><th>Standing</th></tr>'>>
<<for _i, _s range _stand.board>>
<<if _i lt 12 or _s.isPlayer>>
<<set _stTxt = (_s.status is "clearing" ? "clearing" : (_s.status is "drowning" ? "drowning" : (_s.status is "fallen" ? "fallen" : "holding")))>>
<<set _stLbl = '<span class="cruise-standings__status cruise-standings__status--' + _stTxt + '">' + _stTxt + '</span>'>>
<<set _nm = _s.isPlayer ? ("<b>" + _s.name + "</b>") : _s.name>>
<<set _rkCls = "cruise-standings__rank" + (_s.rank lte 3 ? " cruise-standings__rank--top" : "")>>
<<set _tbl = _tbl + '<tr' + (_s.isPlayer ? ' class="cruise-standings__row--me"' : '') + '><td class="' + _rkCls + '">#' + _s.rank + '</td><td>' + _nm + '</td><td>' + _s.chips + '</td><td>' + _stLbl + '</td></tr>'>>
<</if>>
<</for>>
<<set _tbl = _tbl + '</table>'>>
<<= _tbl>>
</div>
<div class="btn padding-top"><<button "Back to the hall" "Ship_MainHall">><</button>></div>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Cruise/Locations/main_hall.jpg">>
<<timed 0.2s>>
<<set _rr = $ship.rivals[$activeRival]>>
<<set _rival = getRival(_rr.key)>>
<<ShipHead _rival.name>>
<<if $rivalMsg isnot "">>
<div class="cruise-event"><div class="cruise-event__result"><<= formatDialogue($rivalMsg)>></div></div>
<div class="btn padding-top"><<button "Back to the hall" "Ship_MainHall">><<set $rivalMsg = "">><</button>></div>
<<else>>
<<set _beat = rivalBeat(_rival, _rr.beat, _rr.disp)>>
<div class="cruise-event"><div class="cruise-event__body"><<= formatDialogue(_beat.text)>></div></div>
<<if _beat.final>>
<div class="cruise-rival__band">You are parting as <<= dispositionLabel(_rr.disp)>>.</div>
<div class="cruise-choices">
<div class="btn"><<button "Take your leave">>
<<if _beat.effect and _beat.effect.chips>><<set $player.money = Math.max(0, $player.money + _beat.effect.chips)>><</if>>
<<if _beat.effect and _beat.effect.tokens>><<run awardVictoryTokens($cruiseSkills, _beat.effect.tokens)>><</if>>
<<if _beat.band is "ally">><<run unlockCruiseAchievement("rivalAlly")>><</if>>
<<set $rivalMsg = (_beat.effect ? _beat.effect.note : "The «Sirena» closes over it.")>>
<<set $ship.rivals[$activeRival].beat = 3>>
<<goto "Ship_RivalBeat">>
<</button>></div>
</div>
<<else>>
<div class="cruise-choices">
<<for _ci, _ch range _beat.choices>>
<<set _chDisp = _ch.disp>>
<<set _chResult = _ch.result>>
<<capture _ci, _chDisp, _chResult>>
<div class="btn"><<button _ch.label>>
<<set $ship.rivals[$activeRival].disp = $ship.rivals[$activeRival].disp + _chDisp>>
<<set $ship.rivals[$activeRival].beat = $ship.rivals[$activeRival].beat + 1>>
<<set $rivalMsg = _chResult>>
<<goto "Ship_RivalBeat">>
<</button>></div>
<</capture>>
<</for>>
</div>
<</if>>
<</if>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Cruise/Locations/main_hall.jpg">>
<<timed 0.2s>>
<<set _cc = $ship.chains[$activeChain]>>
<<set _chain = getChain(_cc.key)>>
<<if !_cc.choices>><<set _cc.choices = []>><</if>>
<<ShipHead _chain.title>>
<<if $chainMsg isnot "">>
<div class="cruise-event"><div class="cruise-event__result"><<= formatDialogue($chainMsg)>></div></div>
<div class="btn padding-top"><<button "Back to the hall" "Ship_MainHall">><<set $chainMsg = "">><</button>></div>
<<else>>
<<set _stage = chainStage(_chain, _cc.stage)>>
<div class="cruise-event"><div class="cruise-event__body"><<= formatDialogue(_stage.text)>></div></div>
<div class="cruise-choices">
<<for _ci, _ch range availableChainChoices(_stage, _cc.choices)>>
<<set _cres = _ch.result>>
<<set _cnote = (_ch.effect ? _ch.effect.note : "")>>
<<set _cchips = (_ch.effect and _ch.effect.chips) ? _ch.effect.chips : 0>>
<<set _ctok = (_ch.effect and _ch.effect.tokens) ? _ch.effect.tokens : 0>>
<<set _ccorr = (_ch.effect and _ch.effect.corr) ? _ch.effect.corr : 0>>
<<set _cmat = (_ch.effect and _ch.effect.material) ? _ch.effect.material : "">>
<<set _blockedChoiceLabel = _ch.label + " (need " + Math.abs(_cchips) + " chips)">>
<<capture _cres, _cnote, _cchips, _ctok, _ccorr, _cmat, _ch, _chain, _blockedChoiceLabel>>
<<if _cchips lt 0 && $player.money < Math.abs(_cchips)>>
<div class="btn non-interacting"><<button _blockedChoiceLabel>><</button>></div>
<<else>>
<div class="btn"><<button _ch.label>>
<<if _cchips neq 0>><<set $player.money += _cchips>><</if>>
<<if _ctok gt 0>><<run awardVictoryTokens($cruiseSkills, _ctok)>><</if>>
<<if _ccorr neq 0>><<set $ship.corr = Math.min(6, Math.max(0, ($ship.corr || 0) + _ccorr))>><</if>>
<<if _cmat neq "">><<set $cruiseInventory[_cmat] = ($cruiseInventory[_cmat] || 0) + 1>><</if>>
<<run $ship.chains[$activeChain].choices.push(_ch.label)>>
<<set $ship.chains[$activeChain].stage = nextChainStage(_chain, $ship.chains[$activeChain].stage, _ch)>>
<<set $ship.chains[$activeChain].beatDone = true>>
<<if !_ch.endsChain && $ship.chains[$activeChain].stage gte chainLength(getChain($ship.chains[$activeChain].key))>><<run unlockCruiseAchievement("chainComplete")>><</if>>
/* Some choices carry only an effect note and no result prose - show the
bare note then, not a leading-space parenthetical. */
<<set $chainMsg = (_cres !== "" ? (_cnote !== "" ? _cres + " (" + _cnote + ")" : _cres) : _cnote)>>
<<goto "Ship_ChainBeat">>
<</button>></div>
<</if>>
<</capture>>
<</for>>
</div>
<div class="btn padding-top"><<button "Back to the hall" "Ship_MainHall">><<set $chainMsg = "">><</button>></div>
<</if>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _npc = getRosterEntry($cruiseRoster, $activeNpcId)>>
<<if not _npc>>
<<goto $player.info.currentLocation>>
<<else>>
<<set _b = cruiseNpcBlurb(_npc)>>
<<set _tier = backstoryRevealTier(_npc.stats.trust)>>
/* Read-and-clear the one-shot social-web beat (cruiseScheme): show it on the render
that follows the move, then wipe it so an unrelated re-render does not repeat it.
Set before <<timed>> so the timed block captures the temp var. */
<<set _beat = $schemeBeat>><<set $schemeBeat = "">>
<<timed 0.2s>>
<<set _face = npcFacePath(_b.stage, _npc.id)>>
<<set _bs = motiveBackstory(_npc.motive, _tier)>>
<div class="cruise-dossier">
<div class="cruise-dossier__main">
<div class="cruise-dossier__portrait"><img class="cruise-dossier__face" @src="_face" @alt="_npc.name"></div>
<div class="cruise-dossier__body">
<div class="cruise-dossier__role"><<= _b.role>> · <<= _b.gender>></div>
<div class="cruise-dossier__name"><<= cruiseDisplayName(_npc)>></div>
<div class="cruise-dossier__goal">"<<= _b.goal>>"</div>
<<if _npc.read or _npc.stats.trust gte 30>>
<div class="cruise-dossier__kink"><span class="cruise-dossier__kink-tag">In bed</span> <<= cruiseKinkLabel(npcKink(_npc))>></div>
<</if>>
<div class="cruise-meter">
<span class="cruise-meter__label">Feminization</span>
<span class="cruise-meter__track"><span class="cruise-meter__fill cruise-meter__fill--fem" @style="'width:' + Math.round(_b.stage / 6 * 100) + '%'"></span></span>
<span class="cruise-meter__val"><<= _b.stage>>/6</span>
</div>
<div class="cruise-meter">
<span class="cruise-meter__label">Trust</span>
<span class="cruise-meter__track"><span class="cruise-meter__fill" @style="'width:' + Math.min(100, Math.max(0, _npc.stats.trust)) + '%'"></span></span>
<span class="cruise-meter__val"><<= _npc.stats.trust>>/100</span>
</div>
</div>
</div>
<div class="cruise-dossier__back"><<if _bs isnot "">><<= _bs>> <<else>>They keep their reasons close - talk, and they may open up.<</if>></div>
</div>
<<if _npc.read>>
<div class="cruise-read">
<div class="cruise-read__tell"><<= _npc.read.tell>></div>
<div class="cruise-read__tip"><<= _npc.read.tip>></div>
/* The perk seeds he boarded with, now that they actually steer him (cruisePerks):
reading a man pays out his temperament, not just his table tell. */
<<set _perkInfos = perkInfoOf(_npc)>>
<<if _perkInfos.length gt 0>>
<div class="cruise-read__perks">
<<for _pk range _perkInfos>>
<div class="cruise-read__perk"><span class="cruise-read__perk-name"><<= _pk.name>></span> <<= _pk.hint>></div>
<</for>>
</div>
<</if>>
</div>
<</if>>
<<if _npc.confided>>
<div class="cruise-confession">
<div class="cruise-confession__label">The mask slips, just for a moment:</div>
<div class="cruise-confession__text"><<= npcConfession(_npc.archetype)>></div>
</div>
<</if>>
<<if _npc.betrayedYou>>
<div class="cruise-actnote">This is the one who sold you out in the night. <<if _npc.betrayedYou is "rage">>You got in his face about it, and he has not forgotten.<<elseif _npc.betrayedYou is "cold">>You marked him and walked away cold. He watches you carefully now.<<else>>You let it go - the «Sirena» makes traitors of everyone - and he knows you know it.<</if>></div>
<</if>>
/* His standing among the other contestants, read off the live society web
(cruiseBonds): who he leans on, who he has bad blood with. Lets the player work
the politics - turn his enemies against him, or lean on a man his ally trusts. */
<<set _ties = npcTies(_npc, $cruiseRoster)>>
<<if _ties.allies.length gt 0 or _ties.enemies.length gt 0>>
<div class="cruise-politics">
<div class="cruise-politics__label">Where he stands among the manifest:</div>
<<if _ties.allies.length gt 0>><div class="cruise-politics__row cruise-politics__row--ally"><span class="cruise-politics__tag">Stands with</span> <<= _ties.allies.map(function (t) { return t.name; }).join(", ")>></div><</if>>
<<if _ties.enemies.length gt 0>><div class="cruise-politics__row cruise-politics__row--enemy"><span class="cruise-politics__tag">Bad blood with</span> <<= _ties.enemies.map(function (t) { return t.name; }).join(", ")>></div><</if>>
</div>
<</if>>
<<if _beat isnot "">>
<div class="cruise-afterglow cruise-scheme-beat"><<= formatDialogue(_beat)>></div>
<</if>>
<<if $npcLine isnot "">>
<div class="cruise-speech">
<div class="cruise-speech__who"><<= _npc.name>></div>
<div class="cruise-speech__line">"<<= $npcLine>>"</div>
</div>
<</if>>
/* PROTECTION (cruiseDrama): an NPC-initiated plea. If a hunter standing on this man's
deck has fixed on him (targetId), he asks the player to step between them. Standing
up breaks the fixation (clears the hunter's targetId so the predation redirects),
eases the prey and wins his loyalty, and costs the hunter's goodwill. Relational
only (no chips); not gated by the Work-the-Web cooldown, but the act costs time and
ends the hunt, so it cannot be farmed. */
<<set _stalker = (not $ship.caged and _b.stage lt 6) ? hunterStalking($cruiseRoster, _npc.id, _npc.location) : null>>
<<if _stalker>>
<div class="cruise-proposition cruise-proposition--plea">
<div class="cruise-proposition__label">🛡️ <<= _npc.name>> is being hunted. <<= _stalker.name>> has him cornered, and under his breath he is asking you to stand between them.</div>
<div class="cruise-proposition__line"><<= protectionAskLine(_npc.archetype, _stalker.name)>></div>
</div>
/* Four ways through the same predation, on different axes: stand at his side (safe,
always works), buy the hunter off (money), or face the hunter down (nerve - can
fail). Cost + odds precomputed off the live hunter for the button labels. */
<<set _hunter = getRosterEntry($cruiseRoster, _stalker.id)>>
<<set _payCost = hunterPayoffCost(_hunter)>>
<<set _intimOdds = intimidateHunterChance(_hunter, { playerFemStage: femStage($player), persuasionLevel: $cruiseSkills.persuasion })>>
<<set _payLabel = "Pay " + _stalker.name + " off (" + _payCost + " chips)">>
<<set _intimLabel = "Face " + _stalker.name + " down <span class='cruise-btn-odds'>" + _intimOdds + "%</span>">>
<div class="cruise-plea-acts">
<div class="btn" data-tip="Put yourself on his side and warn the hunter off. It breaks the hunt, eases his fear, and wins his loyalty (+8 trust) - but the hunter will mark you for it."><<button "Stand up for him">>
<<set _p = getRosterEntry($cruiseRoster, $activeNpcId)>>
<<set _h = getRosterEntry($cruiseRoster, _stalker.id)>>
<<if _p and _h>>
<<set $schemeBeat = protectionActionText('defend', _h.name, _p.name)>>
<<run adjustCruiseStat(_p.stats, "fear", -10)>>
<<run adjustCruiseStat(_p.stats, "trust", 8)>>
<<run adjustCruiseStat(_p.stats, "shame", -4)>>
<<set _h.targetId = null>>
<<run adjustCruiseStat(_h.stats, "standing", -3)>>
<<run adjustCruiseStat(_h.stats, "trust", -5)>>
<</if>>
<<set $npcLine = "">>
<<SpendTime 20>>
<<goto "Ship_NpcInteract">>
<</button>></div>
<<if $player.money gte _payCost>>
<div class="btn" data-tip="Slip the hunter chips to go find easier prey. It always works, but it costs you - and the hunter loses a little standing for taking a buy-out."><<button _payLabel>>
<<set _p = getRosterEntry($cruiseRoster, $activeNpcId)>>
<<set _h = getRosterEntry($cruiseRoster, _stalker.id)>>
<<if _p and _h>>
<<set $player.money = $player.money - hunterPayoffCost(_h)>>
<<set $schemeBeat = payoffHunterText(_h.name, _p.name)>>
<<run adjustCruiseStat(_p.stats, "fear", -8)>>
<<run adjustCruiseStat(_p.stats, "trust", 6)>>
<<run adjustCruiseStat(_p.stats, "shame", -3)>>
<<set _h.targetId = null>>
<<run adjustCruiseStat(_h.stats, "standing", -4)>>
<</if>>
<<set $npcLine = "">>
<<SpendTime 15>>
<<goto "Ship_NpcInteract">>
<</button>></div>
<</if>>
<div class="btn" data-tip="Get in the hunter's way and make the prey more grief than he is worth. It can fail - easier the more masculine and persuasive you are, against a fearful, low-standing hunter. Win and the hunt breaks and the prey is yours for life; lose and the hunter leaves emboldened, the hunt still on."><<button _intimLabel>>
<<set _p = getRosterEntry($cruiseRoster, $activeNpcId)>>
<<set _h = getRosterEntry($cruiseRoster, _stalker.id)>>
<<if _p and _h>>
<<set _ir = resolveIntimidateHunter(_h, _p.name, { playerFemStage: femStage($player), persuasionLevel: $cruiseSkills.persuasion })>>
<<set $schemeBeat = _ir.text>>
<<if _ir.ok>>
<<set _h.targetId = null>>
<<run adjustCruiseStat(_p.stats, "fear", -8)>>
<<run adjustCruiseStat(_p.stats, "trust", 10)>>
<<run adjustCruiseStat(_p.stats, "shame", -4)>>
<<else>>
<<run adjustCruiseStat(_p.stats, "shame", 3)>>
<</if>>
<</if>>
<<set $npcLine = "">>
<<SpendTime 15>>
<<goto "Ship_NpcInteract">>
<</button>></div>
<div class="btn" data-tip="Tell him to fight his own battles. He takes the refusal hard, and remembers it."><<button "Tell him to fight his own battles">>
<<set _p = getRosterEntry($cruiseRoster, $activeNpcId)>>
<<set _h = getRosterEntry($cruiseRoster, _stalker.id)>>
<<if _p>>
<<set $schemeBeat = protectionActionText('rebuff', (_h ? _h.name : _stalker.name), _p.name)>>
<<run adjustCruiseStat(_p.stats, "shame", 4)>>
<<run adjustCruiseStat(_p.stats, "trust", -2)>>
<</if>>
<<set $npcLine = "">>
<<SpendTime 5>>
<<goto "Ship_NpcInteract">>
<</button>></div>
</div>
<</if>>
<div class="cruise-imenu">
<div class="cruise-imenu__cats">
<!-- ═════ TALK - social / build trust ═════ -->
<div class="cruise-icat cruise-icat--talk">
<div class="cruise-icat__head"><span class="cruise-icat__icon">💬</span><span class="cruise-icat__title">Talk</span></div>
<div class="cruise-icat__body">
<div class="btn" data-tip="Pass some time in small talk. A slow, steady gain of trust (+3)."><<button "Talk">>
<<set _n = getRosterEntry($cruiseRoster, $activeNpcId)>>
<<run adjustCruiseStat(_n.stats, "trust", 3)>>
<<set $npcLine = npcTalkLine(_n.archetype, { trust: _n.stats.trust, femStage: cruiseNpcBlurb(_n).stage, fear: _n.stats.fear, shame: _n.stats.shame, horny: npcMood(_n).horny, playerStage: femStage($player), playerRep: playerRep($ship) })>>
<<SpendTime 15>>
<<goto "Ship_NpcInteract">>
<</button>></div>
<<if $player.money gte 40>>
<div class="btn" data-tip="Stand him a round at the bar. He warms to you fast (+8 trust)."><<button "Buy a drink (40 chips)">>
<<set _n = getRosterEntry($cruiseRoster, $activeNpcId)>>
<<set $player.money = $player.money - 40>>
<<run adjustCruiseStat(_n.stats, "trust", 8)>>
<<set $npcLine = npcSay(_n.archetype, "gift", { trust: _n.stats.trust, femStage: cruiseNpcBlurb(_n).stage, fear: _n.stats.fear, shame: _n.stats.shame, horny: npcMood(_n).horny })>>
<<SpendTime 20>>
<<goto "Ship_NpcInteract">>
<</button>></div>
<</if>>
<<set _gifts = [{ id: "fine_liquor", trust: 12 }, { id: "perfume", trust: 6 }, { id: "trinket", trust: 6 }, { id: "cigarettes", trust: 6 }]>>
<<for _g range _gifts>>
<<capture _g>>
<<if ($cruiseInventory[_g.id] || 0) gt 0>>
<<set _gi = getCruiseItem(_g.id)>>
<<set _glbl = "Give the " + (_gi ? _gi.name.toLowerCase() : _g.id) + " (+" + _g.trust + " trust)">>
<div class="btn" data-tip="Part with one of your luxuries. A good gift buys real goodwill."><<button _glbl>>
<<set _n = getRosterEntry($cruiseRoster, $activeNpcId)>>
<<set $cruiseInventory[_g.id] = $cruiseInventory[_g.id] - 1>>
<<run adjustCruiseStat(_n.stats, "trust", _g.trust)>>
<<set $npcLine = npcSay(_n.archetype, "gift", { trust: _n.stats.trust, femStage: cruiseNpcBlurb(_n).stage, fear: _n.stats.fear, shame: _n.stats.shame, horny: npcMood(_n).horny })>>
<<SpendTime 10>>
<<goto "Ship_NpcInteract">>
<</button>></div>
<</if>>
<</capture>>
<</for>>
<<if _npc.stats.trust gte 60 and not _npc.confided>>
<div class="btn" data-tip="He trusts you enough to drop the mask. Hear what is really driving him."><<button "Let them open up">>
<<set _n = getRosterEntry($cruiseRoster, $activeNpcId)>>
<<set _n.confided = true>>
<<run adjustCruiseStat(_n.stats, "trust", 5)>>
<<set $npcLine = "">>
<<SpendTime 20>>
<<goto "Ship_NpcInteract">>
<</button>></div>
<</if>>
<<if _npc.stats.trust gte 30>>
<div class="btn" data-tip="Get him to read the room for you - who to trust aboard, who to keep wide of, who just got burned."><<button "Ask about the others">>
<<set _n = getRosterEntry($cruiseRoster, $activeNpcId)>>
<<run adjustCruiseStat(_n.stats, "trust", 1)>>
<<set $npcLine = shipGossip(_n, $cruiseRoster)>>
<<SpendTime 15>>
<<goto "Ship_NpcInteract">>
<</button>></div>
<</if>>
</div>
</div>
<!-- ═════ WORK THE WEB - act on his ties to the other men (cruiseScheme) ═════ -->
/* Turn the dossier's read-only politics into levers: side with him against the man
he hates, talk that grudge down, poison him against a friend, or trade on a shared
connection. socialLeversFor auto-resolves each target and gates by trust; the whole
set is one social play per man per day (_npc.webWorked, cleared at sleep). */
<<set _levers = (not $ship.caged) ? socialLeversFor(_npc, $cruiseRoster) : []>>
<<if _levers.length gt 0>>
<div class="cruise-icat cruise-icat--web">
<div class="cruise-icat__head"><span class="cruise-icat__icon">🕸️</span><span class="cruise-icat__title">Work the Web</span></div>
<div class="cruise-icat__body">
<<if _npc.webWorked>>
<div class="cruise-actnote">You have already worked <<= _npc.name>> over today. Lean on him again before the day turns and he will start to wonder what you are really after - let it sit until morning.</div>
<<else>>
<div class="cruise-actnote">He has ties among the manifest you can pull on. Working a man this way is a day's effort - pick one move.</div>
<<for _lv range _levers>>
<<capture _lv>>
<div class="btn" @data-tip="_lv.tip"><<button _lv.label>>
<<set _n = getRosterEntry($cruiseRoster, $activeNpcId)>>
<<set _tg = getRosterEntry($cruiseRoster, _lv.targetId)>>
<<if _n and _tg>>
<<if _lv.lever is "sideWith">>
<<set $schemeBeat = resolveSideWith(_n, _tg)>>
<<elseif _lv.lever is "talkDown">>
<<set $schemeBeat = resolveTalkDown(_n, _tg)>>
<<elseif _lv.lever is "poison">>
<<set _pr = resolvePoison(_n, _tg, $cruiseAlliances, { persuasionLevel: $cruiseSkills.persuasion })>>
<<set $schemeBeat = _pr.text>>
<<elseif _lv.lever is "vouch">>
<<set $schemeBeat = resolveVouch(_n, _tg)>>
<</if>>
<<set _n.webWorked = true>>
<</if>>
<<set $npcLine = "">>
<<SpendTime 20>>
<<goto "Ship_NpcInteract">>
<</button>></div>
<</capture>>
<</for>>
<</if>>
</div>
</div>
<</if>>
<!-- ═════ THE TABLES - read, ally, play ═════ -->
<div class="cruise-icat cruise-icat--tables">
<div class="cruise-icat__head"><span class="cruise-icat__icon">🃏</span><span class="cruise-icat__title">The Tables</span></div>
<div class="cruise-icat__body">
<<if not _npc.read>>
<div class="btn" data-tip="Read his tells - learn how he plays, and how to beat him at the table."><<button "Size them up">>
<<set _n = getRosterEntry($cruiseRoster, $activeNpcId)>>
<<set _n.read = readNpc(_n.archetype, npcMood(_n))>>
<<SpendTime 10>>
<<goto "Ship_NpcInteract">>
<</button>></div>
<</if>>
/* Three ways to recruit an ally, on different axes: earn his trust to the
gate and propose (free); buy a wary man's cooperation (money, below the
gate); or lean on what you know (intel/persuasion, can backfire). The two
new offers gate to trust below the propose gate, so the paths never overlap. */
<<if isAllied($cruiseAlliances, -1, _npc.id)>>
<div class="cruise-allied-note">Allied - they will go easy on you across the table.</div>
<<else>>
<<if _npc.stats.trust gte 40>>
<div class="btn" data-tip="Offer to back each other up. An ally goes easy on you across the table."><<button "Propose an alliance">>
<<set _n = getRosterEntry($cruiseRoster, $activeNpcId)>>
<<run formAlliance($cruiseAlliances, -1, _n.id, -1)>>
<<run adjustCruiseStat(_n.stats, "trust", 5)>>
<<set $npcLine = pickCruiseLine(_n.archetype, "alliance", npcMood(_n))>>
<<goto "Ship_NpcInteract">>
<</button>></div>
<</if>>
<<if canBribeAlliance(_npc, false)>>
<<set _bribeCost = allyBribeCost(_npc.stats.trust)>>
<<set _bribeLabel = "Buy his cooperation (" + _bribeCost + " chips)">>
<<if $player.money gte _bribeCost>>
<div class="btn" data-tip="Pay a wary man up front to watch your back at the tables. It always lands, but a bought, low-trust ally is the readiest to sell you out in the night."><<button _bribeLabel>>
<<set _n = getRosterEntry($cruiseRoster, $activeNpcId)>>
<<set $player.money = $player.money - allyBribeCost(_n.stats.trust)>>
<<run formAlliance($cruiseAlliances, -1, _n.id, -1)>>
<<set $schemeBeat = buyAllianceText(_n)>>
<<set $npcLine = "">>
<<SpendTime 10>>
<<goto "Ship_NpcInteract">>
<</button>></div>
<<else>>
<div class="cruise-actnote">You have sized up <<= _npc.name>>, but you cannot cover what he would want to be bought (<<= _bribeCost>> chips).</div>
<</if>>
<</if>>
<<if canLeverageAlliance(_npc, false)>>
<<set _levOdds = leverageAllianceChance(_npc, { persuasionLevel: $cruiseSkills.persuasion })>>
<<set _levLabel = "Lean on what you know <span class='cruise-btn-odds'>" + _levOdds + "%</span>">>
<div class="btn" data-tip="Use what you have sized up and what he has let slip to coerce an alliance. It can fail - land it and he falls in line, grudging and wary; botch it and he resents the squeeze and trusts you less."><<button _levLabel>>
<<set _n = getRosterEntry($cruiseRoster, $activeNpcId)>>
<<set _lr = resolveLeverageAlliance(_n, { persuasionLevel: $cruiseSkills.persuasion })>>
<<if _lr.ok>><<run formAlliance($cruiseAlliances, -1, _n.id, -1)>><</if>>
<<set $schemeBeat = _lr.text>>
<<set $npcLine = "">>
<<SpendTime 15>>
<<goto "Ship_NpcInteract">>
<</button>></div>
<</if>>
<</if>>
<<if _npc.chips gte 50 and isFullyFallen(femStage($player), $ship.corr) === false>>
<div class="btn" data-tip="Call him to the table and play him for chips."><<button "Challenge to a match">>
<<set _n = getRosterEntry($cruiseRoster, $activeNpcId)>>
<<set _skill = isAllied($cruiseAlliances, -1, _n.id) ? (_n.stats.azart / 240) : (_n.stats.azart / 120)>>
<<set _skill = Math.max(0, _skill + liveDirectorNudges().matchDifficulty)>>
<<set $rps = startRpsSession({ npcId: _n.id, npcName: _n.name, playerChips: $player.money, npcChips: _n.chips, playerHand: $cruisePlayerHand, npcHand: _n.hand, npcSkill: _skill, npcAggression: _n.stats.azart / 100 })>>
/* Not a Main-Hall table entry: clear the previous sitting's
taste line or it renders over this opponent. */
<<set $tableTaste = "">>
<<set $activeNpcId = null>><<set $npcLine = "">>
<<goto "Ship_RpsMatch">>
<</button>></div>
<</if>>
</div>
</div>
<!-- ═════ MAKE A MOVE - the feminization exchange ═════ -->
<div class="cruise-icat cruise-icat--move">
<div class="cruise-icat__head"><span class="cruise-icat__icon">🔥</span><span class="cruise-icat__title">Make a Move</span></div>
<div class="cruise-icat__body">
/* A warmed mark who simply WANTS the player (cruiseDesire) - not the cornered
recovery-seeker below. Computed once; gates the desire block and suppresses
the cold seduction in its favour. */
<<set _wantsYou = (not $ship.caged) and (not npcSeeksPlayerForRecovery(_npc)) and npcDesiresPlayer(_npc, { playerFemStage: femStage($player), playerCorr: ($ship.corr || 0), groomed: $ship.groomed })>>
/* Once-a-sleep-day intimacy gate ($ship.layPartners, the jealousy ledger doing
double duty): a man already had today cannot be chained through his whole
fall in one afternoon. Sleep resets it - never the civil-day roll. */
<<set _spentToday = ($ship.layPartners || []).includes(_npc.id)>>
<<if _spentToday>>
<div class="cruise-actnote">You have already had <<= _npc.name>> today - whatever else the two of you might do, that door reopens tomorrow.</div>
<</if>>
<<if _npc.regular and cruiseNpcBlurb(_npc).stage lt 6>>
/* A kept partner: an eager greeting, and the day's tribute he pressed on
the player on the way in (applied ONCE in the ShipPeople approach
handler, never during this hub's re-renders). The line shown is the one
stored at collection time - display only, no mutation. A fully fallen
regular (stage 6) belongs to the house and neither greets nor tributes,
matching canKeepAsRegular. */
<div class="cruise-regular">
<div class="cruise-regular__label">💐 Your regular</div>
<div class="cruise-regular__line"><<= regularGreeting(_npc.archetype)>></div>
<<if _npc.regularTributeTaken and (_npc.tributeLine || "") isnot "">>
<div class="cruise-regular__tribute"><<= formatDialogue(_npc.tributeLine)>></div>
<</if>>
</div>
<</if>>
<<if npcSeeksPlayerForRecovery(_npc) and not $ship.caged and not _spentToday>>
<div class="cruise-proposition">
<div class="cruise-proposition__label"><<= _npc.name>> has that hungry, cornered look - softened by the «Sirena» but not finished with himself, and he has decided you are the one he is going to climb back up on. Let him, and a stage of you passes to him.</div>
<div class="cruise-proposition__line">"<<= pickCruiseLine(_npc.archetype, "proposition", npcMood(_npc))>>"</div>
</div>
<<set _letCost = effectiveEnergyCost(20, $cruiseSkills)>>
<<if $player.status.energy.value gte _letCost>>
/* Snapshot the depicted bodies into $climaxScene BEFORE the transfer
feminizes the player, so Ship_Climax shows the act as the bodies were
when it happened (not the post-transfer body). */
<div class="btn" data-tip="Give in to him. A stage of you passes to him - and he pays for the privilege."><<button "Let him reclaim it">>
<<set _n = getRosterEntry($cruiseRoster, $activeNpcId)>>
<<set $climaxScene = { pStage: femStage($player), pGender: $player.gender(), nStage: cruiseNpcBlurb(_n).stage, nGender: _n.gender, playerPenetrates: false }>>
<<set _lc = effectiveEnergyCost(20, $cruiseSkills)>>
<<SpendEnergy $player _lc>>
<<set _rc = resolveNpcReclaimsFromPlayer(_n, 90)>><<run recordCruiseLay($ship, _n.id)>><<SpendSexStamina>><<run adjustPlayerRep($ship, -2)>>
<<set $player.money = $player.money + _rc.pay>>
<<run applyFeminizationStage($player, 1)>>
<<if ($ship.corr || 0) lt 6 and ($ship.corr || 0) lt femStage($player)>><<set $ship.corr = ($ship.corr || 0) + 1>><</if>>
<<run unlockCruiseAchievement("submitted")>>
<<set $climaxInitiator = "npc">>
<<set $npcLine = "">>
<<SpendTime 60>>
<<goto "Ship_Climax">>
<</button>></div>
<<else>>
<div class="cruise-caged-note">You are too worn out for this - rest first.</div>
<</if>>
<div class="btn" data-tip="Turn him down cold. It shames him and costs him standing among the others."><<button "Refuse him">>
<<set _n = getRosterEntry($cruiseRoster, $activeNpcId)>>
<<run adjustCruiseStat(_n.stats, "shame", 6)>>
<<run adjustCruiseStat(_n.stats, "standing", -4)>>
<<set $npcLine = pickCruiseLine(_n.archetype, "rebuffed", npcMood(_n))>>
<<goto "Ship_NpcInteract">>
<</button>></div>
<</if>>
/* DESIRE / REGULAR: a mark who wants the player (cruiseDesire), or a standing
partner. Eager and mutual - it always lands, costs less energy, lifts his
trust, and a stage of him still passes to you. The warm register (no shame,
no fear) is set in the engine; Ship_Climax reads $climaxDesire for the
afterglow. Distinct from the cold seduction below and the recovery grab above. */
<<if (_wantsYou or _npc.regular) and _b.stage lt 6 and not $ship.caged and not _spentToday>>
<<if not _npc.regular>>
<div class="cruise-proposition cruise-proposition--want">
<div class="cruise-proposition__label"><<= _npc.name>> wants you - not to climb back up off you, just you. <<= cruiseKinkLabel(npcKink(_npc))>></div>
<div class="cruise-proposition__line"><<= desireProposition(_npc.archetype)>></div>
</div>
<</if>>
<<set _desCost = effectiveEnergyCost(15, $cruiseSkills)>>
<<if $player.status.energy.value gte _desCost>>
<<set _lean = npcKink(_npc)>>
<<set _topLbl = _npc.regular ? "Take him to your bunk" : "Take what he is offering">>
<<set _botLbl = _npc.regular ? "Let him have you tonight" : "Give him the night his way">>
<div class="cruise-actnote"><<if _lean is "wantsTop">>He likes to be the one who takes - though he is yours whichever way you want it. <<elseif _lean is "wantsBottom">>He wants to be the one taken - lead, and he will give you everything. <<else>>He will go whichever way you steer it. <</if>>A stage of him passes to you all the same; wanted, it costs you both far less.</div>
<div class="btn" data-tip="Top him. He wants this - it lands, lifts his trust, and costs little energy."><<button _topLbl>>
<<set _ec = effectiveEnergyCost(15, $cruiseSkills)>>
<<SpendEnergy $player _ec>>
<<set _n = getRosterEntry($cruiseRoster, $activeNpcId)>>
<<set $climaxScene = { pStage: femStage($player), pGender: $player.gender(), nStage: cruiseNpcBlurb(_n).stage, nGender: _n.gender, playerPenetrates: true }>>
<<run resolveDesireEncounter(_n)>>
<<run recordCruiseLay($ship, _n.id)>><<SpendSexStamina>><<run adjustPlayerRep($ship, 2)>>
<<if femStage($player) gt 0>><<run applyFeminizationStage($player, -1)>><</if>>
<<set $climaxDesire = true>>
<<run unlockCruiseAchievement("seduce")>>
<<set $npcLine = pickCruiseLine(_n.archetype, "seduced", npcMood(_n))>>
<<SpendTime 60>>
<<goto "Ship_Climax">>
<</button>></div>
<div class="btn" data-tip="Let him top you while you steer it. He wants this - it lands and lifts his trust."><<button _botLbl>>
<<set _ec = effectiveEnergyCost(15, $cruiseSkills)>>
<<SpendEnergy $player _ec>>
<<set _n = getRosterEntry($cruiseRoster, $activeNpcId)>>
<<set $climaxScene = { pStage: femStage($player), pGender: $player.gender(), nStage: cruiseNpcBlurb(_n).stage, nGender: _n.gender, playerPenetrates: false }>>
<<run resolveDesireEncounter(_n)>>
<<run recordCruiseLay($ship, _n.id)>><<SpendSexStamina>><<run adjustPlayerRep($ship, 2)>>
<<if femStage($player) gt 0>><<run applyFeminizationStage($player, -1)>><</if>>
<<set $climaxDesire = true>>
<<run unlockCruiseAchievement("seduce")>>
<<set $npcLine = pickCruiseLine(_n.archetype, "seduced", npcMood(_n))>>
<<SpendTime 60>>
<<goto "Ship_Climax">>
<</button>></div>
<<else>>
<div class="cruise-caged-note">You are too worn to give him the night - rest first.</div>
<</if>>
<</if>>
/* THREESOME (cruiseThreesome): a regular or a desiring mark brings in a second
man - a friend he is bonded to (the society web paying off), or another
admirer. Two men, one scene; both feminize a stage, the player climbs one.
Snapshot both bodies BEFORE the transfer so Ship_Threesome shows them as they
were. threesomePartnerFor returns null unless the mark can anchor. */
<<set _third = (not $ship.caged) ? threesomePartnerFor(_npc, $cruiseRoster, { playerFemStage: femStage($player), playerCorr: ($ship.corr || 0), groomed: $ship.groomed }) : null>>
<<if _third and not _spentToday and not ($ship.layPartners || []).includes(_third.id)>>
<<set _thirdKind = threesomeBondKind(_npc, _third)>>
<div class="cruise-proposition cruise-proposition--want">
<div class="cruise-proposition__label">👥 <<= _npc.name>> is not alone tonight. <<if _thirdKind is "friend">>He has brought <<= _third.name>>, the one man aboard he trusts at his back, and the two of them have plainly already settled it between them.<<else>><<= _third.name>> has been wanting you just as openly, and the two of them would sooner share you than compete for you.<</if>> Take them both, and a stage of each passes to you.</div>
</div>
<<set _thirdCost = effectiveEnergyCost(25, $cruiseSkills)>>
<<if $player.status.energy.value gte _thirdCost>>
<div class="btn" data-tip="Take both men at once. Each feminizes a stage; you climb one. Costs more energy."><<button "Take them both">>
<<set _ec = effectiveEnergyCost(25, $cruiseSkills)>>
<<SpendEnergy $player _ec>>
<<set _an = getRosterEntry($cruiseRoster, $activeNpcId)>>
<<set _pn = getRosterEntry($cruiseRoster, _third.id)>>
<<set $threesome = { anchorId: _an.id, partnerId: _pn.id, aName: _an.name, bName: _pn.name, aGender: _an.gender, bGender: _pn.gender, aStage: cruiseNpcBlurb(_an).stage, bStage: cruiseNpcBlurb(_pn).stage, pGender: $player.gender(), kind: threesomeBondKind(_an, _pn) }>>
<<run resolveDesireEncounter(_an)>><<run recordCruiseLay($ship, _an.id)>><<SpendSexStamina>><<run adjustPlayerRep($ship, 2)>>
<<run resolveDesireEncounter(_pn)>><<run recordCruiseLay($ship, _pn.id)>>
<<run bondAfterThreesome(_an, _pn)>>
<<if femStage($player) gt 0>><<run applyFeminizationStage($player, -1)>><</if>>
<<run unlockCruiseAchievement("threesome")>>
<<set $npcLine = "">>
<<SpendTime 90>>
<<goto "Ship_Threesome">>
<</button>></div>
<<else>>
<div class="cruise-caged-note">Two of them at once is more than you have in you right now - rest first.</div>
<</if>>
<</if>>
<<if _b.stage lt 6 and not $ship.caged and not _wantsYou and not _npc.regular and not _spentToday>>
<<set _seduceCost = effectiveEnergyCost(25, $cruiseSkills)>>
<<if $player.status.energy.value gte _seduceCost>>
/* Two situational choices, both player-initiated, so both RECLAIM a stage
(the player climbs, the NPC feminizes): "Take him" = the player tops;
"Have him take you" = the player asks to be taken and uses the NPC to
climb anyway. The role is the player's choice (the situation), not his
body. Snapshot the depicted bodies AND the chosen physical role into
$climaxScene BEFORE the transfer mutates them, so a fully-feminized
player is still shown as the body he was during the act. */
<<set _femP = femStage($player)>>
/* Money axis to landing a move: stand the mark a round to loosen him up
this evening - a one-shot odds bump, distinct from grinding his trust
with "buy a drink". $ship.pliedNpcId holds the man it is spent on;
consumed on the next attempt (win or lose). */
<<set _plied = ($ship.pliedNpcId === _npc.id)>>
<<set _plyBonus = _plied ? 12 : 0>>
<<set _topOdds = playerSeductionChance(_npc, { playerFemStage: _femP, playerTops: true, persuasionLevel: $cruiseSkills.persuasion, extraOdds: _plyBonus })>>
<<set _botOdds = playerSeductionChance(_npc, { playerFemStage: _femP, playerTops: false, persuasionLevel: $cruiseSkills.persuasion, extraOdds: _plyBonus })>>
/* Each option carries its landing odds inline in the button label (gold
<span>, distinct from the rose action text), so the chance reads right
on the choice instead of a separate preview plate. Precompute the label
string - an expression in the macro arg would split on the spaces. */
<<set _topLabel = "Take him <span class='cruise-btn-odds'>" + _topOdds + "%</span>">>
<<set _botLabel = "Have him take you <span class='cruise-btn-odds'>" + _botOdds + "%</span>">>
<div class="cruise-actnote">Make a move on <<= _npc.name>>. Either way a stage of him passes to you - your call how you take it. How it lands rides on how far he trusts you and how corrupted he is.</div>
<<if _plied>>
<div class="cruise-actnote">He is loose and grinning from the round you stood him - your next move on him lands easier (+12%).</div>
<<elseif $player.money gte 40>>
<div class="btn" data-tip="Stand him drinks to loosen him up before you move - a one-off +12% to your next move on him, win or lose. Buys his guard down, not his trust. 40 chips."><<button "Stand him a round (40 chips)">>
<<set _n = getRosterEntry($cruiseRoster, $activeNpcId)>>
<<set $player.money = $player.money - 40>>
<<set $ship.pliedNpcId = _n.id>>
<<set $npcLine = npcSay(_n.archetype, "gift", { trust: _n.stats.trust, femStage: cruiseNpcBlurb(_n).stage, fear: _n.stats.fear, shame: _n.stats.shame, horny: npcMood(_n).horny })>>
<<SpendTime 20>>
<<goto "Ship_NpcInteract">>
<</button>></div>
<</if>>
<div class="btn" data-tip="You top him - easier the more masculine you are and the more he trusts you. A stage of him still passes to you."><<button _topLabel>>
<<set _ec = effectiveEnergyCost(25, $cruiseSkills)>>
<<SpendEnergy $player _ec>>
<<set _n = getRosterEntry($cruiseRoster, $activeNpcId)>>
<<set _pb = (($ship.pliedNpcId === _n.id) ? 12 : 0) + repSeduceBonus(playerRep($ship))>>
<<set $climaxScene = { pStage: femStage($player), pGender: $player.gender(), nStage: cruiseNpcBlurb(_n).stage, nGender: _n.gender, playerPenetrates: true }>>
<<if $ship.aphrodisiacCharge>>
<<set _res = resolvePlayerSeduction(_n, { playerFemStage: femStage($player), playerTops: true, persuasionLevel: $cruiseSkills.persuasion, extraOdds: _pb }, function () { return 0; })>>
<<set $ship.aphrodisiacCharge = false>>
<<else>>
<<set _res = resolvePlayerSeduction(_n, { playerFemStage: femStage($player), playerTops: true, persuasionLevel: $cruiseSkills.persuasion, extraOdds: _pb })>>
<</if>>
<<set $ship.pliedNpcId = null>>
<<SpendTime 60>>
<<if _res.ok>>
<<run recordCruiseLay($ship, _n.id)>><<SpendSexStamina>><<run adjustPlayerRep($ship, 2)>>
<<if femStage($player) gt 0>><<run applyFeminizationStage($player, -1)>><</if>>
<<run unlockCruiseAchievement("seduce")>>
<<set $npcLine = pickCruiseLine(_n.archetype, "seduced", npcMood(_n))>>
<<goto "Ship_Climax">>
<<else>>
<<set $npcLine = pickCruiseLine(_n.archetype, "taunt", npcMood(_n))>>
<<goto "Ship_NpcInteract">>
<</if>>
<</button>></div>
<div class="btn" data-tip="He tops you - easier the more feminized you are and the more he trusts you. A stage of him still passes to you."><<button _botLabel>>
<<set _ec = effectiveEnergyCost(25, $cruiseSkills)>>
<<SpendEnergy $player _ec>>
<<set _n = getRosterEntry($cruiseRoster, $activeNpcId)>>
<<set _pb = (($ship.pliedNpcId === _n.id) ? 12 : 0) + repSeduceBonus(playerRep($ship))>>
<<set $climaxScene = { pStage: femStage($player), pGender: $player.gender(), nStage: cruiseNpcBlurb(_n).stage, nGender: _n.gender, playerPenetrates: false }>>
<<if $ship.aphrodisiacCharge>>
<<set _res = resolvePlayerSeduction(_n, { playerFemStage: femStage($player), playerTops: false, persuasionLevel: $cruiseSkills.persuasion, extraOdds: _pb }, function () { return 0; })>>
<<set $ship.aphrodisiacCharge = false>>
<<else>>
<<set _res = resolvePlayerSeduction(_n, { playerFemStage: femStage($player), playerTops: false, persuasionLevel: $cruiseSkills.persuasion, extraOdds: _pb })>>
<</if>>
<<set $ship.pliedNpcId = null>>
<<SpendTime 60>>
<<if _res.ok>>
<<run recordCruiseLay($ship, _n.id)>><<SpendSexStamina>><<run adjustPlayerRep($ship, 2)>>
<<if femStage($player) gt 0>><<run applyFeminizationStage($player, -1)>><</if>>
<<run unlockCruiseAchievement("seduce")>>
<<set $npcLine = pickCruiseLine(_n.archetype, "seduced", npcMood(_n))>>
<<goto "Ship_Climax">>
<<else>>
<<set $npcLine = pickCruiseLine(_n.archetype, "taunt", npcMood(_n))>>
<<goto "Ship_NpcInteract">>
<</if>>
<</button>></div>
<<else>>
<div class="cruise-caged-note">You are too worn out to make a move - rest first.</div>
<</if>>
<<elseif $ship.caged>>
<div class="cruise-caged-note">The cage keeps you from making a move on anyone.</div>
<</if>>
/* THE FULLY FALLEN: a mark at stage 6 has no stage left to move - desire,
recovery and every seduction path gate below 6 - but the house's finished
work is not off the menu. The player can still have him: nothing transfers
either way (resolveFallenEncounter), the same once-a-sleep-day gate
applies, and the body shown is the one the voyage built. */
<<if _b.stage gte 6 and not $ship.caged and not _spentToday>>
<div class="cruise-proposition cruise-proposition--want">
<div class="cruise-proposition__label"><<= _npc.name>> is the «Sirena»'s finished work - nothing left in him for you to win or lose, and the body is yours the moment you reach for it. <<= cruiseKinkLabel(npcKink(_npc))>></div>
<div class="cruise-proposition__line"><<= fallenProposition()>></div>
</div>
<<set _fallCost = effectiveEnergyCost(15, $cruiseSkills)>>
<<if $player.status.energy.value gte _fallCost>>
<div class="cruise-actnote">No stage passes either way - he has nothing left to give but the body itself, and it gives gladly.</div>
<div class="btn" data-tip="Take him. Nothing transfers - just the night, and he wants it."><<button "Take him">>
<<set _ec = effectiveEnergyCost(15, $cruiseSkills)>>
<<SpendEnergy $player _ec>>
<<set _n = getRosterEntry($cruiseRoster, $activeNpcId)>>
<<set $climaxScene = { pStage: femStage($player), pGender: $player.gender(), nStage: cruiseNpcBlurb(_n).stage, nGender: _n.gender, playerPenetrates: true }>>
<<run resolveFallenEncounter(_n)>>
<<run recordCruiseLay($ship, _n.id)>><<SpendSexStamina>>
<<set $npcLine = pickCruiseLine(_n.archetype, "seduced", npcMood(_n))>>
<<SpendTime 60>>
<<goto "Ship_Climax">>
<</button>></div>
<<else>>
<div class="cruise-caged-note">You are too worn out for this - rest first.</div>
<</if>>
<</if>>
/* KEEP HIM: turn enough encounters (or a deep, trusting want) into a standing
partner - a relationship the player can build instead of a string of one-offs. */
<<if canKeepAsRegular(_npc, { playerFemStage: femStage($player), playerCorr: ($ship.corr || 0), groomed: $ship.groomed }) and not $ship.caged>>
<div class="cruise-keep">
<div class="cruise-keep__note">You have been back to <<= _npc.name>> enough that it has stopped feeling like a one-night transaction.</div>
<div class="btn" data-tip="Make this a standing arrangement: he greets you, costs less to bed, and presses a tribute on you once a day."><<button "Make him your regular">>
<<set _n = getRosterEntry($cruiseRoster, $activeNpcId)>>
<<set _n.regular = true>>
<<run adjustCruiseStat(_n.stats, "trust", 8)>>
<<run unlockCruiseAchievement("keepRegular")>>
<<set $npcLine = regularGreeting(_n.archetype)>>
<<goto "Ship_NpcInteract">>
<</button>></div>
</div>
<</if>>
</div>
</div>
</div>
<div class="cruise-imenu__foot">
<div class="btn" data-tip="End the conversation and head back to the deck."><<button "Step away">><<set $activeNpcId = null>><<set $npcLine = "">><<set $schemeBeat = "">><<goto $player.info.currentLocation>><</button>></div>
</div>
</div>
<</timed>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Cruise/Locations/engine_room_hold.jpg">>
<<timed 0.2s>>
<<ShipHead "Workbench">>
<<if $craftMsg isnot "">><<ShipMessage $craftMsg>><<set $craftMsg = "">><</if>>
<div class="skills-tokens">Crafting level <<= $cruiseSkills.crafting>></div>
<<set _invKeys = Object.keys($cruiseInventory).filter(function (k) { return $cruiseInventory[k] > 0; })>>
<div class="craft-section">Your kit</div>
<<if _invKeys.length gt 0>>
<div class="skills-grid">
<<for _k range _invKeys>>
<<capture _k>>
<<set _item = getCruiseItem(_k)>>
<div class="skill-card">
<<if _k is "marked_cards">><img class="skill-card__thumb" src="Media/Cruise/Items/marked_cards.jpg" alt="A fanned-out deck of marked cards"><</if>>
<div class="skill-card__name"><<= _item ? _item.name : _k>> <span class="skill-card__lvl">×<<= $cruiseInventory[_k]>></span></div>
<div class="skill-card__desc"><<= _item ? _item.desc : "">></div>
<<if _k is "cage_key" and $ship.caged>>
<div class="btn"><<button "Use - unlock the cage">><<set $cruiseInventory[_k] = $cruiseInventory[_k] - 1>><<set $ship.caged = false>><<set $craftMsg = "The cage falls away.">><<goto "Ship_Crafting">><</button>></div>
<<elseif _k is "mask" and not $ship.disguised>>
<div class="btn"><<button "Use - put it on">><<set $cruiseInventory[_k] = $cruiseInventory[_k] - 1>><<set $ship.disguised = true>><<set $craftMsg = "Behind the mask you are just another shadow on the deck.">><<goto "Ship_Crafting">><</button>></div>
<<elseif _k is "masculinity_token" and femStage($player) gt 0>>
<div class="btn"><<button "Use - reclaim a stage">><<set $cruiseInventory[_k] = $cruiseInventory[_k] - 1>><<run applyFeminizationStage($player, -1)>><<set $craftMsg = "You feel a measure of yourself return.">><<goto "Ship_Crafting">><</button>></div>
<<elseif _k is "energy_drink">>
<div class="btn"><<button "Use - drink it">><<set $cruiseInventory[_k] = $cruiseInventory[_k] - 1>><<run $player.status.energy.increase(40)>><<set $craftMsg = "The energy drink kicks in - you feel ready to push on.">><<goto "Ship_Crafting">><</button>></div>
<<elseif _k is "aphrodisiac" and not $ship.aphrodisiacCharge>>
<div class="btn"><<button "Use - dose yourself">><<set $cruiseInventory[_k] = $cruiseInventory[_k] - 1>><<set $ship.aphrodisiacCharge = true>><<set $craftMsg = "Your skin flushes and your head swims. The next move you make on someone will land.">><<goto "Ship_Crafting">><</button>></div>
<<elseif _k is "perfume" and ($ship.corr || 0) lt 6>>
<div class="btn"><<button "Use - wear it">><<set $cruiseInventory[_k] = $cruiseInventory[_k] - 1>><<set $ship.corr = Math.min(6, ($ship.corr || 0) + 1)>><<set $craftMsg = "The scent settles on you, sweet and a little shameless. You sink a touch deeper.">><<goto "Ship_Crafting">><</button>></div>
<<elseif _k is "lockpick">>
<div class="btn"><<button "Use - crack a nearby locker">><<set $cruiseInventory[_k] = $cruiseInventory[_k] - 1>><<set _pool = ["wire", "grease", "cloth", "herbs", "blank_key", "spare_chip"]>><<for _i = 0; _i lt 2; _i++>><<set _m = _pool[random(0, _pool.length - 1)]>><<set $cruiseInventory[_m] = ($cruiseInventory[_m] || 0) + 1>><</for>><<set $craftMsg = "You work the picks into a storage locker and come away with a couple of useful odds and ends.">><<goto "Ship_Crafting">><</button>></div>
<<elseif _k is "card_counter">>
<div class="btn"><<button "Use - palm it for the next match">><<set $cruiseInventory[_k] = $cruiseInventory[_k] - 1>><<set $ship.riggedRounds = ($ship.riggedRounds || 0) + 1>><<set $craftMsg = "You tuck the counter into your sleeve. You will read the next round cold.">><<goto "Ship_Crafting">><</button>></div>
<<elseif _k is "marked_cards">>
<div class="btn"><<button "Use - swap in the marked deck">><<set $cruiseInventory[_k] = $cruiseInventory[_k] - 1>><<set $ship.riggedRounds = ($ship.riggedRounds || 0) + 2>><<set $craftMsg = "The marked deck goes into your hand. The next couple of rounds are yours.">><<goto "Ship_Crafting">><</button>></div>
<<elseif _k is "loaded_die">>
<div class="btn"><<button "Use - ready the loaded die">><<set $cruiseInventory[_k] = $cruiseInventory[_k] - 1>><<set $ship.riggedRounds = ($ship.riggedRounds || 0) + 3>><<set $craftMsg = "Weighted and ready. The table tilts your way for the next few rounds.">><<goto "Ship_Crafting">><</button>></div>
<</if>>
</div>
<</capture>>
<</for>>
</div>
<<else>>
<div class="cruise-people__empty">Your kit is empty. Search the restricted rooms at night for materials.</div>
<</if>>
<div class="craft-section">Blueprints</div>
<<set _recipes = CRAFTING_RECIPES.filter(function (r) { return hasBlueprint($cruiseBlueprints, r.id); })>>
<<if _recipes.length gt 0>>
<div class="skills-grid">
<<for _r range _recipes>>
<<capture _r>>
<<set _out = getCruiseItem(_r.output)>>
<<set _chk = canCraft($cruiseInventory, $cruiseBlueprints, _r.id)>>
<<set _desc = "">>
<<for _inp range _r.inputs>><<set _im = getCruiseItem(_inp.id)>><<set _desc = _desc + (_desc is "" ? "" : " · ") + (_im ? _im.name : _inp.id) + " " + ($cruiseInventory[_inp.id] || 0) + "/" + _inp.qty>><</for>>
<div class="skill-card">
<div class="skill-card__name"><<= _out ? _out.name : _r.output>></div>
<div class="skill-card__desc"><<= _desc>></div>
<<if _chk.ok>>
<div class="btn"><<button "Craft">><<set _result = craft($cruiseInventory, $cruiseBlueprints, _r.id, $cruiseSkills.crafting)>><<set _o2 = getCruiseItem(_r.output)>><<set $craftMsg = "You craft a " + (_o2 ? _o2.name.toLowerCase() : _r.output) + (_result.returned ? " and salvage a spare part." : ".")>><<goto "Ship_Crafting">><</button>></div>
<<else>>
<div class="btn non-interacting"><<button "Missing materials">><</button>></div>
<</if>>
</div>
<</capture>>
<</for>>
</div>
<<else>>
<div class="cruise-people__empty">You have no blueprints yet.</div>
<</if>>
<div class="btn padding-top"><<button "Leave" "Ship_EngineRoom">><<set $craftMsg = "">><</button>></div>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _npc = getRosterEntry($cruiseRoster, $activeNpcId)>>
<<if not _npc>>
<<goto $player.info.currentLocation>>
<<else>>
/* Two INDEPENDENT axes (the cruise situational-role rule - role comes from the
situation, not from who is more dominant or more feminine):
- playerPenetrates (snapshotted into $climaxScene by the choice that started this):
the PHYSICAL role - who is inside whom - and therefore the pose/media. A player can
be the one penetrated and still be the one reclaiming.
- the INITIATOR ($climaxInitiator): AGENCY - who climbs a stage - which drives the
voiced-line register and the lead-in/afterglow framing. "npc" = a recovery-seeker
the player let climb (the player falls); else a player-initiated reclaim (the player
climbs, whether he chose to top or to be taken). Capture + reset so the next climax
starts clean. */
<<set _init = $climaxInitiator>>
<<set $climaxInitiator = "player">>
/* Was this a wanted, mutual encounter (cruiseDesire) or a night with a regular? Capture
+ reset so the afterglow lands in the warm register rather than the predatory one. */
<<set _desire = $climaxDesire>>
<<set $climaxDesire = false>>
/* The depicted bodies are captured BEFORE the stage-transfer mutates them
(Ship_NpcInteract snapshots into $climaxScene), so a stage-6 player who just reclaimed
is still shown as the Female (no-penis) body he was during the act - not the penis the
transfer hands back. Fall back to the live bodies + the old body-rule role for any path
that set no snapshot (e.g. an old save caught mid-scene). */
<<set _sc = $climaxScene || { pStage: femStage($player), pGender: $player.gender(), nStage: cruiseNpcBlurb(_npc).stage, nGender: _npc.gender }>>
<<set $climaxScene = null>>
<<set _pp = (typeof _sc.playerPenetrates === "boolean") ? _sc.playerPenetrates : (_sc.pStage <= _sc.nStage)>>
<<set _playerGains = (_init !== "npc")>>
<<if _pp>>
<<set _dg = _sc.pGender>>
<<set _sg = _sc.nGender>>
<<else>>
<<set _dg = _sc.nGender>>
<<set _sg = _sc.pGender>>
<</if>>
<<timed 0.2s>>
<<set _npcHeadName = cruiseDisplayName(_npc)>><<ShipHead _npcHeadName>>
<<if $npcLine isnot "">><<ShipMessage $npcLine>><</if>>
<<set _lead = (_init is "npc") ? reclaimLeadIn(_npc.archetype) : (_pp ? seductionLeadIn(_npc.archetype) : directedLeadIn(_npc.archetype))>>
<<ShipMessage _lead>>
/* His stable leaning meets the night's actual direction (cruiseSex.kinkSceneNote):
taking a man who wanted taking reads different from bending one built to take. */
<<set _kn = kinkSceneNote(npcKink(_npc), _pp)>>
<<if _kn isnot "">><<ShipMessage _kn>><</if>>
/* Familiarity overlay: the count BEFORE tonight (a player-initiated visit already
incremented playerTopped upstream, so subtract the one just applied) - the fifth
night with a man should not read like the first. */
<<set _famPrior = Math.max(0, (_npc.playerTopped || 0) - (_init is "npc" ? 0 : 1))>>
<<set _fn = familiarityLeadNote(familiarityBand(_famPrior))>>
<<if _fn isnot "">><<ShipMessage _fn>><</if>>
/* The act, beat by beat: oral -> penetration -> finish, each a narration beat, a
clip, and the NPC's voiced line (cruiseClimaxBeats). Media resolves through the
gated SetSexPickByTable - empty (suppressed by the player's content toggles)
renders nothing, so the prose alone still carries the scene. */
<<set _pose = (_sg is "Female") ? "Vag" : "Anal">>
<<set _cb = cruiseClimaxBeats(_npc.archetype, _pp, _pose, { playerGains: _playerGains })>>
<<ShipMessage _cb.oralBeat>>
<<SetOralPick _dg _sg>><<Video _pick>>
<<ShipMessage _cb.oralLine>>
<<ShipMessage _cb.penBeat>>
<<if _sg is "Female">><<SetVagPick _dg _sg>><<else>><<SetAnalPick _dg _sg>><</if>><<Video _pick>>
<<ShipMessage _cb.penLine>>
<<ShipMessage _cb.cumBeat>>
<<if _sg is "Female">>
<<if _cb.cumIn>><<SetVagCumInPick _dg _sg>><<else>><<SetVagCumOutPick _dg _sg>><</if>>
<<else>>
<<if _cb.cumIn>><<SetAnalCumInPick _dg _sg>><<else>><<SetAnalCumOutPick _dg _sg>><</if>>
<</if>>
/* Guarantee a finish video. A few pairs ship no dedicated cum clip (e.g. a fully
feminized player on a fully feminized mark, where neither body finishes on
screen); when the cum pick comes back empty but the base pose still resolves,
fall back to it so the finish beat carries a clip instead of rendering blank.
If the pair was suppressed by the content filter, the base pick is empty too -
so the fallback stays a correct no-op and nothing slips past the toggle. */
<<if _pick is "">><<if _sg is "Female">><<SetVagPick _dg _sg>><<else>><<SetAnalPick _dg _sg>><</if>><</if>>
<<Video _pick>>
<<ShipMessage _cb.cumLine>>
<<if _desire>>
<<set _ag = desireAfterglow(_npc.archetype, _npc.name)>>
<<elseif _init is "npc">>
<<set _ag = reclaimAfterglow(_npc.archetype, { name: _npc.name, playerFem: femStage($player), playerCorr: ($ship.corr || 0) })>>
<<elseif _pp>>
<<set _ag = climaxAfterglow(_npc.archetype, { name: _npc.name, playerFem: femStage($player), playerCorr: ($ship.corr || 0), confided: _npc.confided })>>
<<else>>
<<set _ag = directedAfterglow(_npc.archetype, { name: _npc.name, playerFem: femStage($player), playerCorr: ($ship.corr || 0), confided: _npc.confided })>>
<</if>>
<div class="cruise-afterglow"><<= formatDialogue(_ag)>></div>
/* A kept partner: the deeper, settled note on top of the afterglow - a relationship,
not a transaction (cruiseDesire). */
<<if _npc.regular>>
<div class="cruise-afterglow"><<= formatDialogue(regularIntimacyNote())>></div>
<</if>>
/* E3: a partner the player has fed on before carries the cumulative change - voiced by
the NPC's current body (after this visit's transfer). Player-initiated only. */
<<if _init isnot "npc" and (_npc.playerTopped || 0) gte 2>>
<<set _recur = recurringPartnerNote(_npc.playerTopped, _npc.gender)>>
<<if _recur isnot "">><div class="cruise-afterglow"><<= _recur>></div><</if>>
<</if>>
<div class="btn padding-top"><<button "Catch your breath" "Ship_NpcInteract">><</button>></div>
<</timed>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _t = $threesome>>
<<if not _t>>
<<goto $player.info.currentLocation>>
<<else>>
/* The two partners + their bodies were snapshotted by the "Take them both" choice
BEFORE the transfer feminized them, so the media shows them as they were during the
act (cf. Ship_Climax). Consume + reset. */
<<set $threesome = null>>
<<timed 0.2s>>
<<set _pairTitle = _t.aName + " & " + _t.bName>>
<<ShipHead _pairTitle>>
<<set _scn = threesomeScene(_t.aName, _t.bName, _t.kind, null, getVoyageProgress().day, _t.pGender)>>
/* Every clip below is a two-person clip, so the line directly above each one names
only that pair and the act it shows (_scn.abOral ... _scn.pbCum); the group beats
(setup, the watching, the join, the finish, the afterglow) sit where no clip
follows them. */
<<ShipMessage _scn.setup>>
<<ShipMessage _scn.together>>
<<set _bodyNote = threesomeBodyNote(_t.aName, _t.aStage || 0, _t.bName, _t.bStage || 0)>>
<<if _bodyNote isnot "">><<ShipMessage _bodyNote>><</if>>
/* The two of them together: the anchor takes the partner, routed by their real bodies
(a feminized anchor pegs; pose by the partner's body). Empty picks (filtered pairs)
render nothing, so the prose still carries it. */
<<ShipMessage _scn.abOral>>
<<SetOralPick _t.aGender _t.bGender>><<Video _pick>>
<<ShipMessage _scn.abFuck>>
<<if _t.bGender is "Female">><<SetVagPick _t.aGender _t.bGender>><<else>><<SetAnalPick _t.aGender _t.bGender>><</if>><<Video _pick>>
<<ShipMessage _scn.step>>
<<ShipMessage _scn.join>>
/* The player takes each of them in turn (player tops, gains). */
<<ShipMessage _scn.paOral>>
<<SetOralPick _t.pGender _t.aGender>><<Video _pick>>
<<ShipMessage _scn.paFuck>>
<<if _t.aGender is "Female">><<SetVagPick _t.pGender _t.aGender>><<else>><<SetAnalPick _t.pGender _t.aGender>><</if>><<Video _pick>>
<<ShipMessage _scn.pbFuck>>
<<if _t.bGender is "Female">><<SetVagPick _t.pGender _t.bGender>><<else>><<SetAnalPick _t.pGender _t.bGender>><</if>><<Video _pick>>
/* The finish, on the partner; empty-fallback to the base pose keeps a clip on screen. */
<<ShipMessage _scn.pbCum>>
<<if _t.bGender is "Female">><<SetVagCumInPick _t.pGender _t.bGender>><<if _pick is "">><<SetVagPick _t.pGender _t.bGender>><</if>><<else>><<SetAnalCumInPick _t.pGender _t.bGender>><<if _pick is "">><<SetAnalPick _t.pGender _t.bGender>><</if>><</if>><<Video _pick>>
<<ShipMessage _scn.finish>>
<div class="cruise-afterglow"><<= formatDialogue(_scn.afterglow)>></div>
<div class="btn padding-top"><<button "Catch your breath" "Ship_NpcInteract">><<set $activeNpcId = _t.anchorId>><</button>></div>
<</timed>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Cruise/Locations/galley.jpg">>
<<timed 0.2s>>
<<ShipHead "Quartermaster">>
<img class="cruise-portrait" src="Media/Cruise/Characters/merchant.jpg" alt="Tully the quartermaster">
<div class="skills-tokens">Chips: <<= $player.money>> · Trade level <<= $cruiseSkills.trade>></div>
<<if $shopMsg isnot "">>
<<ShipMessage $shopMsg>>
<<else>>
<<set _broke = $player.money lt 50>>
<<set _tully = tullyGreeting({ met: $ship.metTully, day: getVoyageProgress().day, femStage: femStage($player), broke: _broke })>>
<<ShipMessage _tully>>
<<set $ship.metTully = true>>
<</if>>
<<set _listings = shopListings($cruiseSkills.trade)>>
<div class="skills-grid">
<<for _it range _listings>>
<<capture _it>>
<div class="skill-card">
<div class="skill-card__name"><<= _it.name>> <span class="skill-card__lvl"><<= _it.price>> chips</span></div>
<div class="skill-card__desc"><<= _it.desc>></div>
<<if _it.effect is "disguise" and $ship.disguised>>
<div class="btn non-interacting"><<button "Already disguised">><</button>></div>
<<elseif _it.effect is "uncage" and not $ship.caged>>
<div class="btn non-interacting"><<button "Not caged">><</button>></div>
<<elseif _it.effect is "demasculinize" and femStage($player) lte 0>>
<div class="btn non-interacting"><<button "Already male">><</button>></div>
<<elseif $player.money gte _it.price>>
<div class="btn"><<button "Buy">>
<<set $player.money = $player.money - _it.price>>
<<if _it.effect is "uncage">><<set $ship.caged = false>><<elseif _it.effect is "disguise">><<set $ship.disguised = true>><<elseif _it.effect is "demasculinize">><<if femStage($player) gt 0>><<run applyFeminizationStage($player, -1)>><</if>><</if>>
<<set $shopMsg = "Tully slides you the " + _it.name.toLowerCase() + ".">>
<<goto "Ship_Shop">>
<</button>></div>
<<else>>
<div class="btn non-interacting"><<button "Cannot afford">><</button>></div>
<</if>>
</div>
<</capture>>
<</for>>
</div>
/* Sell-side: Tully fences the player's surplus loot for chips - the non-gambling,
non-body chip path that rewards the loot / stealth / craft / trade build. Prices
come from sellPrice (a Trade-scaled fraction of a conservative value), so this
converts capped loot rather than printing money. */
<<set _sellable = sellableInventory($cruiseInventory, $cruiseSkills.trade)>>
<<if _sellable.length gt 0>>
<div class="cruise-actgroup__head padding-top">Fence your surplus</div>
<div class="cruise-actnote">Tully takes loot off your hands. He pays under value - and pays better the higher your Trade.</div>
<div class="skills-grid">
<<for _sl range _sellable>>
<<capture _sl>>
<div class="skill-card">
<div class="skill-card__name"><<= _sl.name>> <span class="skill-card__lvl">x<<= _sl.qty>></span></div>
<div class="skill-card__desc">Tully pays <<= _sl.unit>> chips each.</div>
<div class="btn"><<button "Sell one">>
<<set $cruiseInventory[_sl.id] = ($cruiseInventory[_sl.id] || 0) - 1>>
<<set $player.money = $player.money + _sl.unit>>
<<set $shopMsg = "Tully weighs the " + _sl.name.toLowerCase() + " in his palm and counts you out " + _sl.unit + " chips.">>
<<goto "Ship_Shop">>
<</button>></div>
<<if _sl.qty gt 1>>
<div class="btn"><<button "Sell all">>
<<set _gain = _sl.qty * _sl.unit>>
<<set $cruiseInventory[_sl.id] = 0>>
<<set $player.money = $player.money + _gain>>
<<set $shopMsg = "Tully takes the lot - " + _sl.qty + " " + _sl.name.toLowerCase() + " - for " + _gain + " chips.">>
<<goto "Ship_Shop">>
<</button>></div>
<</if>>
</div>
<</capture>>
<</for>>
</div>
<</if>>
<div class="btn padding-top"><<button "Leave" "Ship_Galley">><<set $shopMsg = "">><</button>></div>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<timed 0.2s>>
<<ShipHead "Night Search">>
<<if $nightResult and $nightResult.caught>>
<img class="cruise-portrait" src="Media/Cruise/Characters/guard_1.jpg" alt="A patrol guard">
<div class="wheel-result wheel-result--fall">
<div class="wheel-result__label">Caught</div>
<div class="wheel-result__text">One of Brandt's patrols rounds the corner before you finish - the master-at-arms runs a tight watch. They confiscate <<= $nightResult.chipsLost>> chips and march you back to your bunk.</div>
</div>
<<if femStage($player) gte 6>>
<<set _nc = nightCaughtScene($gameSettings.contentFilter.nonConsent === true)>>
<<if _nc.blocked>>
<<ShipMessage _nc.notice>>
<div class="cruise-caged-note"><<= _nc.howto>></div>
<<else>>
<<set _dg = "Male">>
<<set _sg = $player.gender()>>
<<ShipMessage _nc.intro>>
/* Each clip is one guard and the player: its pair line (_nc.oral / fuck /
cum) sits directly above it; the other two guards stay in the intro and
the afterglow. */
<<ShipMessage _nc.oral>>
<<SetOralPick _dg _sg>><<Video _pick>>
/* Body-aware like every other group-use scene (cf. Ship_VipFlagship): a
fully-feminized player reads Female and is taken vaginally, a body that
still carries a penis anally. The scene is gated femStage>=6, so Female
is the usual case, but the branch keeps a stage-6-with-penis edge body
(e.g. an un-normalized old save) anatomically correct instead of forcing
anal on a vagina. */
<<ShipMessage _nc.fuck>>
<<if _sg is "Female">>
<<SetVagPick _dg _sg>><<Video _pick>>
/* End on a finish like every other cruise scene; empty-fallback keeps
it a clean no-op if the gender pair is filtered off. */
<<ShipMessage _nc.cum>>
<<SetVagCumInPick _dg _sg>><<if _pick is "">><<SetVagPick _dg _sg>><</if>><<Video _pick>>
<<else>>
<<SetAnalPick _dg _sg>><<Video _pick>>
<<ShipMessage _nc.cum>>
<<SetAnalCumInPick _dg _sg>><<if _pick is "">><<SetAnalPick _dg _sg>><</if>><<Video _pick>>
<</if>>
<div class="cruise-afterglow"><<= _nc.afterglow>></div>
<</if>>
<</if>>
<div class="btn padding-top"><<button "Back to your bunk">>
<<set $nightResult = null>><<ShipSleepTick>>
<</button>></div>
<<elseif $nightResult>>
<div class="wheel-result wheel-result--jackpot">
<div class="wheel-result__label">Clean</div>
<div class="wheel-result__text">You slip back into the dark with <<= $nightResult.haul>> chips and no one the wiser.<<if $nightResult.material>> You also pocket some <<= getCruiseItem($nightResult.material).name.toLowerCase()>>.<</if>></div>
</div>
<div class="btn padding-top"><<button "Slink away">><<set $nightResult = null>><<goto $player.info.currentLocation>><</button>></div>
<<else>>
<div class="btn"><<button "Back" "Ship_MainHall">><</button>></div>
<</if>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Cruise/Locations/communal_cabins.jpg">>
<<timed 0.2s>>
<<ShipHead "Hone Yourself">>
<div class="skills-tokens">Victory tokens: <<= $cruiseSkills.tokens>> · 5 tokens per level</div>
<<set _defs = [{ key: "persuasion", name: "Persuasion", desc: "Better odds when you make a move on someone." }, { key: "endurance", name: "Endurance", desc: "Blunts the toll your actions take on you." }, { key: "stealth", name: "Stealth", desc: "Slip past the night patrols unseen." }, { key: "trade", name: "Trade", desc: "Lean on the ship merchant for better prices." }, { key: "crafting", name: "Crafting", desc: "Sharper hands at the workbench." }, { key: "lockpick", name: "Lockpick", desc: "Open what is meant to stay shut." }]>>
<div class="skills-grid">
<<for _d range _defs>>
<<capture _d>>
<div class="skill-card">
<div class="skill-card__name"><<= _d.name>> <span class="skill-card__lvl"><<= $cruiseSkills[_d.key]>>/10</span></div>
<div class="skill-card__desc"><<= _d.desc>></div>
<<if canBuySkillLevel($cruiseSkills, _d.key)>>
<div class="btn"><<button "Level up (5)">><<run buySkillLevel($cruiseSkills, _d.key)>><<if $cruiseSkills[_d.key] gte 10>><<run unlockCruiseAchievement("skillMax")>><</if>><<goto "Ship_Skills">><</button>></div>
<<elseif $cruiseSkills[_d.key] gte 10>>
<div class="btn non-interacting"><<button "Maxed out">><</button>></div>
<<else>>
<div class="btn non-interacting"><<button "Need 5 tokens">><</button>></div>
<</if>>
</div>
<</capture>>
<</for>>
</div>
<div class="btn padding-top"><<button "Done" "Ship_Cabins">><</button>></div>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Cruise/Locations/bar.jpg">>
<<timed 0.2s>>
<<ShipHead "Wheel of Fortune">>
<<if $wheelResult is null>>
<<set _special = isSpecialWheelDay(getVoyageProgress().day)>>
<<set _crier = wheelCrier()>>
<div class="wheel-intro"><<= _crier>></div>
<<if _special>><div class="cruise-stage-banner">The marquee wheel runs tonight - the «Sirena» fattens the odds on the third, sixth and ninth, and the jackpot pays double.</div><</if>>
<div class="cruise-wheel-stage">
<div @class="_special ? 'cruise-wheel cruise-wheel--special' : 'cruise-wheel'" id="cruise-wheel">
<div class="cruise-wheel__face-host"></div>
<div class="cruise-wheel__pointer"></div>
</div>
</div>
<<done>><<run document.querySelectorAll('#cruise-wheel .cruise-wheel__face-host').forEach(function (el) { el.innerHTML = renderCruiseWheelSvg() })>><</done>>
<div class="cruise-choices" id="cruise-wheel-controls">
<div class="btn"><<button "Spin the wheel">>
<<set _sp = isSpecialWheelDay(getVoyageProgress().day)>>
<<set $wheelResult = applyWheelToPlayer(spinWheel(undefined, _sp), _sp)>>
<<set $ship.wheelSpun = true>>
<<if $wheelResult.sector is "jackpot">><<run unlockCruiseAchievement("wheelJackpot")>><<if _sp>><<run unlockCruiseAchievement("grandJackpot")>><</if>><</if>>
<<if $wheelResult.sector is "cage">><<run unlockCruiseAchievement("caged")>><</if>>
<<SpendTime 30>>
<<run spinCruiseWheel($wheelResult.sector)>>
<</button>></div>
<div class="btn"><<button "Walk away" "Ship_Bar">><</button>></div>
</div>
<<else>>
<div class="cruise-wheel-stage">
<div class="cruise-wheel is-stopped" id="cruise-wheel">
<div class="cruise-wheel__face-host"></div>
<div class="cruise-wheel__pointer"></div>
</div>
</div>
<<done>><<run document.querySelectorAll('#cruise-wheel .cruise-wheel__face-host').forEach(function (el) { el.innerHTML = renderCruiseWheelSvg(cruiseWheelRestAngle($wheelResult.sector), $wheelResult.sector) })>><</done>>
<div @class="'wheel-result wheel-result--' + $wheelResult.sector">
<div class="wheel-result__label"><<= $wheelResult.label>></div>
<div class="wheel-result__text"><<= $wheelResult.text>></div>
<<if $wheelResult.chipsDelta isnot 0>><div class="wheel-result__delta">Chips <<if $wheelResult.chipsDelta gt 0>>+<</if>><<= $wheelResult.chipsDelta>></div><</if>>
<<if $wheelResult.stageDelta isnot 0>><div class="wheel-result__delta">Feminization <<if $wheelResult.stageDelta gt 0>>+<</if>><<= $wheelResult.stageDelta>> stage</div><</if>>
<<if $wheelResult.corrUp>><div class="wheel-result__delta">Corruption deepened.</div><</if>>
<<if $wheelResult.caged>><div class="wheel-result__delta">You have been caged.</div><</if>>
</div>
<div class="cruise-choices"><div class="btn"><<button "Step back to the bar" "Ship_Bar">><<set $wheelResult = null>><</button>></div></div>
<</if>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Cruise/Locations/lower_deck.jpg">>
<<timed 0.2s>>
<<ShipHead "Below Decks">>
<img class="cruise-portrait" src="Media/Cruise/Characters/guard_2.jpg" alt="A crewman">
<<set _cu = crewUseScene()>>
<<ShipMessage _cu.intro>>
<<if $gameSettings.contentFilter.nonConsent === true>>
<<set _dg = "Male">>
<<set _sg = $player.gender()>>
/* Each clip is one crewman and the player: its pair line sits directly above it,
the rest of the crew stays in the intro and the afterglow. */
<<ShipMessage _cu.oral>>
<<SetOralPick _dg _sg>><<Video _pick>>
<<ShipMessage _cu.cum>>
<<SetOralCumInPick _dg _sg>><<Video _pick>>
<div class="cruise-afterglow"><<= _cu.afterglow>></div>
<<else>>
<<ShipMessage "What the crew do with you below decks is non-consensual content, switched off in your settings. The scene fades to black - you come back to yourself later, used and sore, the details spared.">>
<div class="cruise-caged-note">To play scenes like this, enable "Non-consensual content (18+)" in Settings. It is off by default.</div>
<</if>>
<div class="btn padding-top"><<button "Crawl back up" $player.info.currentLocation>><</button>></div>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Cruise/Locations/owner_stateroom.jpg">>
<<timed 0.2s>>
<<ShipHead "The VIP Box">>
<div class="cruise-portrait--row"><img src="Media/Cruise/Characters/owner_director.jpg" alt="Vane"><img src="Media/Cruise/Characters/vip_patron_1.jpg" alt="A high roller"><img src="Media/Cruise/Characters/vip_patron_2.jpg" alt="A high roller"></div>
<<ShipMessage "Vane's men do not ask. They walk you to the VIP box, where the high rollers are waiting and Vane watches from his chair.">>
<<if $gameSettings.contentFilter.nonConsent === true>>
<<set _vs = vipFlagshipScene(true)>>
<<run unlockCruiseAchievement("houseStar")>>
<<set _dg = "Male">>
<<set _sg = $player.gender()>>
/* Each clip is one high roller and the player, so the line directly above it is
that pair alone (_vs.oral / _vs.fuck / _vs.cum); the box at large and Vane
watching live in the group beats, which never sit right above a clip. */
<<ShipMessage _vs.intro>>
<<ShipMessage _vs.oral>>
<<SetOralPick _dg _sg>><<Video _pick>>
<<ShipMessage _vs.beats[0]>>
<<ShipMessage _vs.fuck>>
<<if _sg is "Female">>
<<SetVagPick _dg _sg>><<Video _pick>>
<<ShipMessage _vs.cum>>
<<SetVagCumInPick _dg _sg>><<Video _pick>>
<<else>>
<<SetAnalPick _dg _sg>><<Video _pick>>
<<ShipMessage _vs.cum>>
<<SetAnalCumInPick _dg _sg>><<Video _pick>>
<</if>>
<<ShipMessage _vs.beats[1]>>
<<ShipMessage _vs.beats[2]>>
<div class="cruise-afterglow"><<= _vs.afterglow>></div>
<<else>>
<<set _vs = vipFlagshipScene(false)>>
<<ShipMessage _vs.notice>>
<div class="cruise-caged-note"><<= _vs.howto>></div>
<</if>>
<div class="btn padding-top"><<button "Afterward" $player.info.currentLocation>><</button>></div>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Cruise/Locations/port.jpg">>
<<timed 0.2s>>
<<ShipHead "Back ashore">>
<img class="cruise-portrait" src="Media/Cruise/Characters/owner_director.jpg" alt="Vane, owner of the «Sirena»">
<<set _settle = $ship.settlement || 'cleared'>>
<<set _recap = $ship.recap || { allies: 0, tokens: 0, betrayed: false }>>
<<set _epi = voyageEpilogue(_settle, femStage($player), ($ship.corr || 0), ($ship.recap ? $ship.recap.dominant : false))>>
<<set _vo = (_settle === 'cleared') ? (($player.money gt ($ship.heldMoney || 0)) ? 'profit' : 'cleared') : 'indenture'>>
<<if femStage($player) gte 6 and ($ship.corr || 0) gte 6>><<set _vo = 'fallen'>><</if>>
<<set _vopts = { outcome: _vo, femStage: femStage($player), corr: ($ship.corr || 0) }>>
<<set _vv = vaneSettlementVerdict(_vopts)>>
<<set _rstats = voyageRecapStats({ outcome: _settle, profit: Math.max(0, $player.money - ($ship.heldMoney || 0)), shortfall: ($ship.brothelDebt || 0), femStage: femStage($player), corr: ($ship.corr || 0), allies: _recap.allies, betrayed: _recap.betrayed, tokens: _recap.tokens, mazeCleared: !!$ship.mazeCleared, champion: !!$ship.champWon, nessaAlly: (($ship.nessaBeat || 0) >= 3) && (nessaBand($ship.nessaDisp || 0) === 'ally'), brandt: (($ship.brandtBeat || 0) >= 3) ? brandtBand($ship.brandtDisp || 0) : null, regulars: (_recap.regulars || 0), rep: ($ship.rep != null ? $ship.rep : null) })>>
<<if _settle === 'cleared'>>
<<run unlockCruiseAchievement('clearLoan')>>
<<if ($player.money - ($ship.heldMoney || 0)) gte 2000>><<run unlockCruiseAchievement('profitBaron')>><</if>>
<<ShipMessage "At the gangway Vane is waiting, hands folded, unhurried - appraising you the way a man counts returned property.">>
<<ShipMessage _vv>>
<<ShipMessage "You walk off with the loan cleared. The cage cashes your winnings out at ten to one - every chip above the loan comes back tenfold in city money, paid on top of the stake they held when you boarded.">>
<div class="cruise-epilogue"><<= _epi>></div>
<div class="cruise-recap-stats"><<= _rstats>></div>
<div class="cruise-recap-money">Money: <<= $player.money>></div>
<div class="btn padding-top"><<button "Step into the city" "Port">><</button>></div>
<<else>>
<<run unlockCruiseAchievement('brothel')>>
<<ShipMessage "Vane does not raise his voice. He has never needed to.">>
<<ShipMessage _vv>>
<<ShipMessage "The house returns your held money, but the unpaid balance follows you ashore, to be worked off.">>
<div class="cruise-epilogue"><<= _epi>></div>
<div class="cruise-recap-stats"><<= _rstats>></div>
<div class="cruise-recap-money">Money: <<= $player.money>> · Owed: <<= $ship.brothelDebt>></div>
<div class="btn padding-top"><<button "Report to the house" "Port_BrothelIndenture">><</button>></div>
<</if>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Cruise/Locations/vip_lounge.jpg">>
<<timed 0.2s>>
<<ShipHead "Working the Debt">>
<<if $ship.brothelDebt and $ship.brothelDebt gt 0>>
<img class="cruise-portrait" src="Media/Cruise/Characters/owner_director.jpg" alt="Vane, owner of the house">
<<set _prog = indentureProgress()>>
<<ShipMessage "Vane's house keeps a ledger with your name on it. Until it is clear, your nights are theirs - and the house sells them upstairs, to the same class of money that filled the «Sirena»'s VIP box, one patron at a time.">>
<<set _ledgerLine = indentureLedgerLine($ship.brothelDebt, _prog.principal)>>
<<ShipMessage _ledgerLine>>
<div class="cruise-purser__status">Owed to the house: <<= $ship.brothelDebt>> · Nights worked: <<= _prog.nights>> · Paid off on your back: <<= _prog.paidTotal>> · Tips kept: <<= _prog.tipsTotal>></div>
<div class="cruise-choices">
<<if $player.status.energy.value gte 35>>
<div class="btn"><<button "Take the evening's patrons">>
<<SpendEnergy $player 35>>
<<run startIndentureNight()>>
<<goto "Port_IndentureClient">>
<</button>></div>
<<else>>
<div class="btn non-interacting"><<button "Take the evening's patrons (too tired)">><</button>></div>
<</if>>
<<if $player.money gte 100>>
<div class="btn"><<button "Pay $100 at the desk">>
<<set _cash = payIndentureCash(100)>>
<<if _cash.cleared>><<goto "Port_IndentureRelease">><<else>><<goto "Port_BrothelIndenture">><</if>>
<</button>></div>
<<else>>
<div class="btn non-interacting"><<button "Pay $100 at the desk">><</button>></div>
<</if>>
<<if $player.money gt 0>>
<div class="btn"><<button "Pay all you can">>
<<set _cash = payIndentureCash($player.money)>>
<<if _cash.cleared>><<goto "Port_IndentureRelease">><<else>><<goto "Port_BrothelIndenture">><</if>>
<</button>></div>
<</if>>
<div class="btn"><<button "Step out for now" "Port">><</button>></div>
</div>
<<else>>
<<ShipMessage "The ledger is clear. The house has no more hold on you - this time.">>
<div class="btn padding-top"><<button "Walk free" "Port">><</button>></div>
<</if>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Cruise/Locations/vip_lounge.jpg">>
<<timed 0.2s>>
<<ShipHead "The Evening Parlor">>
<<set _c = currentIndentureClient()>>
<<if $indentureRefused>>
<<ShipMessage $indentureRefused>>
<<set $indentureRefused = null>>
<</if>>
<<if !_c>>
<<set _nightEnd = indentureNightEndLine()>>
<<ShipMessage _nightEnd>>
<div class="cruise-purser__status">Tonight: <<= $ship.indenture.nightPaid>> paid off the ledger · <<= $ship.indenture.nightTips>> kept in tips · Still owed: <<= $ship.brothelDebt>></div>
<div class="cruise-choices">
<div class="btn"><<button "Back to the ledger" "Port_BrothelIndenture">><</button>></div>
<div class="btn"><<button "Out into the harbor air" "Port">><</button>></div>
</div>
<<else>>
<img class="cruise-portrait" @src="_c.portrait" alt="A patron of the house">
<<ShipMessage _c.approach>>
<<if _c.vaneAside>><<ShipMessage _c.vaneAside>><</if>>
<<if _c.act is "oral">><<set _wants = "He wants your mouth">><<else>><<set _wants = "He wants to fuck you">><</if>>
<div class="cruise-purser__status"><<= _wants>> · His fee to the house: <<= _c.fee>> off your ledger · Tip for you: <<= _c.tip>></div>
<div class="cruise-choices">
<div class="btn"><<button "Service him">>
<<set $indentureServe = serveIndentureClient()>>
<<set $indentureScene = indentureSceneFor($indentureServe.client.act, $player.gender() === "Female", $indentureServe.client.key, femStage($player))>>
<<SpendTime 60>>
<<goto "Port_IndentureService">>
<</button>></div>
<div class="btn"><<button "Turn him away">>
<<run skipIndentureClient()>>
<<set $indentureRefused = indentureRefuseLine()>>
<<SpendTime 15>>
<<goto "Port_IndentureClient">>
<</button>></div>
</div>
<</if>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Cruise/Locations/owner_stateroom.jpg">>
<<timed 0.2s>>
<<ShipHead "Earning It Back">>
<<set _sv = $indentureServe>>
<<set _sc = $indentureScene>>
<img class="cruise-portrait" @src="_sv.client.portrait" alt="A patron of the house">
<<ShipMessage _sc.during>>
<<if (_sc.bodyAside || "") isnot "">><<ShipMessage _sc.bodyAside>><</if>>
<<set _dg = "Male">>
<<set _sg = $player.gender()>>
<<if _sv.client.act is "oral">>
<<SetOralPick _dg _sg>><<Video _pick>>
<<SetOralCumInPick _dg _sg>><<Video _pick>>
<<else>>
<<if _sg is "Female">>
<<SetVagPick _dg _sg>><<Video _pick>>
<<SetVagCumInPick _dg _sg>><<Video _pick>>
<<else>>
<<SetAnalPick _dg _sg>><<Video _pick>>
<<SetAnalCumInPick _dg _sg>><<Video _pick>>
<</if>>
<</if>>
<div class="cruise-afterglow"><<= _sc.after>></div>
<div class="cruise-purser__status"><<= _sv.applied>> paid off the ledger<<if _sv.kept gt 0>> · <<= _sv.kept>> overflow into your pocket<</if>> · Tip kept: <<= _sv.tip>> · Still owed: <<= _sv.debtLeft>></div>
<<if _sv.cleared>>
<div class="btn padding-top"><<button "The ledger hits zero" "Port_IndentureRelease">><<set $indentureServe = null>><<set $indentureScene = null>><</button>></div>
<<else>>
<div class="btn padding-top"><<button "Back to the parlor" "Port_IndentureClient">><<set $indentureServe = null>><<set $indentureScene = null>><</button>></div>
<</if>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Cruise/Locations/vip_lounge.jpg">>
<<timed 0.2s>>
<<ShipHead "The Ledger Closed">>
<img class="cruise-portrait" src="Media/Cruise/Characters/owner_director.jpg" alt="Vane, owner of the house">
<<set _rel = indentureReleaseScene(femStage($player))>>
<<run unlockCruiseAchievement("debtWorked")>>
<<ShipMessage _rel.intro>>
<<ShipMessage _rel.verdict>>
<div class="cruise-afterglow"><<= _rel.coda>></div>
<<set $ship.brothelDebt = 0>>
<<set $ship.indenture = null>>
<div class="btn padding-top"><<button "Walk free" "Port">><</button>></div>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<SetBackground "Media/Locations/Prison/intake.jpg">>
<<set _prog = getSentenceProgress()>>
<<set _intakePopulation = Array.isArray($prisonRoster) ? $prisonRoster.length : 0>>
<div class="centre-text">Intake and Booking</div>
<<PrisonPortrait "sergeant">>
<div class="chat-container prison-prose">
<p class="text">Fingerprints, a mugshot, a plastic bag for everything in your pockets. A bored sergeant reads the number off your sheet, slides a bedroll and a set of blues across the counter, and buzzes the first gate.</p>
<p class="text"><<= _prog.total>> days in Cellblock <<= $prison.block>>. Try to walk out the same person who walked in.</p>
<p class="text"><<= _intakePopulation>> inmates answer count in Cellblock <<= $prison.block>>. You will not see all of them together; work call, chow and lockup keep the faces moving.</p>
</div>
/* Your street reputation walks through the gate a step ahead of you (doc 19.2): a
name the city knows is a name the block knows, and it buys a little standing on
the tier before you have thrown a single punch. Applied once, on the real intake. */
<<set _notor = getNotoriety($police)>>
<<if _notor gte 50>>
<<if not $prison.intakeDone>><<set $prison.rep = Math.min(100, ($prison.rep || 0) + (_notor gte 80 ? 14 : 8))>><</if>>
<<PrisonProse "Word beat the transfer bus. The sergeant checks your name against the sheet, looks up, then quietly points you out to the escort. When the gate rolls back, heads turn before anyone has introduced you. Whatever you did outside came through intake with you.">>
<</if>>
<<set $prison.intakeDone = true>>
<<run unlockPrisonAchievement('arrested')>>
<<run startPrisonQuest('pq_prologue_fish')>>
<<if $prison.block is "M">>
<div class="centre-text" style="font-size:13px;">The kinds of men you will be living with:</div>
<div class="prison-faces">
<div class="prison-faces__face"><<PrisonPortrait "fish">><div class="prison-faces__cap">Fresh fish</div></div>
<div class="prison-faces__face"><<PrisonPortrait "wolf">><div class="prison-faces__cap">A wolf</div></div>
<div class="prison-faces__face"><<PrisonPortrait "lifer">><div class="prison-faces__cap">A lifer</div></div>
</div>
<</if>>
<div class="btn padding-top"><<button "Step into the block" "Prison_Prologue">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<if $prison.block is "F">>
<<SetBackground "Media/Locations/Prison/block_f_dayroom.jpg">>
<<else>>
<<SetBackground "Media/Locations/Prison/block_m_dayroom.jpg">>
<</if>>
/* Already past the first day (save-safe re-entry): straight to the block. */
<<if not isPrisonQuestActive('pq_prologue_fish')>>
<<goto "Prison_Block">>
<<else>>
<<set _wF = ($prison.block is "F")>>
<<set _wolf = castName('wolf', _wF ? "a slab of a woman" : "a slab of a man")>>
<<set _pop = castName('lifer', "an old head")>>
<<set _wolfSubj = _wF ? "she" : "he">>
<<set _wolfSubjCap = _wF ? "She" : "He">>
<<set _wolfObj = _wF ? "her" : "him">>
<<set _wolfPoss = _wF ? "her" : "his">>
<div class="centre-text">The Day Room</div>
<<PrisonPortrait "wolf">>
/* Build each prose line into a temp var first - passing an "a"+_var+"b" concat
straight into a macro arg breaks the parser (it splits on the spaces). The wolf
is a woman on the F block - pronouns follow the roster. */
<<set _l1 = "The gate rolls shut. Conversations stop one table at a time. " + _wolf + " leaves the wall and blocks your path, close enough that you can smell the state soap on " + (_wF ? "her" : "him") + ". *\"Fresh fish,\"* " + (_wF ? "she" : "he") + " calls over " + (_wF ? "her" : "his") + " shoulder. *\"Let's see what you brought in.\"*">>
<<PrisonProse _l1>>
<<set _l2 = "At the tables, " + _pop + " watches over a line of dominoes. Nobody steps in. This is intake entertainment, and they are waiting to see whether you pay, swing, or hold still.">>
<<PrisonProse _l2>>
<div class="btn-container">
<div class="btn">
<<set _standWolfLbl = "Give it right back to " + _wolfObj + " - hold " + _wolfPoss + " eye and step in">>
<<button _standWolfLbl>>
<<set _o = resolvePrisonQuestPath('pq_prologue_fish','stand')>>
<<set $prologueOutcome = "You do not give " + _wolfObj + " the flinch " + _wolfSubj + " came for. You step into it instead, chin up, and hold " + _wolfPoss + " stare until it is " + _wolfPoss + " call whether this goes further. It does not. " + _wolfSubjCap + " barks a laugh, claps your shoulder hard enough to bruise, and drifts off. At the next table, somebody shifts over to make you room. The block has its first answer about you.">>
<<goto "Prison_PrologueOut">>
<</button>>
</div>
/* Ask the def whether the coin path is affordable instead of restating its price.
resolvePrisonQuestPath re-checks the gate and returns null when it fails, and
the handler below prints its outcome prose unconditionally - so a literal that
drifted from the def would show "you paid" while nothing was spent. */
<<if prisonPathVisible(getPrisonQuestPath('pq_prologue_fish','pay'), buildQuestContext())>>
<div class="btn">
<<set _payWolfLbl = "Slide " + _wolfObj + " your commissary and buy the quiet">>
<<button _payWolfLbl>>
<<set _o = resolvePrisonQuestPath('pq_prologue_fish','pay')>>
<<set $prologueOutcome = "You palm what little commissary you came in with and let it change hands where the room can see the deal, not the humiliation. " + _wolfSubjCap + " pockets it and loses interest. Bought and paid for - nobody owns you, but nobody owes you either. You are just the fish who pays a way through.">>
<<goto "Prison_PrologueOut">>
<</button>>
</div>
<</if>>
<div class="btn">
<<button "Say nothing, find a seat, keep your head down">>
<<set _o = resolvePrisonQuestPath('pq_prologue_fish','duck')>>
<<set $prologueOutcome = "You let your eyes go flat and slide past " + _wolfObj + " to an empty stool, giving " + _wolfObj + " nothing to push against. " + _wolfSubjCap + " watches you a beat, decides you are not worth the effort today, and moves on. You are nobody yet - which, on your first hour inside, is not the worst thing to be.">>
<<goto "Prison_PrologueOut">>
<</button>>
</div>
<div class="btn">
<<set _wingWolfLbl = "Catch a wolf's eye and get under " + _wolfPoss + " wing">>
<<button _wingWolfLbl>>
<<set $prison.protected = true>>
<<set _wid = getCastInmateId('wolf')>>
<<if _wid isnot undefined>><<set $prison.protectorId = _wid>><</if>>
<<set _o = resolvePrisonQuestPath('pq_prologue_fish','wing')>>
<<set $prologueOutcome = "You look past " + _wolfObj + " to the hardest face in the room and make your choice obvious. " + _wolf + " catches the offer, hooks an arm across your shoulders, and steers you away like you already belong to " + (_wF ? "her" : "him") + ". The crowd gives you room. So does everybody who just watched you buy protection with a debt that has not been named yet.">>
/* The wing choice force-starts the wolf's debt. The prologue has its own
result passage, so it has to raise the dispatcher's banner itself or the
thread opens with nothing on screen to say it did. */
<<if _o and _o.unlocked>>
<<set _unlDef = getPrisonQuestDef(_o.unlocked)>>
<<if _unlDef>><<set $questUnlockedTitle = _unlDef.title>><</if>>
<</if>>
<<goto "Prison_PrologueOut">>
<</button>>
</div>
</div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<if $prison.block is "F">>
<<SetBackground "Media/Locations/Prison/block_f_dayroom.jpg">>
<<else>>
<<SetBackground "Media/Locations/Prison/block_m_dayroom.jpg">>
<</if>>
<div class="centre-text">The Day Room</div>
<<PrisonProse $prologueOutcome>>
<<PrisonProse "The room goes back to dominoes and television, but the glances keep coming. Your first answer is already being repeated at the tables, with details added by people who never left their seats.">>
<<if $questUnlockedTitle>><div class="centre-text" style="font-size:14px;color:#d9b44a;padding-top:6px;">A new thread opens on the tier: <<= $questUnlockedTitle>></div><<set $questUnlockedTitle = "">><</if>>
<div class="centre-text" style="font-size:13px;">Keep your eyes open. Work travels from table to table before count.</div>
<div class="btn padding-top"><<button "Step onto the tier" "Prison_Block">><</button>></div>
<<set $prologueOutcome = "">>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<set $questOutcomeVideo = "">>
<<set _questVisit = ($prison and $prison.inside) ? getActiveCrossBlockVisit($prison, { day: getCurrentAbsoluteDay(), hour: $dateTime.hours, minute: $dateTime.minutes }) : null>>
<<if not $prison or not $prison.inside>>
<<set $activeQuestId = "">><<set $questOutcome = "">><<set $questOutcomePath = "">>
<<goto "PoliceStation">>
<<elseif _questVisit>>
<<set $activeQuestId = "">><<set $questOutcome = "">><<set $questOutcomePath = "">>
<<goto "Prison_OtherBlock">>
<<else>>
<<set _questHome = $prison.inPC ? "Prison_Segregation" : "Prison_Block">>
<<if $prison.inPC>><<SetBackground "Media/Locations/Prison/segregation.jpg">><<elseif $prison.block is "F">><<SetBackground "Media/Locations/Prison/block_f_dayroom.jpg">><<else>><<SetBackground "Media/Locations/Prison/block_m_dayroom.jpg">><</if>>
<<set _def = getPrisonQuestDef($activeQuestId)>>
<<set _questParticipantsAdult = prisonAdultSceneAllowed()>>
<<set _questPairAllowed = (_def and _def.adultPair) ? CheckContentFilter(_def.adultPair[0], _def.adultPair[1]) : CheckContentFilter(($prison.block is "F" ? "Female" : "Male"), $player)>>
<<set _ctx = buildQuestContext(_questParticipantsAdult and _questPairAllowed, ($gameSettings.contentFilter.nonConsent === true))>>
<<set _questContentAllowed = (_def and (not $prison.inPC or _def.line is "program") and (not _def.adult or _ctx.filterAdult) and (not _def.playerFem or _ctx.playerFem is true) and (not _def.requiresBlock or _def.requiresBlock is _ctx.block) and (not _def.requiresPlayerGender or _def.requiresPlayerGender is _ctx.playerGender))>>
<<if not _def or not isPrisonQuestActive($activeQuestId) or not _questContentAllowed>>
<<set $activeQuestId = "">>
<<set $questOutcome = "">>
<<set $questOutcomePath = "">>
<<goto _questHome>>
<<else>>
<<set _giver = castName(_def.giverRole, "")>>
<div class="centre-text"><<= _def.title>></div>
<<if _giver isnot "">><div class="centre-text" style="font-size:13px;"><<= _giver>></div><</if>>
<<PrisonPortrait _def.giverRole>>
<<set _off = ($prison.block is "F" and _def.offerF) ? _def.offerF : _def.offer>>
<<if _off>><<PrisonProse _off>><</if>>
<<if $activeQuestId is "pq_silk_mirror_choice">>
<div class="prison-actnote"><<= silkQuestChoiceSummary()>></div>
<<elseif String($activeQuestId).startsWith("pq_silk_course_") or $activeQuestId is "pq_silk_stage3" or $activeQuestId is "pq_silk_final_reflection">>
<div class="prison-actnote"><<= silkQuestProgressSummary()>></div>
<</if>>
<<set _paths = visibleQuestPaths($activeQuestId, _ctx)>>
<<if _paths.length is 0>><div class="prison-actnote">No allowed sex-system clip or live course choice matches the current settings. The thread remains open.</div><</if>>
<<for _p range _paths>>
<<capture _p>>
<<set _paidGoodTimeBlocked = (_p.effects and (_p.effects.scrip || 0) lt 0 and (_p.effects.goodTime || 0) gt applyGoodTime(0).remaining)>>
<<if not _paidGoodTimeBlocked>>
<div class="prison-quest-choice">
<<if _p.pointOfNoReturn>><<QuestForkWarning _p.forkHeading $activeQuestId _p.key>><</if>>
<<set _pathLabel = questPathLabel(_p)>>
<<set _chastityBlocked = prisonQuestPathBlockedByChastity(_p, _ctx)>>
<<if _chastityBlocked>>
<div class="btn prison-sex-option--locked"><button type="button" disabled><<= _pathLabel + " (blocked by chastity cage)">></button></div>
<<else>>
<div class="btn">
<<button _pathLabel>>
<<set $questOutcomePath = "">>
<<set $questOutcomeVideo = "">>
/* The women's block reads the F-variant prose where a path ships one (the F
roster is all-Female and the COs are matrons - anatomy and pronouns differ). */
<<set _oc = questOutcomeText(_p)>>
<<if _p.route>>
<<set $questRouteId = $activeQuestId>>
<<set $questRoutePath = _p.key>>
<<goto _p.route>>
<<elseif _p.fails>>
<<set _liveFailParticipantsAdult = prisonAdultSceneAllowed()>>
<<set _liveFailPairAllowed = (_def and _def.adultPair) ? CheckContentFilter(_def.adultPair[0], _def.adultPair[1]) : CheckContentFilter(($prison.block is "F" ? "Female" : "Male"), $player)>>
<<set _liveFailCtx = buildQuestContext(_liveFailParticipantsAdult and _liveFailPairAllowed, ($gameSettings.contentFilter.nonConsent === true))>>
<<set _liveFailPath = prisonFindByKey(visibleQuestPaths($activeQuestId, _liveFailCtx), _p.key)>>
<<if not _liveFailPath>>
<<set $questOutcome = "">>
<<set $questOutcomePath = "">>
<<goto _questHome>>
<<else>>
<<set $questOutcomePath = _p.key>>
<<run failPrisonQuestPath($activeQuestId, _p.key, _pathLabel)>>
<<set $questOutcome = _oc>>
<<goto "Prison_QuestOut">>
<</if>>
<<else>>
<<set $questOutcomePath = _p.key>>
<<set _o = resolvePrisonQuestPath($activeQuestId, _p.key)>>
<<if not _o or not _o.completed>>
<<set $questOutcome = (_o and _o.failure) ? _o.failure : "That choice cannot be completed right now. The thread stays open.">>
<<else>>
<<if _p.systemic is "silkStart" or _p.systemic is "silkTrial" or _p.systemic is "silkLockTarget" or _p.systemic is "silkCourseStep">>
<<set $questOutcome = _o.systemicDetail ? _o.systemicDetail : silkQuestLastMessage()>>
<<elseif _p.systemic is "silkSexMilestone">>
<<set _silkMedia = silkQuestMediaRequest(_p.key)>>
<<if _silkMedia>>
<<set _silkPick = SetSexPickByTable(_silkMedia.category, _silkMedia.domGender, _silkMedia.subGender)>>
<<if _silkPick>><<set $questOutcomeVideo = _silkPick>><</if>>
<</if>>
<<set $questOutcome = _o.systemicDetail ? _o.systemicDetail : silkQuestSexSceneText(_p.key)>>
<<if _p.key.startsWith("finale_")>>
<<set _silkState = getPrisonSilkQuestState()>>
<<if _silkState and _silkState.outcome is "player_feminized">>
<<set $questOutcome += " The Mirror Course closes with you at stage five. Adrian remains in his original body.">>
<<elseif _silkState and _silkState.outcome is "silk_feminized">>
<<set $questOutcome += " The Mirror Course closes with Adrienne at stage five. Your body keeps its pre-course stage.">>
<</if>>
<</if>>
<<elseif _p.systemic is "joinGang">>
<<set _gang = $prison.gang>>
<<set _gl = gangLabel(_gang)>>
<<set $questOutcome = "You take the patch. From here you ride with " + _gl + " - their beefs are yours, their work is yours, and their people are at your back. The other cars just became enemies, and a parole file just grew a red flag. But nobody on this tier moves on you alone again.">>
<<elseif _p.systemic is "claimPunk">>
<<set _cn = _o.systemicTargetName>>
<<if _o and _o.breaks is "lovers">><<run coolLovers($prisonRoster)>><</if>>
<<set _claimQuestTool = ($player.gender() is "Female") ? "a prison-made strap" : "your cock">>
<<set _claimQuestCumHer = ($player.gender() is "Female") ? "The strap stays in her ass while you rock against the harness and cum." : "You bury your cock in her ass and cum before you let her off the rail.">>
<<set _claimQuestCumHim = ($player.gender() is "Female") ? "The strap stays in his ass while you rock against the harness and cum." : "You bury your cock in his ass and cum before you let him off the rail.">>
<<set _claimQuestOral = ($player.gender() is "Female") ? "lick your cunt" : "suck your cock">>
<<if $prison.block is "F">>
<<set $questOutcome = "You cut " + _cn + " out of the soft meat on the tier and take her to the open dayroom rail. You work her ass open, push " + _claimQuestTool + " into her, and fuck her where the wolves can watch. She cums despite herself with her hands locked around the bars. " + _claimQuestCumHer + " After that she learns to fetch, kneel, " + _claimQuestOral + " when ordered, and keep your bunk warm. She is yours on the block now, earning for you and answering when you call. The wolves nod you into their number.">>
<<else>>
<<set $questOutcome = "You cut " + _cn + " out of the soft meat on the tier and take him to the open dayroom rail. You work his ass open, push " + _claimQuestTool + " into him, and fuck him where the wolves can watch. He cums despite himself with his hands locked around the bars. " + _claimQuestCumHim + " After that he learns to fetch, kneel, " + _claimQuestOral + " when ordered, and keep your bunk warm. He is yours on the block now, earning for you and answering when you call. The wolves nod you into their number.">>
<</if>>
<<elseif _p.systemic is "protectFish">>
<<set _f = getCastInmate('fish')>>
<<set _pfn = _o.systemicTargetName>>
<<if _f.gender isnot "Male">>
<<set $questOutcome = "You put yourself between " + _pfn + " and the wolves circling her and make it plain that touching her means going through you. She attaches herself to you after, loyal as only the once-terrified get - your woman on the tier now, and the wolves quietly note you cost them a mark.">>
<<else>>
<<set $questOutcome = "You put yourself between " + _pfn + " and the wolves circling him and make it plain that touching him means going through you. He attaches himself to you after, loyal as only the once-terrified get - your man on the tier now, and the wolves quietly note you cost them a mark.">>
<</if>>
<<elseif _p.systemic is "sellFish">>
<<set _f = getCastInmate('fish')>>
<<set _sfn = _o.systemicTargetName>>
<<if _f.gender isnot "Male">>
<<set $questOutcome = "You point the wolves toward " + _sfn + " and take your scrip for the introduction. They drag her into the back cell while you are still counting it. One woman locks her wrists behind her; another straps on and fucks her ass until she cums rubbing herself against the harness, then hands the strap over. " + _sfn + "'s body forces an orgasm while they hold her down. When they bring her out, she sees the payment in your fist and turns her face away. The woman who paid you taps two fingers against the scrip.">>
<<else>>
<<set $questOutcome = "You point the wolves toward " + _sfn + " and take your scrip for the introduction. They drag him into the back cell while you are still counting it. The first man holds his jaw and fucks his mouth; the others force him over the bunk, use his ass, and cum in him before trading places. " + _sfn + " orgasms under the hands pinning him. When they bring him out, he sees the payment in your fist and turns his face away. The man who paid you taps two fingers against the scrip.">>
<</if>>
<<elseif _p.systemic is "buildKit">>
<<set $prison.hasEscapeTool = true>>
<<set $prison.hasDisguise = true>>
<<set $prison.hasLockpick = true>>
<<run unlockPrisonAchievement('escapeKit')>>
<<set $questOutcome = _oc>>
<<elseif _p.systemic is "checkPC">>
<<set $segMsg = _oc>>
<<set $questOutcome = "">>
<<set $questOutcomePath = "">>
<<EnterProtectiveCustody>>
<<elseif _p.systemic is "cellyBond">>
<<set $prison.cellmateAlly = true>>
<<set _questCelly = getCastInmate('cellmate')>>
<<if _questCelly>>
<<set _questCelly.allyOfPlayer = true>>
<<set _questCelly.stats.trust = Math.max(60, _questCelly.stats.trust || 0)>>
<</if>>
<<run unlockPrisonAchievement('cellmateBond')>>
<<set $questOutcome = _oc>>
<<elseif _p.systemic is "takeLover">>
<<set _ln = _o.systemicTargetName>>
<<if prisonPlayerActiveSexBlocked($player, $playerlock)>>
<<set _loverQuestGender = _o.systemicTargetGender ? _o.systemicTargetGender : "Male">>
<<if HasSexPickByTable("Anal", _loverQuestGender, $player.gender())>>
<<SetAnalPick _loverQuestGender $player.gender()>><<set $questOutcomeVideo = _pick>>
<</if>>
<<set _loverQuestTop = (_loverQuestGender is "Female") ? "a prison-made strap" : "their cock">>
<<set $questOutcome = "You stop pretending it is only heat with " + _ln + " and close the cell door together. Your cage stays locked, so you kiss, get on the bunk, and let them take the lead. They work your ass open, push " + _loverQuestTop + " into you, and fuck you until you cum from being used. Afterward you share the narrow bunk and name it for what it is: chosen, equal, nobody owning anybody. For the first time since the gate shut, you are not doing this time alone.">>
<<else>>
<<set _loverQuestTool = ($player.gender() is "Female") ? "a prison-made strap" : "your cock">>
<<set _loverQuestCum = ($player.gender() is "Female") ? "You keep the strap in their ass and grind into the harness until you cum against their back." : "You cum in their ass and stay there until both of you catch your breath.">>
<<set $questOutcome = "You stop pretending it is only heat with " + _ln + " and close the cell door together. You kiss without a price on it, use mouths and hands until both of you cum, then work their ass open and push " + _loverQuestTool + " into them. They cum again under you. " + _loverQuestCum + " Afterward you share the narrow bunk and name it for what it is: chosen, equal, nobody owning anybody. For the first time since the gate shut, you are not doing this time alone.">>
<</if>>
<<elseif _p.systemic is "keptByWolf">>
/* Player becomes the wolf's kept inmate: his wall goes up around you. The
player-feminization step rides the shared _o.feminize line below. */
<<set $prison.protected = true>>
<<set _kwid = getCastInmateId('wolf')>>
<<if _kwid isnot undefined>><<set $prison.protectorId = _kwid>><</if>>
<<set $questOutcome = _oc>>
<<elseif _p.systemic is "feminizePunk">>
<<if _p.key is "break">>
<<set _mkName = _o.systemicTargetName>>
<<set _mkTool = ($player.gender() is "Female") ? "a prison-made strap" : "your cock">>
<<set _mkCum = ($player.gender() is "Female") ? "You leave the strap buried in his ass and grind yourself to orgasm against the harness." : "You cum in his ass with his chest pinned to the rail.">>
<<set $questOutcome = "You take " + _mkName + " to the dayroom rail and do the work where everyone can see it. You beat the fight out of him, bend him over, work his ass open, and push " + _mkTool + " into him. He cums despite himself while you fuck him against the bars. " + _mkCum + " Then you put the orderly's pills in his mouth and make him kneel at your snap. His face softens and his body rounds under the prison blues. At your second snap, she lowers her eyes and waits at your knee.">>
<<else>>
<<set $questOutcome = _oc>>
<</if>>
<<elseif _p.systemic is "bloomInmate">>
<<set _bloomName = _o.systemicTargetName>>
<<set _bloomPlayerOral = prisonPlayerActiveSexBlocked($player, $playerlock) ? "pulls you close and lets you undress her" : (($player.gender() is "Female") ? "licks your cunt until you cum against her mouth" : "sucks your cock until you cum down her throat")>>
<<set $questOutcome = "You get " + _bloomName + " the orderly's pills and stand between her and the hands that would turn the change into a claim. Her face is softer, her body fuller, and she smiles at herself in the steel mirror before coming to your bunk because she wants to. She " + _bloomPlayerOral + ". You take her cock into your mouth and suck until she cums down your throat. Neither of you owes protection afterward. She steps back onto the tier in her own name without checking who is behind her.">>
<<elseif _p.systemic is "finishPlayerShemale">>
/* Stage 5 is the prison line's finished shemale body: feminine face,
breasts and hips, with the player's cock deliberately preserved. */
<<set $questOutcome = _oc>>
<<elseif _p.systemic is "playerShemaleWolf">>
<<set _psWolfName = _o.systemicTargetName>>
<<set _psWolfGender = _o.systemicTargetGender ? _o.systemicTargetGender : "Male">>
<<if HasSexPickByTable("Anal", _psWolfGender, $player.gender())>>
<<SetAnalPick _psWolfGender $player.gender()>>
<<set $questOutcomeVideo = _pick>>
<</if>>
<<if _psWolfGender is "Female">>
<<set $questOutcome = _psWolfName + " locks the cell, strips your shirt off, and makes you bend over the bunk. She works your ass open and pushes a prison-made strap into you. Your new breasts drag over the blanket while she fucks you. You stroke your cock between your feminine thighs and cum onto the mattress. She keeps the strap in your ass, rubs herself on the harness, and cums before sending you back onto the tier with your shirt still open.">>
<<elseif _psWolfGender is "Shemale">>
<<set _psWolfRelease = prisonPlayerActiveSexBlocked($player, $playerlock) ? "Your cage stays locked while she fucks an orgasm out of you against the mattress" : "She fucks you until you stroke your own cock and cum onto the mattress">>
<<set $questOutcome = _psWolfName + " locks the cell and bends you over the bunk. Her cock pushes into your ass while your new breasts drag over the blanket. " + _psWolfRelease + ", then she holds your hips and cums in your ass. Two shemale bodies leave the bunk afterward, but only one of you wears the wolf's claim.">>
<<else>>
<<set _psWolfRelease = prisonPlayerActiveSexBlocked($player, $playerlock) ? "Your cage stays locked while he fucks an orgasm out of you against the mattress" : "He fucks you until you stroke your own cock and cum onto the mattress">>
<<set $questOutcome = _psWolfName + " locks the cell and bends you over the bunk. His cock pushes into your ass while your new breasts drag over the blanket. " + _psWolfRelease + ", then he holds your hips and cums in your ass. He sends you back onto the tier with semen leaking between your feminine thighs.">>
<</if>>
<<elseif _p.systemic is "playerShemalePartner">>
<<set _psPartnerName = _o.systemicTargetName>>
<<set _psPartnerGender = _o.systemicTargetGender ? _o.systemicTargetGender : "Male">>
<<if _psPartnerGender is "Female">>
<<if HasSexPickByTable("Vag", $player.gender(), _psPartnerGender)>>
<<SetVagPick $player.gender() _psPartnerGender>>
<<set $questOutcomeVideo = _pick>>
<</if>>
<<set $questOutcome = "You pull " + _psPartnerName + " behind the laundry screen and open your shirt so she can hold your breasts while you kiss. Then you spread her legs, sink into her cunt and take her against the washer until she cums around you. You keep thrusting through it and cum in her cunt. She cleans you both with a prison towel before count.">>
<<else>>
<<if HasSexPickByTable("Anal", $player.gender(), _psPartnerGender)>>
<<SetAnalPick $player.gender() _psPartnerGender>>
<<set $questOutcomeVideo = _pick>>
<</if>>
<<set _psPartnerPronoun = (_psPartnerGender is "Shemale") ? "her" : "him">>
<<set _psPartnerSubject = (_psPartnerGender is "Shemale") ? "she" : "he">>
<<set _psPartnerPossessive = (_psPartnerGender is "Shemale") ? "her" : "his">>
<<set $questOutcome = "You pull " + _psPartnerName + " behind the laundry screen and make " + _psPartnerPronoun + " hold your new breasts while you kiss. You bend " + _psPartnerPronoun + " over the washer, push your cock into " + _psPartnerPossessive + " ass, and fuck until " + _psPartnerSubject + " cums under you. You cum in " + _psPartnerPossessive + " ass and stay pressed together until the pipes stop shaking.">>
<</if>>
<<elseif _p.systemic is "completeMakingShemale">>
<<set _makingFullName = _o.systemicTargetName>>
<<if _p.key is "dose">>
<<set $questOutcome = "You buy the full course for " + _makingFullName + ", hold her jaw, and feed her every tablet. The cramps fold her over before the change starts. Her breasts grow into your hands, her waist pulls tight, her hips spread, and her face finishes feminine. Her cock remains between her thighs. By morning the same inmate you claimed is fully shemale, kneeling naked beside your bunk because you have not told her to dress.">>
<<else>>
<<set $questOutcome = "You keep the last tablets above " + _makingFullName + "'s head until she begs for them by name. Each dose comes after another order. By morning her breasts fill the cut-down shirt, her hips strain the blues, and her face is fully feminine. Her cock remains. She kneels, repeats that you made her a shemale, and waits for the first order given to the finished body.">>
<</if>>
<<elseif _p.systemic is "useFinishedPunk">>
<<set _madeName = _o.systemicTargetName>>
<<set _madeGender = _o.systemicTargetGender ? _o.systemicTargetGender : "Shemale">>
<<set _madePlayerGender = $player.gender()>>
<<if _p.key is "rail">>
<<if HasSexPickByTable("Anal", _madePlayerGender, _madeGender)>>
<<SetAnalPick _madePlayerGender _madeGender>>
<<set $questOutcomeVideo = _pick>>
<</if>>
<<set _madeRailTool = (_madePlayerGender is "Female") ? "prison-made strap" : "cock">>
<<set _madeRailCum = (_madePlayerGender is "Female") ? "You keep the strap in her ass, grind your cunt against the harness, and cum over the back of her thighs." : "You hold her against the bars and cum in her ass.">>
<<set $questOutcome = "You strip " + _madeName + " at the dayroom rail. Her breasts flatten against the bars and her cock hangs hard between her feminine thighs. You work her ass open, push your " + _madeRailTool + " into her, and fuck her while the tier watches. She cums over the floor without touching herself. " + _madeRailCum + " You make her clean the rail before she can dress.">>
<<elseif _p.key is "service">>
<<if _madePlayerGender is "Female">>
<<if HasSexPickByTable("Vag", _madeGender, _madePlayerGender)>>
<<SetVagPick _madeGender _madePlayerGender>>
<<set $questOutcomeVideo = _pick>>
<</if>>
<<set $questOutcome = "You put " + _madeName + " behind you on the bunk and order her to use the cock you left her. She pushes into your cunt and fucks you with her breasts against your back. You cum around her cock. She keeps thrusting until she cums in your cunt, then kneels beside the bunk while it runs down your thighs.">>
<<else>>
<<if HasSexPickByTable("Anal", _madeGender, _madePlayerGender)>>
<<SetAnalPick _madeGender _madePlayerGender>>
<<set $questOutcomeVideo = _pick>>
<</if>>
<<set _madeServiceRelease = prisonPlayerActiveSexBlocked($player, $playerlock) ? "Your cage stays locked while she fucks an orgasm out of you against the bunk." : "You stroke your cock and cum over the blanket.">>
<<set $questOutcome = "You put " + _madeName + " behind you and order her to use the cock you left her. She works your ass open, pushes in, and fucks you against the bunk while her breasts press into your back. " + _madeServiceRelease + " She holds you down and cums in your ass, then pulls out and waits on her knees for the next order.">>
<</if>>
<<else>>
<<if _madePlayerGender is "Female">>
<<if HasSexPickByTable("Vag", _madeGender, _madePlayerGender)>>
<<SetVagPick _madeGender _madePlayerGender>>
<<set $questOutcomeVideo = _pick>>
<</if>>
<<set $questOutcome = "You close the curtain and ask " + _madeName + " what she wants. She puts you on the bunk, licks your cunt until you cum, then pushes her cock into you and fucks you slowly. She cums in your cunt with your hands on her breasts. For the first time since you started changing her, she chose every part of the scene.">>
<<else>>
<<if HasSexPickByTable("Anal", _madeGender, _madePlayerGender)>>
<<SetAnalPick _madeGender _madePlayerGender>>
<<set $questOutcomeVideo = _pick>>
<</if>>
<<set _madeChoiceStart = prisonPlayerActiveSexBlocked($player, $playerlock) ? "Your cage stays locked. She puts you on the bunk" : "She puts you on the bunk, sucks your cock until you cum in her mouth, then">>
<<set $questOutcome = "You close the curtain and ask " + _madeName + " what she wants. " + _madeChoiceStart + " works your ass open and pushes her cock into you. She fucks you slowly and cums in your ass with your hands on her breasts. For the first time since you started changing her, she chose every part of the scene.">>
<</if>>
<</if>>
<<elseif _p.systemic is "completeBloomShemale">>
<<set _bloomFullName = _o.systemicTargetName>>
<<if _p.key is "clinic">>
<<set $questOutcome = "You buy a clean finishing course for " + _bloomFullName + " and stay in the closed shower while she takes it. Her breasts grow heavy, her hips fill the prison pants, and her face settles fully feminine. When the cramps stop, she stands naked at the steel mirror with her cock still between her thighs. She says her name once, smiles, and pulls you into her finished body.">>
<<else>>
<<set $questOutcome = "You stay with " + _bloomFullName + " through every last dose. You hold her when the cramps hit, cup her breasts as they fill, and watch her hips and face finish changing. At the end of the week she stands fully feminine before the steel mirror with her cock still between her thighs. She smiles at the body she chose.">>
<</if>>
<<elseif _p.systemic is "loveFinishedShemale">>
<<set _loveName = _o.systemicTargetName>>
<<set _loveGender = _o.systemicTargetGender ? _o.systemicTargetGender : "Shemale">>
<<set _lovePlayerGender = $player.gender()>>
<<if _p.key is "give">>
<<if HasSexPickByTable("Anal", _loveGender, _lovePlayerGender)>>
<<SetAnalPick _loveGender _lovePlayerGender>>
<<set $questOutcomeVideo = _pick>>
<</if>>
<<set _lovePlayerRelease = (_lovePlayerGender is "Female") ? "You rub your clit while she fucks you and cum with her cock deep in your ass." : (prisonPlayerActiveSexBlocked($player, $playerlock) ? "Your cage stays locked while she fucks an orgasm out of you with her cock deep in your ass." : "You stroke your cock while she fucks you and cum across the blanket.")>>
<<set $questOutcome = _loveName + " lies over you with her finished breasts against your chest, works your ass open, and pushes her cock inside. She fucks you slowly until you pull her tighter. " + _lovePlayerRelease + " She holds your hips and cums in your ass, then stays inside while you kiss through the noise of count.">>
<<elseif _p.key is "take">>
<<if HasSexPickByTable("Anal", _lovePlayerGender, _loveGender)>>
<<SetAnalPick _lovePlayerGender _loveGender>>
<<set $questOutcomeVideo = _pick>>
<</if>>
<<set _loveTopTool = (_lovePlayerGender is "Female") ? "prison-made strap" : "cock">>
<<set _loveTopRelease = (_lovePlayerGender is "Female") ? "She cums around the strap while you grind the harness over your clit and cum against her back." : "She cums under you and you answer by pushing deep and cumming in her ass.">>
<<set $questOutcome = _loveName + " bends over the bunk because she wants you there. You hold her new breasts from behind, open her ass, and push your " + _loveTopTool + " into her. Her cock swings between feminine thighs while you fuck her. " + _loveTopRelease + " Afterward she turns around and kisses you before either of you cleans up.">>
<<else>>
<<if HasSexPickByTable("Oral", _loveGender, _lovePlayerGender)>>
<<SetOralPick _loveGender _lovePlayerGender>>
<<set $questOutcomeVideo = _pick>>
<</if>>
<<set _loveReturnOral = (_lovePlayerGender is "Female") ? "She spreads your thighs, works her tongue over your clit and does not stop until you cum on her mouth." : (prisonPlayerActiveSexBlocked($player, $playerlock) ? "Your cage stays locked, so you keep the scene on her body and make her cum a second time with your mouth." : "She takes your cock into her mouth and sucks until you cum down her throat.")>>
<<set _loveChangesPlaces = prisonPlayerActiveSexBlocked($player, $playerlock) ? "" : "Then she changes places with you. ">>
<<set $questOutcome = "You kneel between " + _loveName + "'s feminine thighs, take her cock into your mouth, and suck until she cums down your throat with both hands in your hair. " + _loveChangesPlaces + _loveReturnOral + " You stay tangled together on the lower bunk, laughing into each other's skin when the tier tells you to keep it down.">>
<</if>>
<<else>>
<<if _o and _o.breaks is "lovers">><<run coolLovers($prisonRoster)>><</if>>
<<set $questOutcome = _oc>>
<<if _o and _o.goodTime>>
<<set _gtResult = applyGoodTime(_o.goodTime)>>
<<if _gtResult.applied gt 0>>
<<set $questOutcome += " " + _gtResult.applied + (_gtResult.applied is 1 ? " day comes" : " days come") + " off your bid.">>
<<else>>
<<set $questOutcome += " Your good-time allowance is already full today; no additional days come off your bid.">>
<</if>>
<</if>>
<</if>>
/* Effects the meters cannot carry, applied for every path: a feminization
step (behind the body-content toggle) and a follow-up quest a choice opened.
The body only ever moves one way; no quest takes femininity back off. */
<<if _o and _o.feminize and $gameSettings.contentFilter.PlayerFeminization == true and $player.gender() isnot "Female">><<run applyFeminizationStage($player, 1)>><</if>>
<<if _o and _o.unlocked>><<set _unlDef = getPrisonQuestDef(_o.unlocked)>><<if _unlDef>><<set $questUnlockedTitle = _unlDef.title>><</if>><</if>>
<</if>>
<<if _p.systemic isnot "checkPC">><<goto "Prison_QuestOut">><</if>>
<</if>>
<</button>>
</div>
<</if>>
</div>
<</if>>
<</capture>>
<</for>>
<div class="btn padding-top"><<button "Leave it for now" _questHome>><</button>></div>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<set _questVisit = ($prison and $prison.inside) ? getActiveCrossBlockVisit($prison, { day: getCurrentAbsoluteDay(), hour: $dateTime.hours, minute: $dateTime.minutes }) : null>>
<<if not $prison or not $prison.inside>>
<<set $questOutcome = "">><<set $questOutcomePath = "">><<set $questOutcomeVideo = "">><<set $questUnlockedTitle = "">>
<<goto "PoliceStation">>
<<elseif _questVisit>>
<<set $questOutcome = "">><<set $questOutcomePath = "">><<set $questOutcomeVideo = "">><<set $questUnlockedTitle = "">>
<<goto "Prison_OtherBlock">>
<<else>>
<<set _questHome = $prison.inPC ? "Prison_Segregation" : "Prison_Block">>
<<if $prison.inPC>><<SetBackground "Media/Locations/Prison/segregation.jpg">><<elseif $prison.block is "F">><<SetBackground "Media/Locations/Prison/block_f_dayroom.jpg">><<else>><<SetBackground "Media/Locations/Prison/block_m_dayroom.jpg">><</if>>
<<set _def = getPrisonQuestDef($activeQuestId)>>
<<set _outPath = _def ? getPrisonQuestPath($activeQuestId, $questOutcomePath) : null>>
<<set _questResultParticipantsAdult = prisonAdultSceneAllowed()>>
<<set _questResultPairAllowed = (_def and _def.adultPair) ? CheckContentFilter(_def.adultPair[0], _def.adultPair[1]) : CheckContentFilter(($prison.block is "F" ? "Female" : "Male"), $player)>>
<<set _ctx = buildQuestContext(_questResultParticipantsAdult and _questResultPairAllowed, ($gameSettings.contentFilter.nonConsent === true))>>
<<set _questResultProvenance = (((not $questOutcome or $questOutcome is "") and (not $questUnlockedTitle or $questUnlockedTitle is "")) or _outPath)>>
<<set _questResultAllowed = (_def and (not $prison.inPC or _def.line is "program") and _questResultProvenance and (not _def.adult or _ctx.filterAdult) and (not _def.playerFem or _ctx.playerFem is true) and (not _def.requiresBlock or _def.requiresBlock is _ctx.block) and (not _def.requiresPlayerGender or _def.requiresPlayerGender is _ctx.playerGender) and (not _outPath or ((not _outPath.adult or _ctx.filterAdult) and (not _outPath.coercive or (_ctx.filterAdult and _ctx.filterNonConsent)))))>>
<<if not _questResultAllowed>>
<<set $questOutcome = "">>
<<set $questOutcomePath = "">>
<<set $questOutcomeVideo = "">>
<<set $questUnlockedTitle = "">>
<<goto _questHome>>
<<else>>
<<if _def>><div class="centre-text"><<= _def.title>></div><</if>>
<<if $questOutcomeVideo>><<Video $questOutcomeVideo>><</if>>
<<if $questOutcome>><<PrisonProse $questOutcome>><</if>>
<<if $questUnlockedTitle>><div class="centre-text" style="font-size:14px;color:#d9b44a;padding-top:6px;">A new thread opens on the tier: <<= $questUnlockedTitle>></div><<set $questUnlockedTitle = "">><</if>>
<<set _questBackLabel = $prison.inPC ? "Back behind the line" : "Back to the block">>
<div class="btn padding-top"><<button _questBackLabel _questHome>><</button>></div>
<<set $questOutcome = "">>
<<set $questOutcomePath = "">>
<<set $questOutcomeVideo = "">>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<set _activeCrossVisit = ($prison and $prison.inside) ? getActiveCrossBlockVisit($prison, { day: getCurrentAbsoluteDay(), hour: $dateTime.hours, minute: $dateTime.minutes }) : null>>
<<if not $prison or not $prison.inside>>
<<goto "PoliceStation">>
<<elseif _activeCrossVisit>>
<<goto "Prison_OtherBlock">>
<<elseif $prison.inPC>>
<<goto "Prison_Segregation">>
<<else>>
/* The hub clears the quest-route marker so a routed capstone (escape / parole / the
throne) only ever completes the quest that actually routed to it - the dispatcher
re-stamps $questRouteId on the way back out. */
<<set $questRouteId = "">>
<<set $questRoutePath = "">>
<<if $prison.block is "F">>
<<SetBackground "Media/Locations/Prison/block_f_dayroom.jpg">>
<<else>>
<<SetBackground "Media/Locations/Prison/block_m_dayroom.jpg">>
<</if>>
<<set _prog = getSentenceProgress()>>
<<set _canOut = canRelease()>>
/* One visible autonomous incident roll per prison day. The selected actor and
type are persisted before routing so direct passage access and reloads cannot
manufacture an attack or a free dose. */
<<if not _canOut and not $prison.playerIncidentToday and $gameSettings.contentFilter.NPC_Activity isnot false>>
<<set $prison.playerIncidentToday = true>>
<<set _incidentDom = $player.attributes.dominance ? $player.attributes.dominance.value : $player.attributes.dexterity.value>>
<<set _incidentCtx = {
playerDominance: _incidentDom,
playerRep: ($prison.rep || 0),
allowPlayerFeminization: ($gameSettings.contentFilter.PlayerFeminization == true),
playerCanFeminize: ($player.gender() isnot "Female" and femStage($player) lt 6)
}>>
<<set _incident = pickPrisonPlayerIncident($prisonRoster, _incidentCtx)>>
<<if _incident>>
<<set $prison.playerIncident = _incident>>
<<set $prison.sceneAuthority = { scene: "playerIncident", stintDay: getPrisonStintDay(), targetId: _incident.actorId }>>
<<goto "Prison_PlayerIncident">>
<</if>>
<</if>>
<<set _bizRefresh = { generated: false, expired: false, notice: "", business: null }>>
/* Business lifecycle runs on the sleep-tick stint day, NOT the civil-day
_prog.day: an evening errand crossing midnight must not rotate the offer
or fail an accepted job (prison rule: daily gates never on the civil roll). */
<<if not _canOut>><<set _bizRefresh = refreshPrisonBusiness($prison, $prisonRoster, getPrisonStintDay())>><</if>>
<<set _biz = $prison.business>>
<div class="centre-text">Cellblock <<= $prison.block>></div>
<<set _blockAct = prisonAct(getPrisonStintDay(), _prog.total)>>
<div class="centre-text" style="font-size:18px;">Day <<= _prog.day>> / <<= _prog.total>> · <<= _prog.daysLeft>> days left · <<= PRISON_ACT_LABELS[_blockAct]>></div>
<<set _blockAhead = prisonAnchorsAhead(getPrisonStintDay(), _prog.total, 2)>>
<<if _blockAhead.length gt 0>>
<div class="centre-text" style="font-size:13px;">Coming up: <<for _a range _blockAhead>><<= _a.label>>. <</for>></div>
<</if>>
<<if $workMsg and $workMsg isnot "">>
<<PrisonProse $workMsg>>
<<set $workMsg = "">>
<</if>>
<<if $prisonIncidentMsg and $prisonIncidentMsg isnot "">>
<<PrisonProse $prisonIncidentMsg>>
<<set $prisonIncidentMsg = "">>
<</if>>
<<run ensurePrisonSkills($prison)>>
<<run ensurePrisonDirector($prison)>>
<<if $prison.director.reliefOffer>>
<fieldset class="prison-business-card">
<legend>A job nobody claimed</legend>
<div class="centre-text" style="font-size:14px;">An orderly needs one more set of hands before count. There is no guarantee somebody else will not take the paid half first.</div>
<<set _reliefLabel = prisonReliefLabel($prison.director.reliefOffer.kind)>>
<div class="btn"><<button _reliefLabel>>
<<set _reliefRng = prisonSeededRng(getPrisonStintDay() * 811 + ($prison.director.boredom || 0) * 17)>>
<<set _relief = resolvePrisonRelief($prison, _reliefRng)>>
<<if _relief.ok>><<set $prisonIncidentMsg = _relief.text>><</if>>
<<goto "Prison_Block">>
<</button>></div>
</fieldset>
<</if>>
<<if _bizRefresh.notice>><<PrisonProse _bizRefresh.notice>><</if>>
<<if $prisonMorningReport and $prisonMorningReport.length > 0>>
<fieldset>
<legend>Overnight on the block</legend>
<div class="prison-roster">
<<for _rep range $prisonMorningReport>>
<div class="centre-text" style="font-size:13px;"><<= _rep.text>></div>
<</for>>
</div>
</fieldset>
<<set $prisonMorningReport = []>>
<</if>>
<fieldset>
<legend>Block</legend>
<div class="btn-container">
<div class="btn"><<button "Your jacket" "Prison_Jacket">><</button>></div>
<<if _canOut>>
<div class="btn"><<button "Walk out - your time is served" "Prison_Release">><</button>></div>
<<else>>
<<if $prison.workedToday>>
<div class="btn non-interacting"><<button "Work detail - completed today">><</button>></div>
<<elseif prisonRegimeOpen("work", $dateTime.hours, getPrisonStintDay())>>
<div class="btn"><<button "Work your detail" "Prison_Work">><</button>></div>
<<else>>
<<set _workWaitMinutes = minutesUntilPrisonAreaOpens("work", $dateTime.hours, $dateTime.minutes, getPrisonStintDay())>>
<<if _workWaitMinutes isnot null and _workWaitMinutes gt 0>>
<<capture _workWaitMinutes>>
<div class="btn"><<button "Wait until work detail opens">><<SpendTime _workWaitMinutes>><<goto "Prison_Work">><</button>></div>
<</capture>>
<<else>>
<div class="btn non-interacting"><<button "Work detail - next call 08:00-12:00">><</button>></div>
<</if>>
<</if>>
<div class="btn"><<button "Lie low (pass the day)" "Prison_PassDay">><</button>></div>
<div class="btn"><<button "Back to your cell" "Prison_Cell">><</button>></div>
<<if $prison.protected>>
<div class="btn"><<button "See what the wolf wants" "Prison_Protection">><</button>></div>
<<else>>
<div class="btn"><<button "Approach the wolf" "Prison_Protection">><</button>></div>
<</if>>
<<if $prison.gang and not $prison.gangJobDone>>
<div class="btn"><<button "Take a contraband, debt, or shanking job for the car">><<set $prison.sceneAuthority = { scene: "gangJob", stintDay: getPrisonStintDay() }>><<goto "Prison_GangJob">><</button>></div>
<</if>>
<<if $prison.gang>>
<div class="btn"><<button "Enter the car's back cell for sex" "Prison_CarFlesh">><</button>></div>
<</if>>
<<if $prison.shotCaller>>
<div class="btn"><<button "Run the tier" "Prison_RunBlock">><</button>></div>
<</if>>
<div class="btn"><<button "Cross to the other block" "Prison_CrossBlock">><</button>></div>
<div class="btn"><<button "Check into protective custody" "Prison_PCCheckIn">><</button>></div>
<<if ($prison.heldMoney || 0) gte 200>>
<div class="btn"><<button "Post bail and walk (forfeit your held cash)" "Prison_Bail">><</button>></div>
<</if>>
<</if>>
</div>
</fieldset>
<<if _biz>>
<<set _bizSource = getInmate($prisonRoster, _biz.sourceId)>>
<<set _bizTarget = getInmate($prisonRoster, _biz.targetId)>>
<<if _bizSource and _bizTarget>>
<fieldset class="prison-business-card" @data-status="_biz.status">
<legend>Business on the tier</legend>
<<set _bizBlurb = prisonInmateBlurb(_bizSource)>>
<<set _bizFace = npcFacePath(_bizBlurb.stage, _bizSource.id, _bizSource.gender)>>
<div class="prison-business-card__grid">
<img class="prison-business-card__face" @src="_bizFace" @alt="_bizSource.name">
<div class="prison-business-card__body">
<div class="prison-business-card__eyebrow"><<= prisonBusinessKindLabel(_biz.kind)>> · due by day <<= _biz.dueDay>></div>
<div class="prison-business-card__title"><<= prisonBusinessTitle(_biz.kind)>></div>
<<if _biz.status is "offered">>
<div class="prison-business-card__text"><<= _bizSource.name>> has put your name on a possible job involving <<= _bizTarget.name>>. Nothing is owed until you say yes.</div>
<<elseif _biz.status is "accepted">>
<div class="prison-business-card__text"><<= prisonBusinessInstruction(_biz, $prisonRoster)>></div>
<<else>>
<div class="prison-business-card__text"><<= _biz.outcome || "The work is closed.">></div>
<</if>>
</div>
<<if _biz.status is "offered" or _biz.status is "accepted">>
<<set _bizButton = (_biz.status is "offered") ? "Hear the offer" : "Check the job">>
<div class="btn prison-business-card__cta"><<button _bizButton "Prison_Business">><</button>></div>
<</if>>
</div>
</fieldset>
<</if>>
<</if>>
<<PrisonQuestThreads>>
<<PrisonNav>>
<<PrisonPeople>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<if $prison.block is "F">>
<<SetBackground "Media/Locations/Prison/block_f_dayroom.jpg">>
<<else>>
<<SetBackground "Media/Locations/Prison/block_m_dayroom.jpg">>
<</if>>
<div class="centre-text">Your Jacket</div>
<div class="centre-text" style="font-size:13px;">Your standing, your debts and the offers waiting for an answer.</div>
<<PrisonJacket>>
<div class="btn padding-top"><<button "Back to the block" "Prison_Block">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<if $prison.block is "F">><<SetBackground "Media/Locations/Prison/block_f_dayroom.jpg">><<else>><<SetBackground "Media/Locations/Prison/block_m_dayroom.jpg">><</if>>
<<set _biz = $prison.business>>
<<set _day = getPrisonStintDay()>>
<<if not _biz>>
<<goto "Prison_Block">>
<<else>>
<<set _source = getInmate($prisonRoster, _biz.sourceId)>>
<<set _target = getInmate($prisonRoster, _biz.targetId)>>
<<if not _source or not _target>>
<<goto "Prison_Block">>
<<else>>
<<set _sb = prisonInmateBlurb(_source)>>
<<set _tb = prisonInmateBlurb(_target)>>
<<set _sf = npcFacePath(_sb.stage, _source.id, _source.gender)>>
<<set _tf = npcFacePath(_tb.stage, _target.id, _target.gender)>>
<div class="centre-text">Tier Business</div>
<div class="prison-business-stage">
<div class="prison-business-person"><img @src="_sf" @alt="_source.name"><strong><<= _source.name>></strong><span>puts up the work</span></div>
<div class="prison-business-route"><span><<= prisonBusinessKindLabel(_biz.kind)>></span><strong>⟶</strong><small>due day <<= _biz.dueDay>></small></div>
<div class="prison-business-person"><img @src="_tf" @alt="_target.name"><strong><<= _target.name>></strong><span>the other name</span></div>
</div>
<div class="prison-business-sheet">
<div class="prison-business-sheet__head"><span><<= prisonBusinessTitle(_biz.kind)>></span><strong><<= _biz.reward>> scrip</strong></div>
<div class="prison-business-sheet__copy"><<= prisonBusinessInstruction(_biz, $prisonRoster)>></div>
<div class="prison-business-sheet__meta">Reliability: <<= prisonBusinessCredLabel(prisonBusinessCred($prison))>> · Risk <<= _biz.difficulty>>/100</div>
</div>
<<if $businessMsg and $businessMsg isnot "">><<PrisonProse $businessMsg>><</if>>
<<if _biz.status is "offered">>
<div class="prison-business-warning">Nothing is owed until you accept. Once you take the word, missing the deadline damages your name.</div>
<div class="btn-container">
<div class="btn"><<button "Take the work">>
<<set $businessMsg = acceptPrisonBusiness($prison, $prisonRoster)>>
<<goto "Prison_Business">>
<</button>></div>
<div class="btn"><<button "Hand it back clean">>
<<set $businessMsg = declinePrisonBusiness($prison, $prisonRoster, _day)>>
<<goto "Prison_BusinessResult">>
<</button>></div>
</div>
<<elseif _biz.status is "accepted">>
<<if _biz.kind is "kite" and not _biz.opened>>
<div class="btn padding-top"><<button "Steam the kite open before delivery">>
<<SpendTime 5>>
<<set $prison.heat = Math.min(100, ($prison.heat || 0) + 1)>>
<<set $businessMsg = inspectPrisonKite($prison, $prisonRoster)>>
<<goto "Prison_Business">>
<</button>></div>
<</if>>
<<set _where = prisonBusinessLocationLabel(_biz.location)>>
<<if _biz.route is "target">>
<<set _goLabel = "Find " + _target.name + " around " + _where>>
<<else>>
<<set _goLabel = "Go to " + _where + " for the handoff">>
<</if>>
<div class="btn padding-top"><<button _goLabel _biz.location>><</button>></div>
<div class="prison-business-warning prison-business-warning--danger">Walking away after accepting is remembered as a failed job.</div>
<div class="btn"><<button "Drop the work and take the hit">>
<<set $businessMsg = abandonPrisonBusiness($prison, $prisonRoster, _day)>>
<<goto "Prison_BusinessResult">>
<</button>></div>
<<else>>
<<if _biz.outcome>><<PrisonProse _biz.outcome>><</if>>
<</if>>
<div class="prison-imenu__foot"><div class="btn"><<button "Back to the block" "Prison_Block">><<set $businessMsg = "">><</button>></div></div>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<PrisonRestoreBackground>>
<<set _biz = $prison.business>>
<<set _target = getInmate($prisonRoster, $activeInmateId)>>
<<set _businessTargetAuthority = ($prison.sceneAuthority and $prison.sceneAuthority.scene is "businessTarget" and $prison.sceneAuthority.stintDay is getPrisonStintDay() and $prison.sceneAuthority.targetId is $activeInmateId and $prison.sceneAuthority.block is $player.info.currentLocation)>>
<<if not _biz or not _target or not _businessTargetAuthority or _target.location isnot $player.info.currentLocation or not prisonBusinessMatchesTarget(_biz, _target.id)>>
<<set $prison.sceneAuthority = null>>
<<goto $player.info.currentLocation>>
<<else>>
<<set _source = getInmate($prisonRoster, _biz.sourceId)>>
<<set _day = getPrisonStintDay()>>
<div class="centre-text">The Other End of the Job</div>
<<set _targetIntro = _target.name + " sees the business in your face before you speak. " + prisonBusinessInstruction(_biz, $prisonRoster)>>
<<PrisonProse _targetIntro>>
<<set _choices = getPrisonBusinessChoices(_biz, ($prison.scrip || 0))>>
<div class="prison-business-choices">
<<for _choice range _choices>>
<<capture _choice>>
/* Macros inside a plain HTML attribute are never wikified (SugarCube htmlTag
parser) - precompute the class string and bind it with @class. */
<<set _choiceClass = 'prison-business-choice' + (_choice.danger ? ' prison-business-choice--danger' : '')>>
<div @class="_choiceClass">
<div class="prison-business-choice__copy"><strong><<= _choice.label>></strong><span><<= _choice.description>></span></div>
<div class="btn"><<button "Choose">>
<<set $prison.sceneAuthority = null>>
<<set _skills = { dexterity: $player.attributes.dexterity.value, strength: $player.attributes.strength.value, persuasion: ($player.attributes.speech ? $player.attributes.speech.value : 3) + prisonSkillBonus($prison, "persuasion"), dominance: ($player.attributes.dominance ? $player.attributes.dominance.value : 5) }>>
<<set _out = resolvePrisonBusiness($prison, $prisonRoster, _choice.key, _skills, _day)>>
<<if _out.valid>>
<<set $businessMsg = _out.text>>
<<if _out.jacketMark>><<run addJacketMark(_out.jacketMark)>><</if>>
<<if _out.success>><<run awardPrisonSkillPoints($prison, "business")>><<run recordPrisonDirectorEvent($prison, "activity")>><</if>>
<</if>>
<<goto "Prison_BusinessResult">>
<</button>></div>
</div>
<</capture>>
<</for>>
</div>
<div class="prison-imenu__foot"><div class="btn"><<button "Not yet">><<set $prison.sceneAuthority = null>><<goto $player.info.currentLocation>><</button>></div></div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<PrisonRestoreBackground>>
<<set _biz = $prison.business>>
<<set _businessRunAuthority = ($prison.sceneAuthority and $prison.sceneAuthority.scene is "businessRun" and $prison.sceneAuthority.stintDay is getPrisonStintDay() and $prison.sceneAuthority.block is $businessReturnLocation and $businessReturnLocation is $player.info.currentLocation)>>
<<if not _biz or not _businessRunAuthority or not prisonBusinessMatchesLocation(_biz, $businessReturnLocation)>>
<<set $prison.sceneAuthority = null>>
<<set $businessReturnLocation = "">>
<<goto "Prison_Block">>
<<else>>
<<set _source = getInmate($prisonRoster, _biz.sourceId)>>
<<set _target = getInmate($prisonRoster, _biz.targetId)>>
<<set _day = getPrisonStintDay()>>
<div class="centre-text">The Handoff</div>
<<set _runIntro = "This is the place: " + prisonBusinessLocationLabel(_biz.location) + ". " + prisonBusinessInstruction(_biz, $prisonRoster)>>
<<PrisonProse _runIntro>>
<<set _choices = getPrisonBusinessChoices(_biz, ($prison.scrip || 0))>>
<div class="prison-business-choices">
<<for _choice range _choices>>
<<capture _choice>>
/* Macros inside a plain HTML attribute are never wikified (SugarCube htmlTag
parser) - precompute the class string and bind it with @class. */
<<set _choiceClass = 'prison-business-choice' + (_choice.danger ? ' prison-business-choice--danger' : '')>>
<div @class="_choiceClass">
<div class="prison-business-choice__copy"><strong><<= _choice.label>></strong><span><<= _choice.description>></span></div>
<div class="btn"><<button "Choose">>
<<set $prison.sceneAuthority = null>>
<<set $businessReturnLocation = "">>
<<set _skills = { dexterity: $player.attributes.dexterity.value, strength: $player.attributes.strength.value, persuasion: ($player.attributes.speech ? $player.attributes.speech.value : 3) + prisonSkillBonus($prison, "persuasion"), dominance: ($player.attributes.dominance ? $player.attributes.dominance.value : 5) }>>
<<set _out = resolvePrisonBusiness($prison, $prisonRoster, _choice.key, _skills, _day)>>
<<if _out.valid>>
<<set $businessMsg = _out.text>>
<<if _out.jacketMark>><<run addJacketMark(_out.jacketMark)>><</if>>
<<if _out.success>><<run awardPrisonSkillPoints($prison, "business")>><<run recordPrisonDirectorEvent($prison, "activity")>><</if>>
<</if>>
<<goto "Prison_BusinessResult">>
<</button>></div>
</div>
<</capture>>
<</for>>
</div>
<div class="prison-imenu__foot"><div class="btn"><<button "Wait for a cleaner moment">><<set _return = $businessReturnLocation>><<set $prison.sceneAuthority = null>><<set $businessReturnLocation = "">><<goto _return>><</button>></div></div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<PrisonRestoreBackground>>
<div class="centre-text">The Ledger Moves</div>
<<if $businessMsg and $businessMsg isnot "">><<PrisonProse $businessMsg>><</if>>
<<if hasJacketMark("rat")>><div class="prison-business-warning prison-business-warning--danger">The staff file may like what you did. The tier now reads a rat mark on your jacket.</div><</if>>
<fieldset>
<legend>Your name after the job</legend>
<div class="centre-text" style="font-size:14px;">Reliability: <<= prisonBusinessCredLabel(prisonBusinessCred($prison))>></div>
<div class="centre-text" style="font-size:13px;">Clean: <<= ($prison.businessCompleted || 0)>> · Failed or bent: <<= ($prison.businessFailed || 0)>></div>
</fieldset>
<div class="btn padding-top"><<button "Back to the block" "Prison_Block">><<set $businessMsg = "">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<if $prison.block is "F">>
<<SetBackground "Media/Locations/Prison/cell_f.jpg">>
<<else>>
<<SetBackground "Media/Locations/Prison/cell_m.jpg">>
<</if>>
<<set _cm = getCastInmate('cellmate')>>
<div class="centre-text">Your Cell</div>
<<if not _cm>>
<div class="chat-container prison-prose"><p class="text">The second bunk is stripped to bare vinyl. For now, the cell is yours alone.</p></div>
<<else>>
<div class="centre-text" style="font-size:15px;">You bunk with <<= _cm.name>>.</div>
<div class="chat-container prison-prose"><p class="text"><<= _cm.name>> keeps <<if _cm.gender is "Male">>his<<else>>her<</if>> own counsel between counts. When <<if _cm.gender is "Male">>he<<else>>she<</if>> has something worth saying, <<if _cm.gender is "Male">>he<<else>>she<</if>> will make sure you hear it.</p></div>
<div class="btn-container">
<<set _hasCellQuest = false>>
<<if prisonQuestState('pq_solo_celly') is "active">>
<<set _hasCellQuest = true>>
<div class="btn"><<button "Continue: A Friend Inside">><<set $activeQuestId = "pq_solo_celly">><<goto "Prison_Quest">><</button>></div>
<</if>>
<<if prisonQuestState('pq_solo_real') is "active">>
<<set _hasCellQuest = true>>
<div class="btn"><<button "Continue: Something Real">><<set $activeQuestId = "pq_solo_real">><<goto "Prison_Quest">><</button>></div>
<</if>>
<<if not _hasCellQuest>>
<div class="prison-actnote">Tonight, <<= _cm.name>> has nothing for you beyond a nod and a little room on the bunk.</div>
<</if>>
</div>
<</if>>
<div class="btn-container">
<<if not $prison.soloToday>>
<div class="btn"><<button "Masturbate in your bunk">><<set $prison.sceneAuthority = { scene: "solo", stintDay: getPrisonStintDay() }>><<goto "Prison_Solo">><</button>></div>
<</if>>
<div class="btn"><<button "Back to the block" "Prison_Block">><</button>></div>
</div>
<</nobr>>
/* Legacy freeform cellmate interactions are intentionally unreachable. They
remain below temporarily as reference while quest-only scene prose is moved
into authored quest paths. */
<<if false>>
<<nobr>>
<<include "UpdateAll">>
<<PrisonPendingMediaGuard "cellMsg" "cellVideo">>
<<SaveLocation>>
<<if $prison.block is "F">>
<<SetBackground "Media/Locations/Prison/cell_f.jpg">>
<<else>>
<<SetBackground "Media/Locations/Prison/cell_m.jpg">>
<</if>>
<<set _cm = getCastInmate('cellmate')>>
<<if $cellVideo and $cellVideo isnot "" and (not _cm or not CheckContentFilter(_cm.gender, $player))>>
<<set $cellMsg = "">><<set $cellVideo = "">>
<</if>>
<div class="centre-text">Your Cell</div>
<<if $cellMsg and $cellMsg isnot "">>
<<PrisonMediaProse $cellMsg $cellVideo>>
<<if $cellVideo and $cellVideo isnot "">><<Video $cellVideo>><<set $cellVideo = "">><</if>>
<<set $cellMsg = "">>
<</if>>
<<if not _cm>>
<div class="chat-container prison-prose"><p class="text">Two bunks, one of them empty. You have the box to yourself for now - a small mercy on this tier, and probably a temporary one.</p></div>
<div class="btn-container">
<<if not $prison.soloToday>>
<div class="btn"><<button "Masturbate alone in your cell">><<set $prison.sceneAuthority = { scene: "solo", stintDay: getPrisonStintDay() }>><<goto "Prison_Solo">><</button>></div>
<</if>>
<div class="btn"><<button "Back to the block" "Prison_Block">><</button>></div>
</div>
<<else>>
<<set _b = prisonInmateBlurb(_cm)>>
<<set _she = (_cm.gender isnot "Male")>>
<div class="centre-text" style="font-size:15px;">You bunk with <<= _cm.name>> - <<= _b.role>><<if _b.gang>> with <<= _b.gang>><</if>>, in for <<= _b.crime>></div>
<div class="centre-text" style="font-size:14px;">Trust <<= _cm.stats.trust>>/100<<if $prison.cellmateAlly>> · watches your back<</if>></div>
<<set _askLbl = "Ask " + _cm.name + " to watch your back">>
<<set _dealLbl = "Square things with " + _cm.name + " directly">>
<<set _him = (_cm.gender isnot "Male") ? "her" : "him">>
<<set _takeLbl = "Fuck " + _him>>
<<set _recvLbl = "Ask " + _him + " to fuck you">>
<div class="btn-container">
<div class="btn"><<button "Talk for a while">>
<<SpendTime 15>>
<<set _e = getInmate($prisonRoster, $prison.cellmateId)>>
<<if _e.talkDay isnot ($prison.stintDay || 0)>><<set _e.talkDay = ($prison.stintDay || 0)>><<set _e.talkTrust = 0>><</if>>
<<set _tGain = Math.min(5, Math.max(0, 7 - (_e.talkTrust || 0)))>>
<<set _e.talkTrust = (_e.talkTrust || 0) + _tGain>>
<<set _e.stats.trust = Math.min(100, _e.stats.trust + _tGain)>>
<<if _e.stats.trust lt 30>>
<<if _e.gender is "Female">>
<<set $cellMsg = ["She keeps her shoes under the bunk and her cup upside down, then asks you not to touch either. That is all she offers for now.", "She answers two questions, ignores the third, and turns her family photo facedown before changing. You pretend not to notice."].random()>>
<<elseif _e.gender is "Shemale">>
<<set $cellMsg = ["She tells you which towel hook is hers and leaves the rest alone. Five minutes later she corrects you on count time without looking up.", "She gives you her county, her sentence, and a warning about the loose shelf. Her charge stays hers."].random()>>
<<else>>
<<set $cellMsg = ["He grunts when you enter, marks his side of the shelf with a soap sliver, and goes back to a dog-eared magazine.", "He tells you the toilet flush sticks and the CO on nights steals coffee. Personal questions get a flat stare."].random()>>
<</if>>
<<else>>
<<if _e.gender is "Female">>
<<set $cellMsg = ["She gives you the useful map: which matron reads mail, who waters the coffee, and which shower stall has a blind camera. Then she makes you repeat it.", "She laughs into her blanket so the sound will not carry. You nearly choke trying not to join her, and the woman next door bangs once on the wall."].random()>>
<<elseif _e.gender is "Shemale">>
<<set $cellMsg = ["She names the men who talk big, the two who carry steel, and the guard who trades favors for gossip. You write none of it down.", "She tells you how she once hid a phone battery in a jar of hair grease. Your story is worse. She calls you a liar and asks for the ending anyway."].random()>>
<<else>>
<<set $cellMsg = ["He sketches the block pecking order on the back of an old request slip, then chews the paper to pulp when you have it memorized.", "He tells you about a getaway car that died at the first red light. You trade the story of your worst mistake. Neither of you asks whether the details are true."].random()>>
<</if>>
<</if>>
<<goto "Prison_Cell">>
<</button>></div>
<<if not $prison.cellmateAlly and _cm.stats.trust gte 40>>
<div class="btn"><<button _askLbl>>
<<set $prison.cellmateAlly = true>>
<<run unlockPrisonAchievement('cellmateBond')>>
<<if _cm.gender isnot "Male">>
<<set $cellMsg = "You lay it out plain: anyone comes for either of you in the dark, the other gets off her bunk. " + _cm.name + " squeezes your hand once, then moves her towel from the chair beside hers.">>
<<else>>
<<set $cellMsg = "You lay it out plain: anyone comes for either of you in the dark, the other gets off his bunk. " + _cm.name + " hooks your wrist, then shifts his locker so both bunks share the same blind side.">>
<</if>>
<<goto "Prison_Cell">>
<</button>></div>
<</if>>
<<if _cm.stats.trust gte 50 and CheckContentFilter(_cm.gender, $player) and not $prison.cellNightToday>>
<div class="btn"><<button _takeLbl>>
<<set $prison.cellNightToday = true>>
<<SpendTime 30>>
<<set _e3 = getInmate($prisonRoster, $prison.cellmateId)>>
<<set _domG = $player.gender()>>
<<set _subG = _e3.gender>>
<<SetAnalPick _domG _subG>>
<<set $cellVideo = _pick>>
<<set _cellTool = ($player.gender() is "Female") ? "prison-made strap" : "cock">>
<<set _cellCumHer = ($player.gender() is "Female") ? "The strap shifts inside her ass while you grind on the harness and cum into the blanket." : "You cum in her ass and keep her tight against the mattress.">>
<<set _cellCumHim = ($player.gender() is "Female") ? "The strap shifts inside his ass while you grind on the harness and cum into the blanket." : "You cum in his ass and keep him tight against the mattress.">>
<<if _e3.gender is "Female">>
<<set $cellMsg = [
"She checks the gallery, slides into your bunk, and pulls the blanket over both of you. You push your " + _cellTool + " into her ass and take her slow, rubbing her clit until she cums into your palm. " + _cellCumHer + " She stays against you until the next footsteps.",
"You pin her to the thin mattress, lick her cunt until she cums, then work your " + _cellTool + " into her ass and fuck her under the blanket. " + _cellCumHer + " She drags you up for a hard kiss before returning to her bunk.",
"She climbs into your bunk with her hand already down your waistband. You bend her over, push your " + _cellTool + " into her ass, and stroke her clit while you fuck her until she cums. " + _cellCumHer + " A cup hammers the bars two cells down as you pull apart."
].random()>>
<<elseif _e3.gender is "Shemale">>
<<set $cellMsg = [
"She turns to the wall and reaches back. You push your " + _cellTool + " into her ass and jerk her off in time with your thrusts until she spills against the sheet. " + _cellCumHer + " You keep one hand over her mouth until the footsteps pass.",
"You get her face down on the thin mattress and fuck her ass with your " + _cellTool + " until she cums biting the blanket. " + _cellCumHer + " She keeps your arm around her while someone passes the cell.",
"She braces against the wall and you push your " + _cellTool + " into her ass, chest to her back. You stroke her cock until she cums; " + _cellCumHer.toLowerCase() + " The day-room television covers every sound she makes."
].random()>>
<<else>>
<<set $cellMsg = [
"He turns to the wall and reaches back. You push your " + _cellTool + " into his ass and stroke his cock while you fuck him until he cums against the sheet. " + _cellCumHim + " You keep one hand over his mouth until the footsteps pass.",
"You get him face down on the thin mattress and fuck his ass with your " + _cellTool + " until he cums biting the blanket. " + _cellCumHim + " He keeps your arm around him while someone passes the cell.",
"He braces against the wall and you push your " + _cellTool + " into his ass, chest to his back. You stroke his cock until he cums; " + _cellCumHim.toLowerCase() + " The day-room television covers every sound he makes."
].random()>>
<</if>>
<<goto "Prison_Cell">>
<</button>></div>
<div class="btn"><<button _recvLbl>>
<<set $prison.cellNightToday = true>>
<<SpendTime 30>>
<<set _e3 = getInmate($prisonRoster, $prison.cellmateId)>>
<<set _domG = _e3.gender>>
<<set _subG = $player.gender()>>
<<SetAnalPick _domG _subG>>
<<set $cellVideo = _pick>>
<<if _e3.gender is "Female">>
<<set $cellMsg = [
"You turn to the wall and let her lead. She fingers your ass open, cinches a prison-made harness on and works it into you under the blanket until you cum biting the sheet. Without pulling out, she rolls the base against her cunt until she cums, then both of you listen for footsteps.",
"She bends you over the bunk, pushes a prison-made strap into your ass, and fucks you while one hand works between your legs. You cum first; she keeps thrusting until she cums against the harness.",
"You climb into her side of the bunk and let her lead. She works two fingers into your ass, straps on, and fucks you slowly until you cum. She grinds her cunt to orgasm against the harness while the tier carries on outside."
].random()>>
<<elseif _e3.gender is "Shemale">>
<<set $cellMsg = [
"You turn your back to her and she pushes her cock into your ass, one hand working between your legs while you move back against her. You cum against her hand; she cums inside you, then steals your pillow.",
"She bends you over the bunk and fucks your ass while the television covers the noise. You cum gripping the frame; she cums in you and stays buried until footsteps cross the gallery.",
"You turn to the wall and let her lead. She fingers your ass, pushes her cock in, and fucks you slowly until both of you cum before the half hour ends."
].random()>>
<<else>>
<<set $cellMsg = [
"You turn your back to him and he pushes his cock into your ass, one hand working between your legs while you move back against him. You cum against his hand; he cums inside you, then both of you freeze when the bunk knocks the wall.",
"He bends you over the bunk and fucks your ass while the television covers the noise. When he cums in you, he stays buried with his forehead against your back until footsteps cross the gallery.",
"You turn to the wall and let him lead. He works two fingers into your ass, pushes his cock in, and fucks you slowly until both of you cum before the half hour ends."
].random()>>
<</if>>
<<goto "Prison_Cell">>
<</button>></div>
<<elseif _cm.stats.trust gte 50 and CheckContentFilter(_cm.gender, $player)>>
<div class="prison-actnote">You have already taken private time with <<= _cm.name>> today. The bunk will still be here after the next sleep.</div>
<</if>>
<div class="btn"><<button _dealLbl>><<set $activeInmateId = $prison.cellmateId>><<set $prison.sceneAuthority = { scene: "inmate", stintDay: getPrisonStintDay(), targetId: $prison.cellmateId, block: "Prison_Cell" }>><<goto "Prison_Inmate">><</button>></div>
<<if not $prison.soloToday>>
<div class="btn"><<button "Masturbate in your bunk">><<set $prison.sceneAuthority = { scene: "solo", stintDay: getPrisonStintDay() }>><<goto "Prison_Solo">><</button>></div>
<</if>>
<div class="btn"><<button "Back to the block" "Prison_Block">><</button>></div>
</div>
<</if>>
<</nobr>>
<</if>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<set _soloVisit = ($prison and $prison.inside) ? getActiveCrossBlockVisit($prison, { day: getCurrentAbsoluteDay(), hour: $dateTime.hours, minute: $dateTime.minutes }) : null>>
<<set _soloAuthority = ($prison and $prison.sceneAuthority and $prison.sceneAuthority.scene is "solo" and $prison.sceneAuthority.stintDay is getPrisonStintDay())>>
<<if not $prison or not $prison.inside or $prison.inPC or _soloVisit or $prison.soloToday or not _soloAuthority>>
<<if $prison>><<set $prison.sceneAuthority = null>><</if>>
<<if not $prison or not $prison.inside>><<goto "PoliceStation">><<elseif $prison.inPC>><<goto "Prison_Segregation">><<elseif _soloVisit>><<goto "Prison_OtherBlock">><<else>><<goto "Prison_Cell">><</if>>
<<else>>
<<set $prison.sceneAuthority = null>>
<<if $prison.block is "F">>
<<SetBackground "Media/Locations/Prison/cell_f.jpg">>
<<else>>
<<SetBackground "Media/Locations/Prison/cell_m.jpg">>
<</if>>
<<set $prison.soloToday = true>>
<<SpendTime 20>>
<<run $player.status.energy.increase(8)>>
<<if random(1, 100) lte 40>><<SetCharProgression $player "corruption" 1 true>><</if>>
<<set _cm2 = getCastInmate('cellmate')>>
<<set _mine = prisonFilterCompatible(claimedByPlayer($prisonRoster), $player)>>
<<set _who = "">>
/* Who the mind reaches for while the cell is briefly quiet - the ones who are yours, the
one keeping you, or nothing and nobody but the pressure of the place. */
<<if _mine.length > 0>>
<<set _t = _mine.random()>>
<<set _who = "You think about " + _t.name + " - the way " + ((_t.gender isnot "Male") ? "she folds" : "he folds") + " when you crook a finger, then waits for permission to straighten. ">>
<<elseif $prison.protected and getCastInmate('wolf') and CheckContentFilter(getCastInmate('wolf').gender, $player)>>
<<set _prot2 = getCastInmate('wolf')>>
<<set _who = "You think about " + _prot2.name + ", the weight of " + ((_prot2.gender isnot "Male") ? "her" : "him") + " over you, and hate how quickly the thought gets you ready. ">>
<<else>>
<<set _who = ["You picture a warm body and a bed that was not bolted to concrete. The face never settles. ", "Somebody from before the wall comes back to you: a mouth, a pair of hands, clean sheets. You let the memory stay. ", "There is a face on the tier you avoid staring at. With the blanket pulled up and the cell briefly quiet, you picture it clearly. "].random()>>
<</if>>
<<if $player.gender() is "Female">>
<<set _act = ["Under the thin blanket, you rub your clit in slow circles and keep the bunk from squeaking. You cum with your teeth in your wrist, then wipe your fingers on the sheet before the twenty minutes are gone.", "You slide two fingers into your cunt while the flat of your palm works your clit. You cum into the pillow with your hips lifted, then lie still until the footsteps pass.", "You get your fingers slick and work them into your cunt while your thumb circles your clit. You cum hard under the blanket, clean your hand at the sink, and pull your blues straight."].random()>>
<<set _soloVideo = GetJerkOffCumPick("Female", random(0, 2))>>
<<elseif $player.gender() is "Shemale">>
<<set _act = ["Under the thin blanket, you work your cock slowly while your other hand teases your softened body. You cum into your fist, clean yourself at the sink, and pull your blues straight before count.", "You spit into your palm, stroke your cock, and pinch a sensitive nipple until the pressure breaks. You catch the cum in your hand and lie still while boots pass the cell."].random()>>
<<set _soloVideo = GetJerkOffCumPick("Shemale", random(0, 2))>>
<<else>>
<<set _act = ["Under the thin blanket, you work your cock slowly so the bunk does not creak. You cum into your fist with your breath held, wipe it on the sheet, and pull your blues straight before the twenty minutes are gone.", "You spit into your fist and stroke your cock while the pipes tick and the television covers the noise. You cum into your palm, wash at the sink, and sit back on the bunk before anyone looks in.", "You work your cock in your fist with the blanket tented over your lap. When you cum, you catch it in your palm and lie still until the footsteps outside move on."].random()>>
<<set _soloVideo = GetJerkOffCumPick("Male", random(0, 2))>>
<</if>>
<div class="centre-text">Twenty Minutes Alone</div>
<<if _soloVideo>><<Video _soloVideo>><</if>>
<<if _cm2 and random(1, 100) lte 30>>
<<if _cm2.gender isnot "Male">>
<<set _seen = " Across the cell, " + _cm2.name + " turns her face to the wall and keeps it there until you clean your hand and dress.">>
<<else>>
<<set _seen = " Across the cell, " + _cm2.name + " turns his face to the wall and keeps it there until you clean your hand and dress.">>
<</if>>
<<else>>
<<set _seen = "">>
<</if>>
<div class="chat-container prison-prose"><p class="text"><<= _who + _act + _seen>></p></div>
<div class="btn-container">
<div class="btn"><<button "Clean up and leave the bunk" "Prison_Cell">><</button>></div>
</div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<set _gangVisit = ($prison and $prison.inside) ? getActiveCrossBlockVisit($prison, { day: getCurrentAbsoluteDay(), hour: $dateTime.hours, minute: $dateTime.minutes }) : null>>
<<set _gangAuthority = ($prison and $prison.sceneAuthority and $prison.sceneAuthority.scene is "gangJob" and $prison.sceneAuthority.stintDay is getPrisonStintDay())>>
<<if not $prison or not $prison.inside or $prison.inPC or _gangVisit>>
<<if $prison>><<set $prison.sceneAuthority = null>><</if>>
<<if not $prison or not $prison.inside>><<goto "PoliceStation">><<elseif $prison.inPC>><<goto "Prison_Segregation">><<else>><<goto "Prison_OtherBlock">><</if>>
<<else>>
<<if $prison.block is "F">>
<<SetBackground "Media/Locations/Prison/block_f_dayroom.jpg">>
<<else>>
<<SetBackground "Media/Locations/Prison/block_m_dayroom.jpg">>
<</if>>
<<set _car = gangLabel($prison.gang)>>
<div class="centre-text">The Car's Business</div>
<<if $gangJobMsg and $gangJobMsg isnot "">>
<<PrisonProse $gangJobMsg>>
<<set $gangJobMsg = "">>
<div class="btn padding-top"><<button "Back to the block" "Prison_Block">><</button>></div>
<<elseif not $prison.gang or $prison.gangJobDone or not _gangAuthority>>
<<set $prison.sceneAuthority = null>>
<<goto "Prison_Block">>
<<else>>
<div class="chat-container prison-prose"><p class="text">Word comes down the tier: <<= _car>> is moving contraband, collecting a debt, and putting steel into someone who crossed the car. You have enough standing to choose your part.</p></div>
<div class="btn-container">
<div class="btn"><<button "Move a package past the COs (stealth)">>
<<set $prison.sceneAuthority = null>>
<<set $prison.gangJobDone = true>>
<<set _sk = $player.attributes.dexterity.value>>
<<if random(1, 100) lte (35 + _sk * 6)>>
<<set $prison.scrip = ($prison.scrip || 0) + random(8, 16)>>
<<set $prison.rep = Math.min(100, ($prison.rep || 0) + 4)>>
<<set $gangJobMsg = "You carry the taped contraband through two checkpoints without drawing a second look and place it in the receiver's hands. The car eats well tonight, and you get both your cut and public credit for the delivery.">>
<<else>>
<<set $prison.heat = Math.min(100, ($prison.heat || 0) + 12)>>
<<run extendSentence(2)>>
<<set $gangJobMsg = "A CO sees the contraband change hands, seizes the package, and writes the possession charge under your number. You protect the car by taking the charge yourself, earning standing and two more days on your bid.">>
<</if>>
<<goto "Prison_GangJob">>
<</button>></div>
<div class="btn"><<button "Collect a debt the hard way (strength)">>
<<set $prison.sceneAuthority = null>>
<<set $prison.gangJobDone = true>>
<<set _st = $player.attributes.strength.value>>
<<if random(1, 100) lte (30 + _st * 6)>>
<<set $prison.scrip = ($prison.scrip || 0) + random(6, 14)>>
<<set $prison.rep = Math.min(100, ($prison.rep || 0) + 6)>>
<<if $prison.block is "F">>
<<set $gangJobMsg = "You corner the woman behind on her rent, punch her to the floor, and keep hitting until she gives up the hidden scrip. You deliver the payment, and the car raises your standing for collecting it.">>
<<else>>
<<set $gangJobMsg = "You corner the man behind on his rent, punch him to the floor, and keep hitting until he gives up the hidden scrip. You deliver the payment, and the car raises your standing for collecting it.">>
<</if>>
<<else>>
<<set $prison.heat = Math.min(100, ($prison.heat || 0) + 8)>>
<<set $prison.rep = Math.max(0, ($prison.rep || 0) - 4)>>
<<set $gangJobMsg = "The mark is harder than their debt and has friends closer than yours. You come away with nothing but a split lip and a story the block will tell wrong.">>
<</if>>
<<goto "Prison_GangJob">>
<</button>></div>
<div class="btn"><<button "Stand point during a shanking (nerve)">>
<<set $prison.sceneAuthority = null>>
<<set $prison.gangJobDone = true>>
<<if random(1, 100) lte 55>>
<<set $prison.rep = Math.min(100, ($prison.rep || 0) + 8)>>
<<set $prison.scrip = ($prison.scrip || 0) + random(4, 10)>>
<<set $gangJobMsg = "You hold the corner while two soldiers drag a debtor into the blind and shank them twice. You warn them before a CO turns onto the tier, and all three of you clear the corridor before the blood is found. The car pays you and remembers who protected the work.">>
<<goto "Prison_GangJob">>
<<else>>
<<set $prison.heat = Math.min(100, ($prison.heat || 0) + 15)>>
<<set $prison.sceneAuthority = { scene: "solitary", stintDay: getPrisonStintDay() }>>
<<goto "Prison_Solitary">>
<</if>>
<</button>></div>
<div class="btn"><<button "Tell them not today">><<set $prison.sceneAuthority = null>><<goto "Prison_Block">><</button>></div>
</div>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<PrisonPendingMediaGuard "carMsg" "carVideo">>
<<SaveLocation>>
<<if not $prison.gang>>
<<goto "Prison_Block">>
<<else>>
<<if $prison.block is "F">>
<<SetBackground "Media/Locations/Prison/cell_f.jpg">>
<<else>>
<<SetBackground "Media/Locations/Prison/cell_m.jpg">>
<</if>>
<<set _car = gangLabel($prison.gang)>>
<div class="centre-text">The Car's Back Cell</div>
<div class="centre-text" style="font-size:14px;">The car uses this camera blind for sex. With enough standing, you can fuck one of its claimed inmates. Without it, the car can collect sexual dues by fucking you.</div>
<<if $carMsg and $carMsg isnot "">>
<<PrisonMediaProse $carMsg $carVideo>>
<<if $carVideo and $carVideo isnot "">><<Video $carVideo>><<set $carVideo = "">><</if>>
<<set $carMsg = "">>
<</if>>
<<set _carPunkG = ($prison.block is "F") ? "Female" : (random(1, 100) lte 25 ? "Shemale" : "Male")>>
<fieldset>
<legend>Behind the Cell Door</legend>
<div class="btn-container">
<<if $gameSettings.contentFilter.nonConsent === true and ($prison.rep || 0) gte 45 and not $prison.carFleshToday and CheckContentFilter(_carPunkG, $player) and not prisonPlayerActiveSexBlocked($player, $playerlock)>>
<<capture _carPunkG>>
<div class="btn"><<button "Fuck one of the car's claimed punks">>
<<if prisonPlayerActiveSexBlocked($player, $playerlock)>>
<<set $carMsg = "The cage locks your penis down before the cell door closes. You can let the car use you instead or walk away.">>
<<goto "Prison_CarFlesh">>
<<else>>
<<set $prison.carFleshToday = true>>
<<run unlockPrisonAchievement('carString')>>
<<SpendTime 25>>
<<SetCharProgression $player "dominance" 2 true>>
<<set _cpg = _carPunkG>>
<<SetAnalPick $player.gender() _cpg>>
<<set $carVideo = _pick>>
<<set _carTool = ($player.gender() is "Female") ? "the prison-made strap" : "your cock">>
<<set _carCumHer = ($player.gender() is "Female") ? "You keep the strap deep in her ass and drag the base over your cunt. Your legs buckle when you cum." : "You cum in her ass, then pull out before the lookout knocks.">>
<<set _carCumHim = ($player.gender() is "Female") ? "You keep the strap deep in his ass and drag the base over your cunt. Your legs buckle when you cum." : "You cum in his ass, then pull out before the lookout knocks.">>
<<if _cpg is "Female">>
<<set $carMsg = "The car walks one of its women into the back cell and posts a lookout. She kneels without being told, then bends over the bunk when you point. You work her ass open, push " + _carTool + " into her, and fuck her against the mattress. " + _carCumHer + " You clean up on her shirt and send her back out before your twenty-five minutes are up.">>
<<elseif _cpg is "Shemale">>
<<set $carMsg = "The car sends one of its punks into the back cell and posts a lookout. She bends over the bunk as soon as the door closes. You push " + _carTool + " into her ass and work her over the bunk with her own cock left hard against the sheet. " + _carCumHer + " You clean up and send her out before your twenty-five minutes are up.">>
<<else>>
<<set $carMsg = "The car sends one of its punks into the back cell and posts a lookout. He bends over the bunk as soon as the door closes. You push " + _carTool + " into his ass and fuck him against the thin mattress. " + _carCumHim + " You clean up on the sheet and send him out before your twenty-five minutes are up.">>
<</if>>
<<goto "Prison_CarFlesh">>
<</if>>
<</button>></div>
<</capture>>
<</if>>
<<if $gameSettings.contentFilter.nonConsent === true and ($prison.rep || 0) gte 45 and not $prison.carFleshToday and CheckContentFilter(_carPunkG, $player) and prisonPlayerActiveSexBlocked($player, $playerlock)>>
<div class="centre-text" style="font-size:13px;">Your locked cock rules out fucking the car's punk. Let the car fuck you instead, or leave the cell.</div>
<</if>>
<<if $gameSettings.contentFilter.nonConsent === true and $gameSettings.contentFilter.PlayerFeminization == true and not $prison.shotCaller and not $prison.carFleshToday and CheckContentFilter((($prison.block is "F") ? "Female" : "Male"), $player)>>
<div class="btn"><<button "Let the car fuck you for its dues">>
<<set $prison.carFleshToday = true>>
<<SpendTime 25>>
<<set _pgBefore = $player.gender()>>
<<set _cg = ($prison.block is "F") ? "Female" : "Male">>
<<SetAnalPick _cg _pgBefore>>
<<set $carVideo = _pick>>
<<PrisonCoerceBody>>
<<set _cut = random(3, 7)>>
<<set $prison.scrip = ($prison.scrip || 0) + _cut>>
<<set $prison.rep = Math.max(0, ($prison.rep || 0) - 4)>>
<<if $prison.block is "F">>
<<set $carMsg = "The car calls in your dues and walks you into the back cell. The set does this one at a time: the door shuts, one woman has you to herself, and the rest wait their turn out on the tier where the lookout can see them. Each one washes at the basin when she is done, knocks twice, and the next comes in to a closed door. When twenty-five minutes are up you will walk out with " + _cut + " scrip and the car's protection.\n\nThe woman in with you now eats your cunt until you cum, then straps on and rides your ass until the harness makes her cum.">>
<<else>>
<<set $carMsg = "The car calls in your dues and walks you into the back cell. The set does this one at a time: the door shuts, one man has you to himself, and the rest wait their turn out on the tier where the lookout can see them. Each one pulls his blues up when he is done, knocks twice, and sends in the next. When twenty-five minutes are up you will walk out with " + _cut + " scrip and the car's protection.\n\nThe man in with you now bends you over the bunk, works his cock into your ass and rides you until he cums, without hurrying about it.">>
<</if>>
<<goto "Prison_CarFlesh">>
<</button>></div>
<</if>>
<<if $gameSettings.contentFilter.nonConsent === true and ($prison.rep || 0) lt 45 and CheckContentFilter(_carPunkG, $player)>>
<div class="centre-text" style="font-size:13px;">You do not have the standing yet to get a turn at what the car keeps. Make your bones first.</div>
<</if>>
<<if $prison.carFleshToday>>
<div class="centre-text" style="font-size:13px;">The car has already used the back cell with you today. It will not risk the same lookout twice in one shift.</div>
<</if>>
<div class="btn"><<button "Back to the block" "Prison_Block">><</button>></div>
</div>
</fieldset>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<if $prison.block is "F">>
<<SetBackground "Media/Locations/Prison/cell_f.jpg">>
<<else>>
<<SetBackground "Media/Locations/Prison/cell_m.jpg">>
<</if>>
<<set _prot = getCastInmate('wolf')>>
<div class="centre-text">The Wolf</div>
<<if _prot>>
<div class="centre-text" style="font-size:14px;"><<= _prot.name>> watches the tier from the wall.</div>
<<if $prison.protected>>
<div class="chat-container prison-prose"><p class="text"><<= _prot.name>> has already put a name over you. Protection is never settled in one conversation; the next favor will come when the wolf is ready to collect.</p></div>
<<else>>
<div class="chat-container prison-prose"><p class="text">You catch <<= _prot.name>> looking your way, but no offer follows. Wolves choose the hour and the price. For now, this one only watches.</p></div>
<</if>>
<div class="btn-container">
<<set _hasWolfQuest = false>>
<<for _wolfQuestId range ['pq_yard_bones','pq_yard_wolf','pq_side_wolfdebt','pq_side_iron','pq_fem_kept','pq_fem_making','pq_fem_player_after','pq_fem_making_full','pq_fem_making_after']>>
<<if prisonQuestState(_wolfQuestId) is "active">>
<<set _hasWolfQuest = true>>
<<set _wolfQuestDef = getPrisonQuestDef(_wolfQuestId)>>
<<set _wolfQuestLabel = "Continue: " + _wolfQuestDef.title>>
<div class="btn"><<button _wolfQuestLabel>><<set $activeQuestId = _wolfQuestId>><<goto "Prison_Quest">><</button>></div>
<</if>>
<</for>>
<<if not _hasWolfQuest>>
<div class="prison-actnote">The wolf has no work for you today.</div>
<</if>>
</div>
<<else>>
<div class="chat-container prison-prose"><p class="text">No one on this tier carries enough weight to make that kind of offer.</p></div>
<</if>>
<div class="btn padding-top"><<button "Back to the block" "Prison_Block">><</button>></div>
<</nobr>>
/* Legacy freeform protector interactions are intentionally unreachable. */
<<if false>>
<<nobr>>
<<include "UpdateAll">>
<<PrisonPendingMediaGuard "protectMsg" "protectVideo">>
<<SaveLocation>>
<<if $prison.block is "F">>
<<SetBackground "Media/Locations/Prison/cell_f.jpg">>
<<else>>
<<SetBackground "Media/Locations/Prison/cell_m.jpg">>
<</if>>
<<set _prot = getInmate($prisonRoster, $prison.protectorId)>>
<div class="centre-text">Under a Wing</div>
<<if $protectMsg and $protectMsg isnot "">>
<<PrisonMediaProse $protectMsg $protectVideo>>
<<if $protectVideo and $protectVideo isnot "">><<Video $protectVideo>><<set $protectVideo = "">><</if>>
<<set $protectMsg = "">>
<</if>>
<<if $prison.protected and _prot>>
<<set _pHim = (_prot.gender isnot "Male") ? "her" : "him">>
<div class="centre-text" style="font-size:14px;"><<= _prot.name>> keeps the tier off you. Nobody moves on you while you belong to <<= _pHim>>.</div>
<<set _serveLbl = "Let " + _prot.name + " fuck you for today's protection">>
<div class="btn-container">
<<if CheckContentFilter(_prot.gender, $player) and not $prison.servedProtectorToday>>
<div class="btn"><<button _serveLbl>>
<<set $prison.servedProtectorToday = true>>
<<SpendTime 30>>
<<set _e = getInmate($prisonRoster, $prison.protectorId)>>
<<set _domG = _e.gender>>
<<set _subG = $player.gender()>>
<<SetAnalPick _domG _subG>>
<<set $protectVideo = _pick>>
<<if _e.gender is "Shemale">>
<<set $protectMsg = [
"You go when she sends for you. She sucks your cock until you cum, then bends you over the bunk and fucks your ass with her cock until she cums in you. Afterward she slides you three packs and sends you back to the tier under her protection.",
"She crooks a finger and you cross the cell. You take her cock on your knees, then she bends you over the sink and takes your ass hard enough to rattle the pipe before she cums in you. She leaves three packs beside the soap. At the door, the men waiting for the basin step aside.",
"She has you on your back with your knees up before she says two words, strokes your cock while she works her own into your ass, and fucks you until you cum over your stomach. She keeps thrusting until she cums in you, then gives you thirty minutes to get off her bunk.",
"She puts you on your knees first, cums in your mouth, then turns you face down on the thin mattress and fucks your ass with one hand on your cock until you cum against the sheet and she cums in you while the tier pretends not to hear."
].random()>>
<<elseif _e.gender isnot "Male">>
<<if $player.gender() is "Female">>
<<set $protectMsg = [
"You go when she sends for you. She licks your cunt until you cum, fingers your ass open, and strap-fucks you while dragging the base hard over her clit. She cums without slowing down. Afterward she slides you three packs and sends you back to the tier under her protection.",
"She crooks a finger and you cross the cell. You spread for her on the thin mattress while she fingers your ass, licks your cunt until you cum, then straps up and fucks you. Near the end she leans into each stroke until the harness rubs her to orgasm. She drops three packs on the toilet lid and opens the door.",
"She has you on your back with your knees up before she says two words, fingers your ass, then fucks you with the strap until you cum gripping the bunk frame. She angles the base against herself and keeps thrusting until she cums, then pats your cheek and gives you thirty minutes to get off her bunk.",
"You kneel between her thighs and stay there with your tongue in her until she grinds herself off on your face, then bend over for the strap. She rides you until the strap wrings an orgasm out of you onto the mattress while the tier pretends not to hear. When she sends you out, nobody in the gallery meets your eye or reaches for you."
].random()>>
<<else>>
<<set $protectMsg = [
"You go when she sends for you. She sucks your cock until you cum, fingers your ass open, then strap-fucks you. She pulls the harness tight and grinds down until the buckles do the rest and she cums with her nails in your hip. Afterward she slides you three packs and sends you back to the tier under her protection.",
"She crooks a finger and you cross the cell. You spread for her on the thin mattress while she strokes your cock, fingers your ass, then straps up and fucks you until you cum over the sheet. She keeps the strap in you and works the leather against herself until her legs shake. The three packs are already waiting by the sink.",
"She has you on your back with your knees up before she says two words, fingers your ass, and rides the strap into you while stroking your cock. You cum gripping the bunk frame; she keeps thrusting until her cunt spasms against the harness, then gives you thirty minutes to get off her bunk.",
"You kneel between her thighs and suck her clit until she shakes and cums, then bend over for the strap. She fucks your ass with one hand on your cock until you cum across the mattress while the tier pretends not to hear."
].random()>>
<</if>>
<<else>>
<<set $protectMsg = [
"He sends for you often. On his bunk you let him fuck your ass until he cums. Afterward he slides you a few packs and tells his people to leave you alone. You hide the payment under your mattress.",
"He crooks a finger and you come. You take his cock on your knees before he bends you over the sink and works your ass until he cums in it. He leaves three packs beside the soap. At the door, the men waiting for the basin step aside.",
"He bends you over the bunk without a word and takes his time, one heavy hand between your shoulder blades, and you brace and take every inch because taking it is the rent on being untouchable everywhere else. When he cums in you he grunts something that is almost thanks, and you are safe for another night.",
"He puts you on your knees first, cums in your mouth, then turns you face down on the thin mattress, pushes back into your ass and cums in you a second time while the tier pretends not to hear. You have stopped fighting the sounds you make. This is the shape of the deal - his cock and his protection, your body and your safety - and you have both quit calling it anything else."
].random()>>
<</if>>
<<goto "Prison_Protection">>
<</button>></div>
<<elseif CheckContentFilter(_prot.gender, $player)>>
<div class="prison-actnote">You have paid the price of <<= _prot.name>>'s wall today. <<= (_prot.gender isnot "Male") ? "She" : "He">> will send for you again soon enough - the arrangement never goes hungry for long.</div>
<</if>>
<<if $gameSettings.contentFilter.nonConsent === true and $gameSettings.contentFilter.PlayerFeminization == true and not $prison.sharedToday and CheckContentFilter(_prot.gender, $player)>>
<<set _shareLbl = "Let " + _prot.name + " send you her people one at a time">>
<<if _prot.gender is "Male">><<set _shareLbl = "Let " + _prot.name + " send you his people one at a time">><</if>>
<div class="btn"><<button _shareLbl>>
<<set $prison.sharedToday = true>>
<<SpendTime 60>>
<<set _e = getInmate($prisonRoster, $prison.protectorId)>>
<<set _domG = _e.gender>>
<<set _subG = $player.gender()>>
<<SetAnalPick _domG _subG>>
<<set $protectVideo = _pick>>
<<PrisonCoerceBody>>
/* The clip is the protector alone with the player, so the last bubble is the protector's turn. */
<<set _cut = random(4, 8)>>
<<set $prison.scrip = ($prison.scrip || 0) + _cut>>
<<set $prison.rep = Math.max(0, ($prison.rep || 0) - 3)>>
<<if _e.gender is "Shemale">>
<<set $protectMsg = "She sends her people to the cell one at a time and keeps the rest waiting on the tier. Each one shuts the door, bends you over the sink, fucks your ass and cums inside, then washes at the basin and goes back out to send the next. It takes an hour to get through them that way, and every one of them has you alone.\n\nThen " + _e.name + " comes in last and shuts the door herself. She bends you over the bunk, works her cock into your ass and fucks you slow until she cums deep in you. She tosses you " + _cut + " scrip and points to the coffee waiting on her shelf.">>
<<elseif _e.gender isnot "Male">>
<<set $protectMsg = "She sends her women to the cell one at a time and keeps the rest waiting on the tier. Each one shuts the door, fingers your cunt and eats you until you cum, then straps on and takes your ass until she shudders and cums with the buckles biting her. She rinses the strap, hands it to nobody, and goes out to send the next one in to a closed door.\n\nThen " + _e.name + " comes in last and pulls the door to. She straps on, bends you over the bunk and rides your ass with the strap until the base grinds her into an orgasm, and you cum for her before she lets you up. She slides you " + _cut + " scrip and tells the lookout to walk you back.">>
<<else>>
<<set $protectMsg = "He sends his people to the cell one at a time and keeps the rest waiting on the tier. Each one shuts the door, pins you over the sink, rides your ass and cums in it, then washes at the basin and goes back out to send the next. It takes an hour to get through them that way, and every one of them has you alone.\n\nThen " + _e.name + " comes in last and shuts the door himself. He bends you over the bunk, shoves his cock into your ass and fucks you hard until he cums deep in you. He tosses you " + _cut + " scrip and tells you to wipe the rim.">>
<</if>>
<<goto "Prison_Protection">>
<</button>></div>
<</if>>
<div class="btn"><<button "Back to the block" "Prison_Block">><</button>></div>
</div>
<<else>>
<<set _wolf = strongestInmate($prisonRoster)>>
<<if not _wolf>>
<div class="chat-container prison-prose"><p class="text">There is nobody on this block worth the trade tonight. You are on your own in the dark for now.</p></div>
<div class="btn padding-top"><<button "Back to the block" "Prison_Block">><</button>></div>
<<else>>
<div class="chat-container prison-prose"><p class="text"><<= _wolf.name>> runs this tier, and everyone who is not a mark is under somebody. You can keep taking your chances alone when the lights go out, or offer <<= _wolf.name>> sex in exchange for protection.</p></div>
<<set _offerLbl = "Offer " + _wolf.name + " sex in exchange for protection">>
<div class="btn-container">
<<if CheckContentFilter(_wolf.gender, $player)>>
<div class="btn"><<button _offerLbl>>
<<set $prison.protected = true>>
<<set $prison.protectorId = _wolf.id>>
<<SpendTime 30>>
<<set _e = getInmate($prisonRoster, _wolf.id)>>
<<set _domG = _e.gender>>
<<set _subG = $player.gender()>>
<<SetAnalPick _domG _subG>>
<<set $protectVideo = _pick>>
<<if _e.gender is "Shemale">>
<<set $protectMsg = "You walk to her bunk and offer your body for protection. She looks you over, bends you across the mattress and feeds her cock into your ass, then takes you with the cell door open. Your body gives you an orgasm against the frame; she holds you down and cums in you. When she sends you onto the tier, the men at the rail lower their eyes.">>
<<elseif _e.gender isnot "Male">>
<<if $player.gender() is "Female">>
<<set $protectMsg = "You walk to her bunk and make the offer with your body before your mouth catches up. She fingers your ass, licks your cunt until you cum, then fucks you with the strap she keeps under the mattress. She presses the base against her clit and cums with the strap still in you. At the open door, two women waiting for the sink step back and let you pass.">>
<<else>>
<<set $protectMsg = "You walk to her bunk and make the offer with your body before your mouth catches up. She fingers your ass, sucks your cock until you cum, then fucks you with the strap she keeps under the mattress. She pulls the harness tight and rocks herself to orgasm without pulling out. At the open door, two men waiting for the sink step back and let you pass.">>
<</if>>
<<else>>
<<set $protectMsg = "You walk to his bunk and offer your body for protection. He bends you over, splits you open on his cock and rides you with the cell door standing wide. Your body gives you an orgasm against the frame; he holds you down and cums in you. When he sends you onto the tier, the men at the rail lower their eyes.">>
<</if>>
<<goto "Prison_Protection">>
<</button>></div>
<</if>>
<div class="btn"><<button "Think better of it" "Prison_Block">><</button>></div>
</div>
<</if>>
<</if>>
<</nobr>>
<</if>><<nobr>>
<<include "UpdateAll">>
<<PrisonRegimeGuard "yard" "The yard" "13:00-16:00" "yardMsg" "yardVideo" "yardContent">>
<<if prisonRegimeOpen("yard", $dateTime.hours, getPrisonStintDay())>>
<<SaveLocation>>
<<SetBackground "Media/Locations/Prison/yard.jpg">>
<div class="centre-text">The Yard</div>
<div class="centre-text" style="font-size:14px;">Weights clang, dice bounce, and eyes track everyone who walks the fence line.</div>
<fieldset>
<legend>Yard</legend>
<div class="btn-container">
<div class="btn"><<button "Hit the weights" "Prison_Weights">><</button>></div>
<div class="btn"><<button "Find the dice circle" "Prison_Dice">><</button>></div>
<div class="btn"><<button "Drift to the dead angle behind the pile">><<set $prison.sceneAuthority = { scene: "yardBlind", stintDay: getPrisonStintDay(), block: $prison.block }>><<goto "Prison_YardBlind">><</button>></div>
</div>
</fieldset>
<<PrisonNav>>
<<PrisonPeople>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<PrisonRegimeGuard "yard" "Behind the pile" "13:00-16:00" "yardMsg" "yardVideo" "yardContent">>
<<if prisonRegimeOpen("yard", $dateTime.hours, getPrisonStintDay())>>
<<SetBackground "Media/Locations/Prison/yard.jpg">>
<<set _yg = ($prison.block is "F") ? "Female" : "Male">>
<<set _yardAuthority = ($prison and $prison.sceneAuthority and $prison.sceneAuthority.scene is "yardBlind" and $prison.sceneAuthority.stintDay is getPrisonStintDay() and $prison.sceneAuthority.block is $prison.block)>>
<div class="centre-text">Behind the Pile</div>
<div class="centre-text" style="font-size:14px;">There is a wedge of ground between the weight rack and the equipment shed that neither the gun tower nor the roving CO can see. Inmates use the blind to trade contraband, beat debtors, and fuck while the iron covers the noise.</div>
<<if $yardMsg and $yardMsg isnot "">>
<<PrisonMediaProse $yardMsg $yardVideo>>
<<if $yardVideo and $yardVideo isnot "">><<Video $yardVideo>><<set $yardVideo = "">><</if>>
<<set $yardMsg = "">>
<<set $yardVideo = "">>
<<set $yardContent = null>>
<div class="btn padding-top"><<button "Back to the yard" "Prison_Yard">><</button>></div>
<<elseif not _yardAuthority>>
<<if $prison>><<set $prison.sceneAuthority = null>><</if>>
<<goto "Prison_Yard">>
<<else>>
<<set $prison.sceneAuthority = null>>
<fieldset>
<legend>The Dead Angle</legend>
<div class="btn-container">
<<if $gameSettings.contentFilter.nonConsent === true and CheckContentFilter(_yg, _yg) and not $prison.voyeurToday>>
<div class="btn"><<button "Watch inmates fuck in the yard blind">>
<<set $prison.voyeurToday = true>>
<<SpendTime 15>>
<<SetCharProgression $player "corruption" 1 true>>
<<if random(1, 100) lte 55>>
<<set _yg2 = ($prison.block is "F") ? "Female" : "Male">>
<<if $prison.block is "F">><<SetVagPick _yg2 "Female">><<else>><<SetAnalPick _yg2 _yg2>><</if>>
<<set $yardVideo = _pick>>
<<set $yardContent = { adult: true, observed: true, actorGender: _yg2, partnerGender: _yg2, nonConsent: true }>>
<<if $prison.block is "F">>
<<set $yardMsg = ["A slab of muscle off the far tier has a smaller woman bent over the bench press behind the shed, fucking her cunt with a prison-made strap while two lookouts hold the corner. The smaller woman cums against the padding. Still thrusting, the woman on top pulls the harness tight over her clit and works herself to orgasm. Everyone hitting the pile keeps counting reps. You watch from the rack until the whistle.", "Two women use the dead angle behind the shed. The receiving woman braces on the wall while her partner buckles on a prison-made strap, pushes it into her cunt, and fucks her hard. The woman at the wall cums around the rubber cock; her partner angles the base between her legs and rides it to her own orgasm. The clang of the iron covers both cries. You miss your next set watching."].random()>>
<<else>>
<<set $yardMsg = ["A big man off the far tier has one of the tier's punks bent over the bench press behind the shed, fucking the punk's ass while two lookouts hold the corner. The big man cums inside the punk and wipes his cock on the punk's blues. Everyone on the pile keeps their reps and their eyes down. You watch from the rack until the count clears.", "A wolf uses the dead angle the way half the yard does, fucking an inmate braced on the shed wall until the wolf cums inside the inmate while the clang of the iron covers every sound. The gun tower sees a man lifting. You see the rest of it."].random()>>
<</if>>
<<else>>
<<set $yardVideo = "">>
<<set $yardContent = null>>
<<set $yardMsg = ["Nobody is having sex in the yard blind this hour. You knock out a set among the chalk dust and grunting iron, then drift back to the rack.", "The dead angle is empty but for a lone con doing pull-ups on the shed frame. You linger, but the yard is all business today. You move off."].random()>>
<</if>>
<<goto "Prison_YardBlind">>
<</button>></div>
<</if>>
<<if CheckContentFilter(_yg, $player) and not $prison.anonSceneToday>>
<<set _yardSpotterLabel = prisonPlayerActiveSexBlocked($player, $playerlock) ? "Let your spotter fuck you in the blind" : "Fuck your spotter in the blind">>
<div class="btn"><<button _yardSpotterLabel>>
<<set $prison.anonSceneToday = true>>
<<SpendTime 20>>
<<SetCharProgression $player "corruption" 1 true>>
<<SetCharProgression $player "strength" 2 true>>
<<set $prison.heat = Math.min(100, ($prison.heat || 0) + 4)>>
<<set _yg2 = ($prison.block is "F") ? "Female" : "Male">>
<<if not prisonPlayerActiveSexBlocked($player, $playerlock) and random(1, 100) lte 50>>
<<SetAnalPick $player.gender() _yg2>>
<<set $yardVideo = _pick>>
<<set $yardContent = { adult: true, partnerGender: _yg2, nonConsent: false }>>
<<set _yardTool = ($player.gender() is "Female") ? "a prison-made strap" : "your cock">>
<<set _yardCumHer = ($player.gender() is "Female") ? "You grind yourself off against the harness with the strap still deep in her ass." : "You cum in her ass while the plates clang outside.">>
<<set _yardCumHim = ($player.gender() is "Female") ? "You grind yourself off against the harness with the strap still deep in his ass." : "You cum in his ass while the plates clang outside.">>
<<if $prison.block is "F">>
<<set $yardMsg = "She spots you through a heavy set, hands hovering over the bar, and when you rack it she tips her head at the dead angle like it is the most natural trade in the world. Behind the shed you bend her over the bench, push " + _yardTool + " into her ass, and fuck her until she cums against the padding. " + _yardCumHer + " You both walk back to the iron like nothing passed between you.">>
<<else>>
<<set $yardMsg = "He spots you through a max lift, hands under the bar, and when you rack it he jerks his chin at the dead angle - the yard's oldest trade. Behind the shed you put him against the wall, push " + _yardTool + " into his ass, and fuck him while the ring of the iron covers the sound. " + _yardCumHim + " He fixes his blues and racks your plates for you after, square.">>
<</if>>
<<else>>
<<SetAnalPick _yg2 $player.gender()>>
<<set $yardVideo = _pick>>
<<set $yardContent = { adult: true, partnerGender: _yg2, nonConsent: false }>>
<<if $prison.block is "F">>
<<set $yardMsg = "She stands over you spotting the bar, and the look she gives when you rack the last rep needs no translation. You follow her to the dead angle and brace on the bench while she cinches a prison-made harness on and pushes into your ass. You cum against the padding. She keeps the strap in you, rocks the base over her cunt, and cums with one hand on your hip. When the whistle blows, she goes back to the rack and loads your next plate.">>
<<else>>
<<set $yardMsg = "He spots your heaviest set and racks the bar when your arms give. Then he tips his head toward the shed and waits. Behind it, he bends you over the bench and fucks you in short hard strokes until he cums in your ass while the pile covers the noise. He slaps your shoulder, wipes his cock on your blues, and goes back to his set.">>
<</if>>
<</if>>
<<goto "Prison_YardBlind">>
<</button>></div>
<<elseif CheckContentFilter(_yg, $player)>>
<div class="centre-text" style="font-size:13px;">You have collected on the dead angle once today. Trade spots twice back here and the roving CO starts wondering what the pile is really for.</div>
<</if>>
<<if $gameSettings.contentFilter.nonConsent === true and $gameSettings.contentFilter.PlayerFeminization == true and not $prison.yardBlindToday and not $prison.shotCaller and not $prison.protected and ($prison.rep || 0) lt 60 and CheckContentFilter(_yg, $player)>>
<div class="btn"><<button "Two of them have the corner blocked off">><<set $prison.yardBlindToday = true>><<set $prison.sceneAuthority = { scene: "yardCornered", stintDay: getPrisonStintDay(), block: $prison.block }>><<goto "Prison_YardCornered">><</button>></div>
<</if>>
</div>
</fieldset>
<</if>>
<<PrisonNav>>
<<PrisonPeople>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<PrisonPendingMediaGuard "yardMsg" "yardVideo" "yardContent">>
<<SetBackground "Media/Locations/Prison/yard.jpg">>
<<set _ag = ($prison.block is "F") ? "Female" : "Male">>
<<set _yardCornerAuthority = ($prison and $prison.sceneAuthority and $prison.sceneAuthority.scene is "yardCornered" and $prison.sceneAuthority.stintDay is getPrisonStintDay() and $prison.sceneAuthority.block is $prison.block)>>
<<if $gameSettings.contentFilter.nonConsent === true and $gameSettings.contentFilter.PlayerFeminization == true and CheckContentFilter(_ag, $player)>>
<div class="centre-text">The Dead Angle</div>
<<if $yardMsg and $yardMsg isnot "">>
<<PrisonMediaProse $yardMsg $yardVideo>>
<<if $yardVideo and $yardVideo isnot "">><<Video $yardVideo>><<set $yardVideo = "">><</if>>
<div class="btn padding-top"><<button "Straighten up and walk back into the sun">>
<<set $prison.sceneAuthority = null>>
<<set $yardMsg = "">>
<<set $yardVideo = "">>
<<set $yardContent = null>>
<<goto "Prison_YardBlind">>
<</button>></div>
<<elseif not _yardCornerAuthority>>
<<if $prison>><<set $prison.sceneAuthority = null>><</if>>
<<goto "Prison_Yard">>
<<else>>
<<if $prison.block is "F">>
<div class="chat-container prison-prose"><p class="text">You realize too late that the two women lifting near the shed were never lifting. One steps into the gap behind you and the other blocks the sight line, and the gun tower is a hundred yards of open ground away. <span class='dialogue-speech'>"Cameras got a blind spot back here, boot. So do the screws. Nobody is coming."</span></p></div>
<<else>>
<div class="chat-container prison-prose"><p class="text">You clock too late that the two men racking plates by the shed were never lifting. One steps in behind you, the other kills the sight line, and the gun tower may as well be on the moon. <span class='dialogue-speech'>"Tower cannot see this corner, boot. Neither can the screws. It is just us back here, and you walked right into it."</span></p></div>
<</if>>
<div class="btn-container">
<div class="btn"><<button "Put your back to the shed and swing">>
<<set $prison.sceneAuthority = null>>
<<set _ag = ($prison.block is "F") ? "Female" : "Male">>
<<set _str = $player.attributes.strength.value>>
<<set _edge = ($prison.hasShiv) ? 20 : 0>>
<<if $prison.gang and hasGangBackup($prisonRoster, $prison.gang)>><<set _edge = _edge + 12>><</if>>
<<if random(1, 100) lte (16 + _str * 6 + _edge)>>
<<SetCharProgression $player "dominance" 3 true>>
<<set $prison.rep = Math.min(100, ($prison.rep || 0) + 6)>>
<<set $yardVideo = "">>
<<set $yardContent = null>>
<<if $prison.hasShiv>><<set $prison.heat = Math.min(100, ($prison.heat || 0) + 6)>><</if>>
<<set $yardMsg = "Two on one in a blind corner is a bad hand. You put your back to the shed and make them come one at a time. The first catches your knuckles across the jaw; the second loses interest. When you step back into the sun, alone and still upright, conversations along the fence break off.">>
<<else>>
<<set _pgBefore = $player.gender()>>
<<SetAnalPick _ag _pgBefore>>
<<set $yardVideo = _pick>>
<<set $yardContent = { adult: true, partnerGender: _ag, nonConsent: true, playerFeminization: true }>>
<<PrisonCoerceBody>>
<<set $prison.rep = Math.max(0, ($prison.rep || 0) - 10)>>
<<run unlockPrisonAchievement('toppedByBlock')>>
<<if $prison.block is "F">>
<<set $yardMsg = "You get one good swing in before the numbers tell. They put you face down over the bench press behind the shed and hold you there. One woman pins your arms while the other drives the strap into your ass until it forces you off against the padding, then they trade places. The clang of the pile covers all of it.\n\nThe second woman buckles the wet harness on, grips your hips and fucks your ass with the strap until she grinds herself to orgasm against it. She leaves you in the chalk dust; the yard saw you go in standing and did not see you come out the same.">>
<<else>>
<<set $yardMsg = "You get one good swing in before the numbers tell. They put you face down over the bench press behind the shed and hold you there. One man pins your arms while the other gets his cock in your ass and rides it until he cums, then they trade places. The clang of the pile covers both men using you.\n\nThe second man shoves his cock into your ass, fucks you hard against the padding until he cums deep in you, and strolls back to the rack. The yard saw you go in standing and did not see you come out the same.">>
<</if>>
<</if>>
<<goto "Prison_YardCornered">>
<</button>></div>
<div class="btn"><<button "There is nowhere to go - let them fuck you">>
<<set $prison.sceneAuthority = null>>
<<set _ag = ($prison.block is "F") ? "Female" : "Male">>
<<set _pgBefore = $player.gender()>>
<<SetAnalPick _ag _pgBefore>>
<<set $yardVideo = _pick>>
<<set $yardContent = { adult: true, partnerGender: _ag, nonConsent: true, playerFeminization: true }>>
<<PrisonCoerceBody>>
<<set $prison.rep = Math.max(0, ($prison.rep || 0) - 12)>>
<<run unlockPrisonAchievement('toppedByBlock')>>
<<if $prison.block is "F">>
<<set $yardMsg = "There is a wall at your back, two women in front, and a hundred yards of open ground to any screw who would care. They force you over the bench. The first woman strap-fucks your ass until she cums against the buckles, then unbuckles the harness for her friend.\n\nThe second woman straps it on and fucks your ass until she cums too, and her last hard strokes make you cum against the padding. She walks back to the iron and leaves you in the dust with your blues at your knees.">>
<<else>>
<<set $yardMsg = "There is a wall at your back, two men in front, and a hundred yards of open ground to any screw who would care. You brace on the bench. The first man fucks your ass and cums in you, then steps back for his friend.\n\nThe second man takes his place, fucks your ass until he cums in you too, and drifts back to the iron. You stand in the dust putting yourself right, already knowing the corner will have talked before the whistle.">>
<</if>>
<<goto "Prison_YardCornered">>
<</button>></div>
</div>
<</if>>
<<else>>
<<if $prison>><<set $prison.sceneAuthority = null>><</if>>
<<set $yardMsg = "">>
<<set $yardVideo = "">>
<<set $yardContent = null>>
<<goto "Prison_YardBlind">>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<PrisonRegimeGuard "yard" "The weight pile" "13:00-16:00" "weightsMsg" "weightsVideo" "weightsContent">>
<<if prisonRegimeOpen("yard", $dateTime.hours, getPrisonStintDay())>>
<<SaveLocation>>
<<SetBackground "Media/Locations/Prison/yard.jpg">>
<div class="centre-text">The Weight Pile</div>
<div class="centre-text" style="font-size:14px;">Rusted plates, a bench worn smooth, and a shed frame everyone chins on. The iron does not care what you did or who you run with. It is the one honest thing on the yard, and the one that talks loudest when you cannot.</div>
<<if $weightsMsg and $weightsMsg isnot "">>
<<PrisonMediaProse $weightsMsg $weightsVideo>>
<<if $weightsVideo and $weightsVideo isnot "">><<Video $weightsVideo>><<set $weightsVideo = "">><</if>>
<<set $weightsMsg = "">>
<<set $weightsVideo = "">>
<<set $weightsContent = null>>
<</if>>
<<set _sessions = ($prison.liftSessions || 0)>>
<fieldset>
<legend>Conditioning</legend>
<div class="centre-text" style="font-size:14px;">Sessions on the pile this bid: <<= _sessions>><<if _sessions gte IRON_PILE_SESSIONS>> · the block reads you as iron now<</if>></div>
</fieldset>
<fieldset>
<legend>The iron</legend>
<div class="btn-container">
<<for _l range WORKOUT_LIFTS>>
<<capture _l>>
<div class="btn"><<button _l.label>>
<<set $weightsVideo = "">>
<<set $weightsContent = null>>
<<SpendTime _l.minutes>>
<<SetCharProgression $player _l.stat _l.statXp true>>
<<set _liftEnergyCost = prisonEnergyCost($prison, _l.energy)>>
<<SpendEnergy $player _liftEnergyCost>>
<<set $prison.liftSessions = ($prison.liftSessions || 0) + 1>>
<<run awardPrisonSkillPoints($prison, "workout")>>
<<run recordPrisonDirectorEvent($prison, "activity")>>
<<if ($prison.liftSessions || 0) is IRON_PILE_SESSIONS>>
<<set $prison.rep = Math.min(100, ($prison.rep || 0) + 5)>>
<<run unlockPrisonAchievement('ironPile')>>
<<set $weightsMsg = "You rack the bar and catch your breath. A wolf waiting for the bench looks at the plates, looks at your shoulders, and calls you next instead of ordering you off. The sessions have finally changed how the yard handles you.">>
<<else>>
<<set $weightsMsg = ["You work the " + _l.label.toLowerCase() + " until the muscle gives out, chalk ground into your palms and rust on your blues. Nobody bothers a con in the middle of a set.", "You put in a hard set and rack it clean with your arms shaking. The con waiting behind you counts the last rep aloud and gives the bar a respectful tap.", "You chain the reps past the burn until your breath saws. For the rest period, all you can hear is iron clanging and your pulse in your ears."].random()>>
<</if>>
<<goto "Prison_Weights">>
<</button>></div>
<</capture>>
<</for>>
</div>
</fieldset>
/* The bench-off: the pile's own contest, played rather than rolled. The
endurance engine is the cruise's, reused whole - two people under a loaded
bar, choosing when to press and when to hold until one of them breaks. */
<<set _ironRoster = prisonFilterAdults($prisonRoster)>>
<<if _ironRoster.length and not $prison.benchOffToday>>
<<set _ironFoe = _ironRoster[getPrisonStintDay() % _ironRoster.length]>>
<<capture _ironFoe>>
<fieldset>
<legend>Under the bar</legend>
<div class="centre-text" style="font-size:13px;"><<= _ironFoe.name>> loads the bar past what either of you should be repping and puts a hand on it. Whoever racks first buys the other a store run. It is the pile's oldest argument and the only one it settles honestly.</div>
<div class="btn-container">
<div class="btn"><<button "Get under the bar">>
<<set _ironLive = getInmate($prisonRoster, _ironFoe.id)>>
<<if _ironLive and not $prison.benchOffToday>>
<<set $prison.benchOffToday = true>>
<<set $benchSession = startEnduranceSession({
npcId: _ironLive.id,
npcName: _ironLive.name,
bet: 8,
playerSkill: Math.min(0.9, 0.2 + ($prison.liftSessions || 0) / 25 + $player.attributes.strength.value / 30),
npcSkill: Math.max(0.2, Math.min(0.85, (_ironLive.stats.standing || 40) / 130 + (_ironLive.dominance || 4) / 25)),
npcAggression: Math.max(0.15, Math.min(0.85, (_ironLive.stats.azart || 30) / 100)),
caged: false
})>>
<<goto "Prison_BenchOff">>
<</if>>
<</button>></div>
</div>
</fieldset>
<</capture>>
<<elseif $prison.benchOffToday>>
<div class="prison-actnote">You have already settled one argument under the bar today. Your arms are finished.</div>
<</if>>
<<set _adultWeightsRoster = prisonFilterAdults($prisonRoster)>>
<<set _foe = _adultWeightsRoster.length ? _adultWeightsRoster.random() : null>>
<<if _foe and not $prison.sparredToday>>
<fieldset>
<legend>Spar a regular</legend>
<div class="centre-text" style="font-size:13px;">Someone always wants to test the new weight. Trading sets is how the pile takes a con's measure - and how you take theirs.</div>
<div class="btn-container">
<<set _sparLbl = "Settle who is stronger with " + _foe.name>>
<div class="btn"><<button _sparLbl>>
<<set $weightsVideo = "">>
<<set $weightsContent = null>>
<<set $prison.sparredToday = true>>
<<SpendTime 20>>
<<SpendEnergy $player 18>>
<<set _pp = pilePower($player.attributes.strength.value, $player.attributes.endurance.value, ($player.attributes.dominance ? $player.attributes.dominance.value : 5))>>
<<set _f = getInmate($prisonRoster, _foe.id)>>
<<set _res = resolveSpar(_pp, _f)>>
<<SetCharProgression $player "strength" _res.strengthXp true>>
<<set $prison.rep = Math.max(0, Math.min(100, ($prison.rep || 0) + _res.rep))>>
<<if _res.win>>
<<set $prison.sparWonId = _f.id>>
<<if _f.gender isnot "Male">>
<<set $weightsMsg = "You match her set for set and then pull ahead on the last rack, grinding out the rep her arms could not. She racks the bar, blows out a breath, and gives you a flat nod for besting her clean. The pile watched you take her measure, and your name sits heavier on the yard for it.">>
<<else>>
<<set $weightsMsg = "You match him set for set and then pull ahead on the last rack, grinding out the one more rep his arms could not find. He racks the bar, blows out a breath, and gives you a flat nod for besting him clean. The pile watched you take his measure, and your name sits heavier on the yard for it.">>
<</if>>
<<else>>
<<if _f.gender isnot "Male">>
<<set $weightsMsg = "She grinds out one more than you can, clean, and racks it while your arms are still shaking. You gave the pile a show and came up the smaller of the two, and the yard files it. No shame in the effort - but the iron does not lie, and today it said she was the stronger.">>
<<else>>
<<set $weightsMsg = "He grinds out one more than you can, clean, and racks it grinning while your arms are still shaking. You gave the pile a show and came up the smaller of the two, and the yard files it. No shame in the effort - but the iron does not lie, and today it said he was the stronger man.">>
<</if>>
<</if>>
<<goto "Prison_Weights">>
<</button>></div>
</div>
</fieldset>
<<elseif $prison.sparredToday>>
<fieldset>
<legend>Spar a regular</legend>
<div class="centre-text" style="font-size:13px;">You have taken your measure on the pile today. The iron will still be here tomorrow.</div>
</fieldset>
<</if>>
<<set _won = getInmate($prisonRoster, $prison.sparWonId)>>
<<if _won and $gameSettings.contentFilter.nonConsent === true and CheckContentFilter(_won.gender, $player) and not isLoverOfPlayer(_won) and not isClaimedByPlayer(_won) and not prisonPlayerActiveSexBlocked($player, $playerlock)>>
<fieldset>
<legend>Collect the winner's due</legend>
<div class="centre-text" style="font-size:13px;">You put <<= _won.name>> down in front of the weight pile. When <<= _won.name>> gets up, the lifters wait to see whether you collect.</div>
<div class="btn-container">
<<set _wonPrizeLbl = "Walk " + _won.name + " behind the shed and take what you won">>
<div class="btn"><<button _wonPrizeLbl>>
<<if prisonPlayerActiveSexBlocked($player, $playerlock)>>
<<set $weightsMsg = "Your cock is locked, so you cannot collect the sexual due by fucking the loser. You leave the wager where it ended.">>
<<set $prison.sparWonId = undefined>>
<<goto "Prison_Weights">>
<<else>>
<<SpendTime 20>>
<<SetCharProgression $player "dominance" 2 true>>
<<SetCharProgression $player "corruption" 1 true>>
<<set $prison.rep = Math.min(100, ($prison.rep || 0) + 3)>>
<<set $prison.heat = Math.min(100, ($prison.heat || 0) + 3)>>
<<set _wg = _won.gender>>
<<if _won.stats>><<set _won.stats.shame = Math.min(100, (_won.stats.shame || 0) + 3)>><</if>>
<<SetAnalPick $player.gender() _wg>>
<<set $weightsVideo = _pick>>
<<set $weightsContent = { adult: true, partnerGender: _wg, nonConsent: true }>>
<<if _wg is "Female">>
<<set $weightsMsg = "You beat her in front of the whole pile. She walks behind the shed before anybody has to shove her, choosing the small dignity of going on her feet. You buckle on a prison-made strap, bend her over the bench, and fuck her ass while the iron clangs outside. You drive the base over your clit until you cum with the strap still in her. When you return, the next lifter strips her plates without being asked.">>
<<elseif _wg is "Shemale">>
<<set $weightsMsg = "You beat her clean in front of the pile. She goes behind the shed ahead of you with her blues already loose. You bend her over the bench and fuck her ass while her cock hardens against the steel. When you return, nobody asks who won.">>
<<else>>
<<set $weightsMsg = "You beat him clean in front of the pile. He walks behind the shed ahead of you rather than be dragged, and you bend him over the bench you just out-lifted him on, push your cock into his ass, and fuck him unhurried until you cum inside him. The iron covers the noise. When you return, another lifter is already stripping his plates from the bar.">>
<</if>>
<<set $prison.sparWonId = undefined>>
<<goto "Prison_Weights">>
<</if>>
<</button>></div>
</div>
</fieldset>
<</if>>
<<if _won and prisonPlayerActiveSexBlocked($player, $playerlock)>>
<fieldset>
<legend>Leave the winner's due</legend>
<div class="centre-text" style="font-size:13px;">With your cock caged, you cannot fuck the loser to collect the winner's due. Leave it uncollected and keep moving.</div>
<div class="btn"><<button "Leave the due uncollected">><<set $prison.sparWonId = undefined>><<goto "Prison_Weights">><</button>></div>
</fieldset>
<</if>>
<<PrisonNav>>
<<PrisonPeople>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<if not $prison or not $prison.inside or not $benchSession>>
<<goto "Prison_Block">>
<<else>>
<<SetBackground "Media/Locations/Prison/yard.jpg">>
<<set _bench = $benchSession>>
<div class="centre-text">Under the Bar</div>
<div class="centre-text" style="font-size:14px;">You against <<= _bench.name ? _bench.name : _bench.npcName>>, eight scrip on it, and a bar neither of you will admit is too heavy.</div>
<div class="prison-endure">
<div class="prison-endure__row"><span>You</span><span><<= Math.max(0, Math.round(_bench.playerResolve))>></span></div>
<div class="prison-endure__row"><span><<= _bench.npcName>></span><span><<= Math.max(0, Math.round(_bench.npcResolve))>></span></div>
<div class="centre-text" style="font-size:13px;">Exchange <<= _bench.exchange>></div>
</div>
<<if _bench.last>>
<div class="chat-container prison-prose"><p class="text">You <<= _bench.last.tempo is "press" ? "drove the bar and made it hurt" : "held the weight and breathed">>; <<= _bench.npcName>> <<= _bench.last.npcTempo is "press" ? "answered by pressing" : "held and waited you out">>. It cost you <<= _bench.last.playerHit>> and them <<= _bench.last.npcHit>>.</p></div>
<</if>>
<<if not _bench.over>>
<div class="btn-container">
<div class="btn"><<button "Press - make them carry it">>
<<run enduranceExchange($benchSession, "press")>>
<<goto "Prison_BenchOff">>
<</button>></div>
<div class="btn"><<button "Hold - let them burn out">>
<<run enduranceExchange($benchSession, "hold")>>
<<goto "Prison_BenchOff">>
<</button>></div>
</div>
<<else>>
<<set _benchOut = enduranceResult($benchSession)>>
<<if _benchOut.won>>
<div class="chat-container prison-prose"><p class="text"><<= _bench.npcName>> racks it first, badly, with both arms shaking, and says something about the bar being uneven that nobody at the pile pretends to believe. You take the eight scrip off the bench and put your shirt back on while the yard watches you do it.</p></div>
<<else>>
<div class="chat-container prison-prose"><p class="text">Your arms give out first. The bar hits the rack hard enough to turn heads. <<= _bench.npcName>> grinds out two more reps, sits up and holds a hand out for the eight scrip.</p></div>
<</if>>
<<run $player.status.energy.decrease(8)>>
<<SpendTime 25>>
<<set $prison.scrip = Math.max(0, ($prison.scrip || 0) + _benchOut.net)>>
<<if _benchOut.won>>
<<set $prison.rep = Math.min(100, ($prison.rep || 0) + 3)>>
<<SetCharProgression $player "strength" 4 true>>
<<else>>
<<set $prison.rep = Math.max(0, ($prison.rep || 0) - 1)>>
<<SetCharProgression $player "strength" 2 true>>
<</if>>
<<run awardPrisonSkillPoints($prison, "workout")>>
<<run recordPrisonDirectorEvent($prison, "activity")>>
<div class="btn padding-top"><<button "Back to the pile">><<unset $benchSession>><<goto "Prison_Weights">><</button>></div>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/Prison/yard.jpg">>
<div class="centre-text"><<PrisonItemIcon "dice" "prison-item-icon--table">></div>
<div class="centre-text">The Dice Circle</div>
<div class="centre-text" style="font-size:14px;">A blanket on the concrete in the lee of the wall, three worn bones, and a ring of cons who will take your scrip and call it a favor. Cee-lo: four-five-six wins, one-two-three loses, and the dice sort out the rest.</div>
<div class="centre-text prison-scrip-line" style="font-size:15px;"><<PrisonItemIcon "scrip">> Scrip: <<= ($prison.scrip || 0)>></div>
<div id="prison-dice-stage">
<<if $diceRound and $diceRound.phase is "ready">>
<<PrisonDiceRoll $diceRound>>
<div id="prison-dice-controls">
<<set _dicePendingLabel = $diceRound.kind is "body" ? "Your body is in the pot. The wager is not committed until you throw." : ($diceRound.stake + " scrip is ready, but still in your hand until you throw.")>>
<div class="prison-dice-prompt"><<= _dicePendingLabel>> Your bones keep turning; <<= $diceRound.opponent>> takes the next turn after you stop them.</div>
<div class="btn-container">
<div class="btn"><<button "Throw the bones">>
<<set _pendingDiceRound = $diceRound>>
<<set $diceRound = null>>
<<PrisonResolveDiceRound _pendingDiceRound>>
<<if $diceRoll>>
<<run revealPrisonDiceRoll($diceRoll)>>
<<replace "#prison-dice-controls">><<PrisonDiceOutcomePanel>><</replace>>
<<else>>
<<replace "#prison-dice-stage">><<PrisonDiceOutcomePanel>><</replace>>
<</if>>
<</button>></div>
<div class="btn"><<button "Pull out before the throw">>
<<set $diceRound = null>>
<<set $diceRoll = null>>
<<set $diceMsg = "">>
<<set $diceVideo = "">>
<<set $diceContent = null>>
<<goto "Prison_Dice">>
<</button>></div>
</div>
</div>
<<elseif $diceMsg and $diceMsg isnot "">>
<<if $diceRoll>><<PrisonDiceRoll $diceRoll>><</if>>
<<PrisonDiceOutcomePanel>>
<<else>>
<div class="btn-container">
<<if $player.status.energy.value lt 8>>
<div class="prison-actnote">You are too wrung out to focus on the bones. The circle is not going anywhere - rest, or a coffee, first.</div>
<</if>>
<<for _st range DICE_STAKES>>
<<capture _st>>
<<if ($prison.scrip || 0) gte _st and $player.status.energy.value gte 8>>
<<set _slbl = "Bet " + _st + " scrip">>
<div class="btn"><<button _slbl>>
<<set $diceRound = null>>
<<set $diceRoll = null>>
<<if ($prison.scrip || 0) gte _st and $player.status.energy.value gte 8>>
<<set $diceVideo = "">>
<<set $diceContent = null>>
<<set _dicePlayers = []>>
<<for _diceInmate range $prisonRoster>>
<<if _diceInmate and _diceInmate.block is $prison.block>><<run _dicePlayers.push(_diceInmate)>><</if>>
<</for>>
<<set _opp = pickDiceOpponent(_dicePlayers, _st)>>
<<if not _opp>>
<<set $diceMsg = "The dice circle is empty for the moment. Your stake stays in your hand.">>
<<else>>
<<set $diceMsg = "">>
<<set $diceRound = {
phase: "ready",
kind: "scrip",
stake: _st,
opponentId: _opp.id,
opponent: _opp.name,
stintDay: getPrisonStintDay()
}>>
<</if>>
<<goto "Prison_Dice">>
<<else>>
<<goto "Prison_Dice">>
<</if>>
<</button>></div>
<</if>>
<</capture>>
<</for>>
<<if not $prison.diceBodyToday and not $prison.shotCaller and not prisonPlayerActiveSexBlocked($player, $playerlock)>>
<<set _bwPool = []>>
<<for _yi range $prisonRoster>>
<<if _yi and _yi.block is $prison.block and CheckContentFilter(prisonSexGender(_yi), $player)>><<run _bwPool.push(_yi)>><</if>>
<</for>>
<<set _bwOpp = _bwPool.random()>>
<<if _bwOpp>>
<div class="btn"><<button "Put your own body in the pot - one throw, winner takes the loser">>
<<set $diceRound = null>>
<<set $diceRoll = null>>
<<set _bwLive = getInmate($prisonRoster, _bwOpp.id)>>
<<set _bwGender = _bwLive ? prisonSexGender(_bwLive) : null>>
<<if not $prison.diceBodyToday and not $prison.shotCaller and not prisonPlayerActiveSexBlocked($player, $playerlock) and _bwLive and _bwLive.block is $prison.block and CheckContentFilter(_bwGender, $player)>>
<<set $diceVideo = "">>
<<set $diceContent = null>>
<<set $diceMsg = "">>
<<set $diceRound = {
phase: "ready",
kind: "body",
opponentId: _bwLive.id,
opponent: _bwLive.name,
stintDay: getPrisonStintDay()
}>>
<</if>>
<<goto "Prison_Dice">>
<</button>></div>
<</if>>
<</if>>
<<if not $prison.diceBodyToday and not $prison.shotCaller and prisonPlayerActiveSexBlocked($player, $playerlock)>>
<div class="prison-actnote">A body wager could require you to fuck the loser, which your locked cock cannot do. Keep playing for scrip or leave the circle.</div>
<</if>>
<div class="btn"><<button "Step back from the circle" "Prison_Block">><<set $diceRound = null>><<set $diceRoll = null>><</button>></div>
</div>
<</if>>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _escapePaths = ["tunnel", "duct", "riot", "transport", "trash", "disguise"]>>
<<set _escapeVisit = ($prison and $prison.inside) ? getActiveCrossBlockVisit($prison, { day: getCurrentAbsoluteDay(), hour: $dateTime.hours, minute: $dateTime.minutes }) : null>>
<<set _escapeQuestRoute = ($prison and $prison.inside and not $prison.inPC and not _escapeVisit and $questRouteId is "pq_yard_wall" and _escapePaths.includes($questRoutePath) and prisonQuestState('pq_yard_wall') is "active")>>
<<if not _escapeQuestRoute>>
<<if $prison>><<set $prison.escapeSuccess = null>><</if>>
<<set $questRouteId = "">>
<<set $questRoutePath = "">>
<<if not $prison or not $prison.inside>><<goto "PoliceStation">><<elseif $prison.inPC>><<goto "Prison_Segregation">><<elseif _escapeVisit>><<goto "Prison_OtherBlock">><<else>><<goto "Prison_Block">><</if>>
<<else>>
<<set $prison.escapeSuccess = null>>
<<SetBackground "Media/Locations/Prison/perimeter.jpg">>
<<set _routePath = $questRoutePath>>
<<set _dex = $player.attributes.dexterity.value>>
<<set _str = $player.attributes.strength.value>>
<<set _speech = ($player.attributes.speech ? $player.attributes.speech.value : 3)>>
<<set _heat = ($prison.heat || 0)>>
<<set _routeReady = true>>
<<set _heading = "The Perimeter">>
<<set _attemptText = "You commit to the opening and move before count can close around you.">>
<<set _failureReason = "Caught at the perimeter">>
<<set _chance = 5>>
<<switch _routePath>>
<<case "tunnel">>
<<set _routeReady = ($prison.hasEscapeTool is true)>>
<<set _heading = "Under the Wire">>
<<set _attemptText = "You take the cutters into the utility crawl and work through packed earth beneath the inner fence.">>
<<set _failureReason = "The utility crawl collapsed under the fence">>
<<set _chance = 25 + (_str * 5) + (_dex * 2) - Math.round(_heat * 0.25)>>
<<case "duct">>
<<set _routeReady = ($prison.hasLockpick is true and _dex gte 4)>>
<<set _heading = "Through the Ducts">>
<<set _attemptText = "The pick turns the maintenance grille. You pull it shut behind you and crawl toward the service roof.">>
<<set _failureReason = "A maintenance grille trapped you in the ducts">>
<<set _chance = 20 + (_dex * 7) - Math.round(_heat * 0.25)>>
<<case "riot">>
<<set _routeReady = (!!$prison.gang and ($prison.rep || 0) gte 60)>>
<<set _heading = "Count Breaks">>
<<set _attemptText = "Your car turns the yard into a moving wall of bodies. You break from the smoke while every uniform faces the riot.">>
<<set _failureReason = "The riot line closed before you reached the service gate">>
<<set _chance = 20 + (_str * 4) + (($prison.rep || 0) * 0.35) - Math.round(_heat * 0.25)>>
<<case "transport">>
<<set _routeReady = (($prison.scrip || 0) gte 30 and ($prison.staff || 0) gte 25)>>
<<set _heading = "The Transport Van">>
<<set _attemptText = "Thirty scrip changes hands. The transport officer leaves one cage unlatched and looks away at the service turn.">>
<<set _failureReason = "The transport officer sold you back to the watch commander">>
<<set _chance = 25 + (_speech * 5) + (($prison.staff || 0) * 0.25) - Math.round(_heat * 0.2)>>
<<case "trash">>
<<set _heading = "Outbound Waste">>
<<set _attemptText = "You fold yourself beneath wet canvas and kitchen refuse, counting each checkpoint by the stops of the cart.">>
<<set _failureReason = "The service crew searched the waste cart">>
<<set _chance = 15 + (_dex * 6) - Math.round(_heat * 0.3)>>
<<case "disguise">>
<<set _routeReady = ($prison.hasDisguise is true and ($prison.staff || 0) gte 15)>>
<<set _heading = "Through the Service Gate">>
<<set _attemptText = "The stolen uniform fits well enough. You take a clipboard, match the shift change, and walk toward the service gate.">>
<<set _failureReason = "A service officer challenged the stolen uniform">>
<<set _chance = 25 + (_speech * 4) + (_dex * 2) + (($prison.staff || 0) * 0.2) - Math.round(_heat * 0.25)>>
<</switch>>
<<set _chance = Math.min(90, Math.max(5, Math.round(_chance)))>>
<<if not _routeReady>>
<<set $questRouteId = "">>
<<set $questRoutePath = "">>
<div class="centre-text">Route Closed</div>
<div class="chat-container prison-prose"><p class="text">The opening closes before you move. You are missing the gear, standing or backing this route needs. Nothing is spent; you can rebuild the plan or try another way out.</p></div>
<div class="btn padding-top"><<button "Back to the block" "Prison_Block">><</button>></div>
<<elseif $prison.escapeAttemptToday>>
<<set $questRouteId = "">>
<<set $questRoutePath = "">>
<div class="centre-text">Count Is Watching</div>
<div class="chat-container prison-prose"><p class="text">The perimeter is still hot from today's movement. Every tower is awake and every service detail is being counted twice. The route remains open, but committing now would only hand the plan to the COs. You will have to wait until tomorrow.</p></div>
<div class="btn padding-top"><<button "Back to the block" "Prison_Block">><</button>></div>
<<else>>
<<set $prison.escapeAttemptToday = true>>
<<SpendTime 60>>
<<SpendEnergy $player 10>>
<<if random(1, 100) lte _chance>>
<<set $prison.escapeSuccess = { questId: $questRouteId, path: _routePath, stintDay: getPrisonStintDay() }>>
<<goto "Prison_Escaped">>
<<else>>
<<if _routePath is "tunnel">><<set $prison.hasEscapeTool = false>><</if>>
<<if _routePath is "duct">><<set $prison.hasLockpick = false>><</if>>
<<if _routePath is "disguise">><<set $prison.hasDisguise = false>><</if>>
<<if _routePath is "transport">><<set $prison.scrip = Math.max(0, ($prison.scrip || 0) - 30)>><</if>>
<<run extendSentence(4)>>
<<set $prison.heat = Math.min(100, ($prison.heat || 0) + (_routePath is "riot" ? 35 : 25))>>
<<if $questRouteId and isPrisonQuestActive($questRouteId)>><<run failPrisonQuestPath($questRouteId, _routePath, _failureReason, true)>><</if>>
<<set $questRouteId = "">>
<<set $questRoutePath = "">>
<div class="centre-text"><<= _heading>> - Failed</div>
<div class="chat-container prison-prose"><p class="text"><<= _attemptText>> <<= _failureReason>>. Boots, cuffs and a disciplinary report follow. Four days go onto your bid, your heat climbs, and anything used in the attempt is gone. If you can replace it or find another way out, tomorrow is another count.</p></div>
<div class="btn padding-top"><<button "Back to the block" "Prison_Block">><</button>></div>
<</if>>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _escapePaths = ["tunnel", "duct", "riot", "transport", "trash", "disguise"]>>
<<set _escapeSuccess = ($prison && $prison.inside) ? $prison.escapeSuccess : null>>
<<set _escapeQuestRoute = (_escapeSuccess and $prison.escapeAttemptToday is true and _escapeSuccess.questId is $questRouteId and _escapeSuccess.path is $questRoutePath and _escapeSuccess.stintDay is getPrisonStintDay() and $questRouteId is "pq_yard_wall" and _escapePaths.includes($questRoutePath) and prisonQuestState('pq_yard_wall') is "active")>>
<<if not _escapeQuestRoute>>
<<if $prison>><<set $prison.escapeSuccess = null>><</if>>
<<set $questRouteId = "">>
<<set $questRoutePath = "">>
<<if not $prison or not $prison.inside>><<goto "PoliceStation">><<elseif $prison.inPC>><<goto "Prison_Segregation">><<else>><<goto "Prison_Block">><</if>>
<<else>>
<<set _routePath = $questRoutePath>>
<<set _escapeOutcome = finalizePrisonQuestRoute($questRouteId, _routePath, "escape")>>
<<if not _escapeOutcome or not _escapeOutcome.completed>>
<<set $questRouteId = "">>
<<set $questRoutePath = "">>
<<goto "Prison_Block">>
<<else>>
<<if _routePath is "tunnel">><<set $prison.hasEscapeTool = false>><</if>>
<<if _routePath is "duct">><<set $prison.hasLockpick = false>><</if>>
<<if _routePath is "disguise">><<set $prison.hasDisguise = false>><</if>>
<<if _routePath is "transport">><<set $prison.scrip = Math.max(0, ($prison.scrip || 0) - 30)>><</if>>
<<set $questRouteId = "">>
<<set $questRoutePath = "">>
<<run releasePlayer('escape')>>
<<run $('#prison-sidebar-status').remove()>>
<<run unlockPrisonAchievement('escaped')>>
<<SetBackground "Media/Locations/Prison/perimeter.jpg">>
<<set _escapeHeading = "Beyond the Perimeter">>
<<set _escapeText = "The service road falls behind you. No sirens yet. You leave your name, your property, and everything they held at intake behind - you are nobody now, and wanted everywhere.">>
<<switch _routePath>>
<<case "tunnel">><<set _escapeHeading = "Under the Wire">><<set _escapeText = "The crawl breaks through beyond the outer fence. You drag yourself into the drainage cut and leave the cutters in the mud. No sirens yet. Your property remains behind, and the city will know you as a fugitive.">>
<<case "duct">><<set _escapeHeading = "Off the Service Roof">><<set _escapeText = "The last grille gives and the service roof opens below you. One careful drop puts the perimeter behind your back. Your property remains inside, and every patrol in the city will carry your name.">>
<<case "riot">><<set _escapeHeading = "Gone in the Smoke">><<set _escapeText = "The riot swallows count, radios, and the last clear sightline. By the time the yard locks down, you are beyond the service road. Your property stays behind, and the city will hunt you for the escape your car helped make possible.">>
<<case "transport">><<set _escapeHeading = "Past the Service Turn">><<set _escapeText = "The unlatched cage opens after the van clears the service turn. You drop into traffic before the officer can reconsider the deal. Your property remains at intake, and the first recount will put your face in every patrol car.">>
<<case "trash">><<set _escapeHeading = "Beyond the Service Gate">><<set _escapeText = "The waste cart clears its final checkpoint. You crawl out behind the disposal yard and run before the crew circles back. Your property stays inside, and the city will hunt you as soon as the recount begins.">>
<<case "disguise">><<set _escapeHeading = "Through the Front Gate">><<set _escapeText = "The service officer glances at the clipboard and waves you through. You keep walking until the towers vanish behind warehouses. The uniform is all you carry; your property remains inside and your name is about to become a citywide warrant.">>
<</switch>>
<div class="centre-text"><<= _escapeHeading>></div>
<div class="chat-container prison-prose"><p class="text"><<= _escapeText>></p></div>
<div class="btn padding-top"><<button "Disappear into the city" "Downtown">><</button>></div>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _event = ($prison and $prison.inside and $prison.event) ? getPrisonEvent($prison.event.key) : null>>
<<set _eventBlockGender = ($prison and $prison.block is "F") ? "Female" : "Male">>
<<set _eventParticipantsAdult = prisonAdultSceneAllowed()>>
<<set _eventAdultAllowed = ($prison and _eventParticipantsAdult and CheckContentFilter(_eventBlockGender, $player))>>
<<set _eventNpcPairAllowed = ($prison and _eventParticipantsAdult and CheckContentFilter(_eventBlockGender, _eventBlockGender))>>
<<set _eventAllowed = (_event and (not _event.adult or _eventAdultAllowed) and (not _event.npcPair or _eventNpcPairAllowed) and (not _event.coercive or (_eventAdultAllowed and $gameSettings.contentFilter.nonConsent === true)))>>
<<set _eventResultMatches = (not $eventOutcome or $eventOutcome is "" or (_event and $eventOutcomeKey is _event.key))>>
<<if not _eventAllowed or not _eventResultMatches>>
<<if $prison>><<set $prison.event = null>><<set $prison.eventToHole = false>><</if>>
<<set $eventOutcome = "">>
<<set $eventOutcomeKey = "">>
<<set $eventVideo = "">>
<<if not $prison or not $prison.inside>><<goto "PoliceStation">><<elseif $prison.inPC>><<goto "Prison_Segregation">><<else>><<goto "Prison_Block">><</if>>
<<else>>
<<set $prison.event = _event>>
<<if $prison.block is "F">>
<<SetBackground "Media/Locations/Prison/block_f_dayroom.jpg">>
<<else>>
<<SetBackground "Media/Locations/Prison/block_m_dayroom.jpg">>
<</if>>
/* One localized copy for the whole scene: title, setup and every choice label
come out of the same call, so a new UI boundary cannot be forgotten. */
<<set _event = localizePrisonEvent(_event, $prison.block)>>
<div class="centre-text"><<= _event.title>></div>
<<if $eventOutcome and $eventOutcome isnot "">>
<<PrisonMediaProse $eventOutcome $eventVideo>>
<<if $eventVideo and $eventVideo isnot "">><<Video $eventVideo>><<set $eventVideo = "">><</if>>
<div class="btn padding-top"><<button "Move on">>
<<set _hole = $prison.eventToHole>>
<<set $eventOutcome = "">>
<<set $eventOutcomeKey = "">>
<<set $eventVideo = "">>
<<set $prison.event = null>>
<<set $prison.eventToHole = false>>
<<if _hole>><<set $prison.sceneAuthority = { scene: "solitary", stintDay: getPrisonStintDay() }>><<goto "Prison_Solitary">><<else>><<goto "Prison_Block">><</if>>
<</button>></div>
<<else>>
/* Custom widget arguments are tokenized before JavaScript evaluation. Keep the
multi-argument localization call out of the widget or its source leaks into prose. */
<<set _eventText = _event.text>>
<<PrisonProse _eventText>>
<div class="btn-container">
<<for _c range _event.choices>>
<<capture _c>>
/* Precomputed: a bare call with a space in a macro arg splits into two args
(raw code as the label, the tail hijacking the link target). */
<<set _cLabel = _c.label>>
<<set _paidEventGoodTimeBlocked = ((_c.paidGoodTime || 0) gt applyGoodTime(0).remaining)>>
<<set _eventChastityBlocked = prisonEventChoiceBlockedByChastity(_event.key, _c.key, { playerActiveSexBlocked: prisonPlayerActiveSexBlocked($player, $playerlock) })>>
<<if not _paidEventGoodTimeBlocked and not _eventChastityBlocked and ((_c.requiredScrip || 0) <= ($prison.scrip || 0))>>
<div class="btn"><<button _cLabel>>
/* A restored button is only a proposal. Re-fetch the authored event and
choice and repeat the live content/custody gate before any side effect. */
<<set _eventNow = ($prison and $prison.inside and $prison.event) ? getPrisonEvent($prison.event.key) : null>>
<<set _eventLiveBlockGender = ($prison and $prison.block is "F") ? "Female" : "Male">>
<<set _eventParticipantsAdultNow = prisonAdultSceneAllowed()>>
<<set _eventAdultNow = ($prison and _eventParticipantsAdultNow and CheckContentFilter(_eventLiveBlockGender, $player))>>
<<set _eventNpcPairNow = ($prison and _eventParticipantsAdultNow and CheckContentFilter(_eventLiveBlockGender, _eventLiveBlockGender))>>
<<set _eventAllowedNow = (_eventNow and (not _eventNow.adult or _eventAdultNow) and (not _eventNow.npcPair or _eventNpcPairNow) and (not _eventNow.coercive or (_eventAdultNow and $gameSettings.contentFilter.nonConsent === true)))>>
<<set _choiceNow = _eventNow ? prisonFindByKey(_eventNow.choices, _c.key) : null>>
<<set _choiceChastityBlocked = (_eventNow and _choiceNow) ? prisonEventChoiceBlockedByChastity(_eventNow.key, _choiceNow.key, { playerActiveSexBlocked: prisonPlayerActiveSexBlocked($player, $playerlock) }) : false>>
<<if not _eventAllowedNow or not _choiceNow>>
<<if $prison>><<set $prison.event = null>><<set $prison.eventToHole = false>><</if>>
<<set $eventOutcome = "">>
<<set $eventOutcomeKey = "">>
<<set $eventVideo = "">>
<<if not $prison or not $prison.inside>><<goto "PoliceStation">><<elseif $prison.inPC>><<goto "Prison_Segregation">><<else>><<goto "Prison_Block">><</if>>
<<elseif _choiceChastityBlocked>>
/* Keep the event open and discard an active-role proposal restored from history. */
<<goto "Prison_Event">>
<<elseif (_choiceNow.requiredScrip || 0) gt ($prison.scrip || 0)>>
/* Keep the event open: the restored proposal is merely no longer affordable. */
<<goto "Prison_Event">>
<<else>>
<<set $prison.event = _eventNow>>
/* The partner was cast when the incident was drawn. Re-validate it against
the live filter (the toggle can move between draw and click) and fall back
to the block's headline body rather than dropping the scene. */
<<set _eventPartnerNow = $prison.eventPartnerGender>>
<<if not _eventPartnerNow or not CheckContentFilter(_eventPartnerNow, $player)>>
<<set _eventPartnerNow = ($prison.block is "F") ? "Female" : "Male">>
<</if>>
<<set _ctx = { participantsAdult: _eventParticipantsAdultNow, adult: _eventAdultNow, nonConsent: ($gameSettings.contentFilter.nonConsent === true), npcPair: _eventNpcPairNow, stealth: $player.attributes.dexterity.value, dominance: ($player.attributes.dominance ? $player.attributes.dominance.value : 5), scrip: ($prison.scrip || 0), heat: ($prison.heat || 0), rep: ($prison.rep || 0), partnerGender: _eventPartnerNow, playerGender: $player.gender(), playerActiveSexBlocked: prisonPlayerActiveSexBlocked($player, $playerlock) }>>
<<set _o = resolvePrisonEventChoice(_eventNow.key, _choiceNow.key, _ctx)>>
<<if _o.unavailable>>
<<set $eventOutcome = prisonEventTextForBlock(_o.text, $prison.block)>>
<<set $eventOutcomeKey = _eventNow.key>>
<<set $eventVideo = "">>
<<goto "Prison_Event">>
<<else>>
<<set $eventVideo = "">>
<<if _o.video>>
<<set _pg = $player.gender()>>
<<set _vtop = _o.video.playerBottom ? _o.video.partner : _pg>>
<<set _vbot = _o.video.playerBottom ? _pg : _o.video.partner>>
<<if not CheckContentFilter(_o.video.partner, $player)>>
<<set $eventVideo = "">>
<<elseif _o.video.facefuck>>
<<SetFacefuckPick _vtop _vbot>><<set $eventVideo = _pick>>
<<elseif _o.video.oral>>
<<SetOralPick _vtop _vbot>><<set $eventVideo = _pick>>
<<elseif _o.video.anal>>
/* Explicitly anal prose (strap-on scenes included) must not fall
into the female-bottom vaginal pool below. */
<<SetAnalPick _vtop _vbot>><<set $eventVideo = _pick>>
<<elseif _vbot is "Female">>
<<SetVagPick _vtop "Female">><<set $eventVideo = _pick>>
<<else>>
<<SetAnalPick _vtop _vbot>><<set $eventVideo = _pick>>
<</if>>
<<SetCharProgression $player "corruption" 1 true>>
<</if>>
<<if _o.feminize>>
<<run unlockPrisonAchievement('toppedByBlock')>>
<<if $gameSettings.contentFilter.PlayerFeminization == true and $player.gender() isnot "Female">>
<<run applyFeminizationStage($player, 1)>>
<</if>>
<</if>>
<<if _o.achievement>><<run unlockPrisonAchievement(_o.achievement)>><</if>>
<<if _o.scrip>><<set $prison.scrip = Math.max(0, ($prison.scrip || 0) + _o.scrip)>><</if>>
<<if _o.heat>><<set $prison.heat = Math.max(0, Math.min(100, ($prison.heat || 0) + _o.heat))>><</if>>
<<if _o.sentenceDays>><<run extendSentence(_o.sentenceDays)>><</if>>
<<if _o.rep>><<set $prison.rep = Math.max(0, Math.min(100, ($prison.rep || 0) + _o.rep))>><</if>>
<<set _eventGoodTime = _o.goodTime ? applyGoodTime(_o.goodTime) : null>>
<<if _o.programming>><<set $prison.programming = ($prison.programming || 0) + _o.programming>><</if>>
<<set $prison.eventToHole = _o.toHole ? true : false>>
/* The block remembers: a solid done in a social incident lands on a real, named
con on the tier (warms them, feeds the ally/lover/proposition web). Unwired
pairings pick nobody and change nothing. */
<<set _actor = pickEventActor(_eventNow.key, _choiceNow.key, $prisonRoster)>>
<<set _actorNote = _actor ? applyEventActor(_actor, _eventNow.key, _choiceNow.key) : "">>
<<set _eventGoodTimeNote = "">>
<<if _eventGoodTime>>
<<if _eventGoodTime.applied gt 0>>
<<set _eventGoodTimeNote = " " + _eventGoodTime.applied + (_eventGoodTime.applied is 1 ? " day comes" : " days come") + " off your bid.">>
<<else>>
<<set _eventGoodTimeNote = " Your good-time allowance is already full today; no additional days are credited.">>
<</if>>
<</if>>
<<set $eventOutcome = prisonEventTextForBlock(_o.text + _eventGoodTimeNote + (_actorNote ? " " + _actorNote : ""), $prison.block)>>
<<set $eventOutcomeKey = _eventNow.key>>
<<goto "Prison_Event">>
<</if>>
<</if>>
<</button>></div>
<</if>>
<</capture>>
<</for>>
</div>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<PrisonRegimeGuard "chow" "Chow hall" "07:00-08:00, 12:00-13:00, 18:00-19:00" "chowMsg" "chowVideo" "chowContent">>
<<if prisonRegimeOpen("chow", $dateTime.hours, getPrisonStintDay())>>
<<SaveLocation>>
<<SetBackground "Media/Locations/Prison/chow_hall.jpg">>
<div class="centre-text">Chow Hall</div>
<div class="centre-text" style="font-size:14px;">Steel tables and unspoken seating rules. Where you sit says who you run with.</div>
<<if $chowMsg and $chowMsg isnot "">>
<<PrisonMediaProse $chowMsg $chowVideo>>
<<if $chowVideo and $chowVideo isnot "">><<Video $chowVideo>><<set $chowVideo = "">><</if>>
<<set $chowMsg = "">>
<<set $chowVideo = "">>
<<set $chowContent = null>>
<</if>>
<<set _cString = prisonFilterCompatible(claimedByPlayer($prisonRoster), $player)>>
<<set _chg = ($prison.block is "F") ? "Female" : "Male">>
<fieldset>
<legend>Chow Hall</legend>
<div class="btn-container">
<div class="btn"><<button "Slip into the kitchen back" "Prison_Kitchen">><</button>></div>
<div class="btn"><<button "Listen to the chatter">>
<<set $chowVideo = "">>
<<set $chowContent = null>>
<<set $chowMsg = [
"Word at the next table: the guards are due to toss the tier this week. Anyone holding better find a new spot for it.",
"Two cons are talking low about a shipment coming in on the laundry truck. Whoever moves first on that eats good for a month.",
"Somebody got opened up in the showers last night over a debt. Nobody says the name out loud, but everybody knows it.",
"The old heads are saying the yard is about to go off between two of the cars. Pick a wall to stand near.",
"A fish two tables down does not know to keep their eyes on the tray yet. They will learn, or they will be somebody's by Friday.",
"The Brotherhood and the Kings are one wrong look from going to war, and everybody with colors is sleeping light this week.",
"A CO on the night shift is taking scrip to look the other way. Word is the screw will move damn near anything for the right count.",
"They pulled a con off the tier for talking, and nobody has seen them since. The block has its own way of answering that question.",
"Somebody new is running a string out of the far cells - three punks earning, and the packs stacking up behind it.",
"There is a spot opening at the top of one of the cars, and every wolf on the block can already smell the promotion.",
"A visit went bad for somebody yesterday. Whatever came in on it was not good news, and they have not stopped shaking since.",
"Talk is the nurse in the infirmary trades more than aspirin, if you know the right way to ask and have the scrip to ask it.",
"The dice circle in the yard ran hot last night. Somebody cleaned out half the tier and walked away with a target on their back the size of their winnings.",
"Two cons went before the board this week. The one who worked the detail and sat the meetings walked early. The one with colors and a jacket full of write-ups is still here.",
"The chaplain's meeting is where half these parole files get padded, and the wolves laugh at it right up until their own date comes around.",
"Word is a sharp lawyer can shave days off a bid if the file gives her something to point at. Programs, steady work, no fresh reports. Stack the paper first.",
"Somebody's people brought bad news on the last visit and they have not been right since. Watch that one. Somebody with nothing left on the outside has nothing to lose in here.",
"The money desk is down a collector since the last one caught a shank over a debt. The car is looking at new hands. Pays good, ends bad, same as always.",
"There is a batch of pruno working behind the vents on the third tier. Whoever is cooking it is one shakedown from the hole, and everybody can smell it.",
"The old head on the end bunk has done more time than the warden has worked. Sit with them once. They know where every body on this block is buried."
].random()>>
<<goto "Prison_Chow">>
<</button>></div>
<<if $gameSettings.contentFilter.nonConsent === true and CheckContentFilter(_chg, _chg) and not $prison.voyeurToday>>
<div class="btn"><<button "Watch inmates fuck behind the tray racks">>
<<set $prison.voyeurToday = true>>
<<SpendTime 15>>
<<SetCharProgression $player "corruption" 1 true>>
<<if random(1, 100) lte 55>>
<<if $prison.block is "F">><<SetVagPick _chg "Female">><<else>><<SetAnalPick _chg _chg>><</if>>
<<set $chowVideo = _pick>>
<<set $chowContent = { adult: true, observed: true, actorGender: _chg, partnerGender: _chg, nonConsent: true }>>
<<if $prison.block is "F">>
<<set $chowMsg = ["Two tables over, half-hidden by the tray rack, a hard-faced woman has a new inmate bent over the plastic seat. She straps on, pushes the rubber cock into the inmate's cunt, and fucks her while the line shuffles past. The receiving woman cums against the table edge. Her partner pulls the harness tight and thrusts until the base rubs her to orgasm. Every face nearby stays over a tray except yours.", "Behind the tray return, one of the salon queens has a woman braced against the steel in the camera blind. She pushes a strap into the woman's cunt and fucks her until the woman at the counter cums. Then she holds the rubber cock deep, rolls her hips against the base, and cums into the other woman's shoulder. You watch over the rim of your cup."].random()>>
<<else>>
<<set $chowMsg = ["Two tables over, half-screened by the tray rack, a wolf has a fish bent over the plastic seat and fucks the fish's ass while the line shuffles past. The fish cums against the table edge; the wolf drives deep and cums inside the fish. The hall sees nothing. You see it.", "Behind the tray return, a shot-caller has one of his punks braced against the steel in the one blind the cameras leave. The shot-caller fucks the punk's ass until the punk cums gripping the rack, then drives deep and cums inside the punk while the whole room agrees it is not happening. You watch it happen anyway, over the rim of your cup."].random()>>
<</if>>
<<else>>
<<set $chowVideo = "">>
<<set $chowContent = null>>
<<set $chowMsg = ["Nothing but trays, hard looks and a CO watching the back tables for once. Whatever usually happens there keeps its head down.", "The line shuffles, steel trays clatter, and nobody starts anything before you finish eating."].random()>>
<</if>>
<<goto "Prison_Chow">>
<</button>></div>
<</if>>
<<if $gameSettings.contentFilter.nonConsent === true and _cString.length > 0 and not $prison.usedStringToday and not prisonPlayerActiveSexBlocked($player, $playerlock)>>
<div class="btn"><<button "Fuck one of your claimed inmates behind the tray return">>
<<if prisonPlayerActiveSexBlocked($player, $playerlock)>>
<<set $chowMsg = "Your cock stays locked, so you do not fuck anyone from your string. You return to your tray.">>
<<goto "Prison_Chow">>
<<else>>
<<SpendTime 15>>
<<SetCharProgression $player "dominance" 2 true>>
<<set _cs2 = prisonFilterCompatible(claimedByPlayer($prisonRoster), $player)>>
<<set _t = _cs2.random()>>
<<if _t>>
<<set $prison.usedStringToday = true>>
<<run useClaimedPunk(_t)>>
<<SetAnalPick $player.gender() _t.gender>>
<<set $chowVideo = _pick>>
<<set $chowContent = { adult: true, partnerGender: _t.gender, nonConsent: true }>>
<<if _t.stats>><<set _t.stats.shame = Math.min(100, (_t.stats.shame || 0) + 3)>><</if>>
<<set _chowTool = ($player.gender() is "Female") ? "a prison-made strap" : "your cock">>
<<set _chowCumHer = ($player.gender() is "Female") ? "With the strap still in her ass, you grind against the harness and cum against the counter." : "You cum in her ass as trays rattle past the blind.">>
<<set _chowCumHim = ($player.gender() is "Female") ? "With the strap still in his ass, you grind against the harness and cum against the counter." : "You cum in his ass as trays rattle past the blind.">>
<<if _t.gender is "Female">>
<<set $chowMsg = "You catch her eye across the hall and jerk your chin at the tray return. She leaves her food and follows. You bend her over the steel counter in the blind behind the racks, push " + _chowTool + " into her ass, and fuck her while the line shuffles past a few feet away. " + _chowCumHer + " When you straighten, three tables drop their eyes to their trays. She stays bent until you tell her to move.">>
<<elseif _t.gender is "Shemale">>
<<set $chowMsg = "You jerk your chin at the tray return and she goes, loosening her blues before she reaches the blind. You bend her over the steel behind the racks, push " + _chowTool + " into her ass, and fuck her while her own cock stays stiff against the counter. " + _chowCumHer + " She returns to the hall behind you, eyes down, with the whole chow line watching.">>
<<else>>
<<set $chowMsg = "You jerk your chin at the tray return and he goes without a word. You bend him over the steel counter behind the racks, push " + _chowTool + " into his ass, and fuck him while the line shuffles past. " + _chowCumHim + " He follows you back into the hall, fixing his blues in view of every table.">>
<</if>>
<</if>>
<<goto "Prison_Chow">>
<</if>>
<</button>></div>
<<elseif $gameSettings.contentFilter.nonConsent === true and _cString.length > 0>>
<div class="centre-text" style="font-size:13px;">You have worked your string once today. Even your property gets a night to itself.</div>
<</if>>
<<if $gameSettings.contentFilter.nonConsent === true and _cString.length > 0 and not $prison.usedStringToday and prisonPlayerActiveSexBlocked($player, $playerlock)>>
<div class="centre-text" style="font-size:13px;">You cannot fuck your claimed inmate while your cock is caged. Take the receptive anonymous option below or finish eating.</div>
<</if>>
<<if CheckContentFilter(_chg, $player)>>
<<if not $prison.anonSceneToday>>
<<set _chowAnonLabel = prisonPlayerActiveSexBlocked($player, $playerlock) ? "Let whoever is waiting fuck you behind the tray return" : "Duck behind the tray return with whoever is waiting">>
<div class="btn"><<button _chowAnonLabel>>
<<set $prison.anonSceneToday = true>>
<<SpendTime 15>>
<<SetCharProgression $player "corruption" 1 true>>
<<set $prison.heat = Math.min(100, ($prison.heat || 0) + 4)>>
<<if not prisonPlayerActiveSexBlocked($player, $playerlock) and random(1, 100) lte 55>>
<<SetAnalPick $player.gender() _chg>>
<<set $chowVideo = _pick>>
<<set $chowContent = { adult: true, partnerGender: _chg, nonConsent: false }>>
<<set _anonChowTool = ($player.gender() is "Female") ? "a prison-made strap" : "your cock">>
<<set _anonChowCumHer = ($player.gender() is "Female") ? "You keep thrusting until the harness rubs you to orgasm, the strap still in her ass." : "You cum in her ass, pull free, and listen for the line moving.">>
<<set _anonChowCumHim = ($player.gender() is "Female") ? "You keep thrusting until the harness rubs you to orgasm, the strap still in his ass." : "You cum in his ass, pull free, and listen for the line moving.">>
<<if $prison.block is "F">>
<<set $chowMsg = "A woman you have traded looks with tips her head at the tray return and you follow. Behind the racks in the one blind the cameras miss, you bend her over the steel, push " + _anonChowTool + " into her ass, and fuck her until she cums against the counter. " + _anonChowCumHer + " You never exchange names. She returns to her table before the line moves.">>
<<else>>
<<set $chowMsg = "A man you have traded looks with tips his head at the tray return and you follow. Behind the racks in the one blind the cameras miss, you bend him over the steel, push " + _anonChowTool + " into his ass, and fuck him while the hall eats. " + _anonChowCumHim + " Neither of you asks for a name or a favor. You get back before anyone takes your seat.">>
<</if>>
<<else>>
<<SetAnalPick _chg $player.gender()>>
<<set $chowVideo = _pick>>
<<set $chowContent = { adult: true, partnerGender: _chg, nonConsent: false }>>
<<if $prison.block is "F">>
<<set $chowMsg = "A woman you have traded looks with tips her head at the tray return, and this time you bend over the steel behind the racks for her. She straps on and works your ass over the steel until you cum against the counter. Keeping the rubber cock in you, she leans her weight on the harness and cums with her mouth on your shoulder. You fix your blues and get back to your tray before the line moves, without exchanging names.">>
<<else>>
<<set $chowMsg = "A man you have traded looks with tips his head at the tray return, and this time you bend over the steel behind the racks. He takes your ass in short shoves until you cum against the counter, then drives in deep and cums inside you while the hall eats a few feet away. He leaves without asking who you are. You fix your blues and return to your tray.">>
<</if>>
<</if>>
<<goto "Prison_Chow">>
<</button>></div>
<<else>>
<div class="centre-text" style="font-size:13px;">You have taken your stolen minute in the blind spots today. Slip off twice and the count starts noticing who keeps going missing.</div>
<</if>>
<</if>>
</div>
</fieldset>
<<PrisonNav>>
<<PrisonPeople>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<PrisonRegimeGuard "chow" "The kitchen" "07:00, 12:00, 18:00" "kitchenMsg" "kitchenVideo" "kitchenContent">>
<<if prisonRegimeOpen("chow", $dateTime.hours, getPrisonStintDay())>>
<<SaveLocation>>
<<SetBackground "Media/Locations/Prison/chow_hall.jpg">>
<<set _kg = ($prison.block is "F") ? "Female" : "Male">>
<div class="centre-text">The Kitchen Back</div>
<div class="centre-text" style="font-size:14px;">Steam tables and steel, and behind them the head cook's kingdom: the pantry, the dish pit, and the walk-in cooler with a door that latches from the inside. On this block food is money, and the one who runs the kitchen trades in both currencies. So does anyone with something the cook wants.</div>
<<if $kitchenMsg and $kitchenMsg isnot "">>
<<PrisonMediaProse $kitchenMsg $kitchenVideo>>
<<if $kitchenVideo and $kitchenVideo isnot "">><<Video $kitchenVideo>><<set $kitchenVideo = "">><</if>>
<<set $kitchenMsg = "">>
<<set $kitchenVideo = "">>
<<set $kitchenContent = null>>
<</if>>
<fieldset>
<legend>The Pantry</legend>
<div class="btn-container">
<<if CheckContentFilter(_kg, $player)>>
<<if not $prison.kitchenTradeToday>>
<div class="btn"><<button "Work the cook's group-sex arrangement">>
<<set $prison.kitchenTradeToday = true>>
<<run unlockPrisonAchievement('kitchenEarner')>>
<<SpendTime 25>>
<<SetCharProgression $player "corruption" 1 true>>
<<set _kg2 = ($prison.block is "F") ? "Female" : "Male">>
<<SetAnalPick _kg2 $player.gender()>>
<<set $kitchenVideo = _pick>>
<<set $kitchenContent = { adult: true, partnerGender: _kg2, nonConsent: false }>>
<<set _earn = random(8, 14)>>
<<set $prison.scrip = ($prison.scrip || 0) + _earn>>
<<run $player.status.energy.increase(10)>>
<<set $prison.rep = Math.max(0, ($prison.rep || 0) - 2)>>
<<if $prison.block is "F">>
<<set $kitchenMsg = "The cook has run this back for twenty years, and everybody knows her rate: " + _earn + " scrip, a hot tray and a bag of real food when the crew is done with you. In the walk-in it goes one woman at a time, and each hands the wet harness to the next when she finishes.\n\nOne of them holds you against the wire shelves and strap-fucks your ass until you cum, then works the base over her cunt until she finishes too.">>
<<else>>
<<set $kitchenMsg = "The cook has run this back for twenty years, and everybody knows his rate: " + _earn + " scrip, a hot tray and a bag of real food when they are done with you. In the walk-in you suck the first men until they cum in your mouth, then bend over the prep table while the rest line up at the cold-room door.\n\nThe next man in line grips your hips, fucks your ass over the prep table and cums deep in you before he washes at the sink.">>
<</if>>
<<goto "Prison_Kitchen">>
<</button>></div>
<<else>>
<div class="centre-text" style="font-size:13px;">You have earned your keep off the cook today. The kitchen opens again tomorrow.</div>
<</if>>
<<if not $prison.anonSceneToday>>
<<set _kitchenAnonLabel = prisonPlayerActiveSexBlocked($player, $playerlock) ? "Let whoever is hiding in the walk-in fuck you" : "Duck into the walk-in with whoever is hiding from the count">>
<div class="btn"><<button _kitchenAnonLabel>>
<<set $prison.anonSceneToday = true>>
<<SpendTime 15>>
<<SetCharProgression $player "corruption" 1 true>>
<<set $prison.heat = Math.min(100, ($prison.heat || 0) + 4)>>
<<set _kg2 = ($prison.block is "F") ? "Female" : "Male">>
<<if not prisonPlayerActiveSexBlocked($player, $playerlock) and random(1, 100) lte 55>>
<<SetAnalPick $player.gender() _kg2>>
<<set $kitchenVideo = _pick>>
<<set $kitchenContent = { adult: true, partnerGender: _kg2, nonConsent: false }>>
<<set _kitchenTool = ($player.gender() is "Female") ? "a prison-made strap" : "your cock">>
<<set _kitchenCumHer = ($player.gender() is "Female") ? "You pin her to the steel, press the harness to your cunt, and rock yourself to orgasm with the strap still in her ass." : "You cum in her ass against the cold prep table.">>
<<set _kitchenCumHim = ($player.gender() is "Female") ? "You pin him to the steel, press the harness to your cunt, and rock yourself to orgasm with the strap still in his ass." : "You cum in his ass against the cold prep table.">>
<<if $prison.block is "F">>
<<set $kitchenMsg = "A woman is already hiding in the walk-in when you slip inside. She bends over the wire shelving and you push " + _kitchenTool + " into her ass while the compressor covers the noise. You fuck her until she cums with her face against the cold rack. " + _kitchenCumHer + " Fifteen minutes later you are both back at the steam tables, breathing hard and pretending you only came for stock.">>
<<else>>
<<set $kitchenMsg = "Someone is already in the walk-in dodging count. He sees you, glances at the door and turns toward the wire shelving. You push " + _kitchenTool + " into his ass and fuck him while the compressor covers the noise. " + _kitchenCumHim + " You are back at the steam tables before anyone clocks the empty spot.">>
<</if>>
<<else>>
<<SetAnalPick _kg2 $player.gender()>>
<<set $kitchenVideo = _pick>>
<<set $kitchenContent = { adult: true, partnerGender: _kg2, nonConsent: false }>>
<<if $prison.block is "F">>
<<set $kitchenMsg = "A woman is already hiding in the walk-in when you slip inside. She straps on, presses you against the cold shelving, and fucks your ass while the compressor covers the noise. You cum gripping the wire rack; she keeps grinding until she cums against the harness. Fifteen minutes later you are both back at the steam tables, flushed and pretending you only came for stock.">>
<<else>>
<<set $kitchenMsg = "You duck into the walk-in and find company with the same idea, and it is you braced on the cold shelving this time. He fucks your ass with the compressor roaring cover and both breaths fogging in the chill. You cum gripping the wire racks; he follows with his cock buried deep and cums inside you. You straighten your blues and walk back out into the steam warmer than the cooler left you.">>
<</if>>
<</if>>
<<goto "Prison_Kitchen">>
<</button>></div>
<<else>>
<div class="centre-text" style="font-size:13px;">You have taken your stolen minute in the blind spots today. The walk-in door only latches so many times before somebody counts the bodies.</div>
<</if>>
<</if>>
<div class="btn"><<button "Back to the chow hall" "Prison_Chow">><</button>></div>
</div>
</fieldset>
<<PrisonPeople>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<PrisonPendingMediaGuard "showerMsg" "showerVideo" "showerContent">>
<<SaveLocation>>
<<if $prison.block is "F">>
<<SetBackground "Media/Locations/Prison/showers_f.jpg">>
<<else>>
<<SetBackground "Media/Locations/Prison/showers_m.jpg">>
<</if>>
<div class="centre-text">Showers</div>
<div class="centre-text" style="font-size:14px;">Tile and steam, and nowhere to look that is not a risk. You keep your back to a wall. The COs run a rotation past the door, and everybody on the tier has learned the count of it - the blind minutes when the water is the only witness.</div>
<<if $showerMsg and $showerMsg isnot "">>
<<PrisonMediaProse $showerMsg $showerVideo>>
<<if $showerVideo and $showerVideo isnot "">><<Video $showerVideo>><<set $showerVideo = "">><</if>>
<<set $showerMsg = "">>
<<set $showerVideo = "">>
<<set $showerContent = null>>
<</if>>
<<set _shString = prisonFilterCompatible(claimedByPlayer($prisonRoster), $player)>>
<<set _shg = ($prison.block is "F") ? "Female" : "Male">>
<fieldset>
<legend>Showers</legend>
<div class="btn-container">
<<if $gameSettings.contentFilter.nonConsent === true and CheckContentFilter(_shg, _shg) and not $prison.voyeurToday>>
<div class="btn"><<button "Watch inmates fuck in the last shower stall">><<set $prison.sceneAuthority = { scene: "showerVoyeur", stintDay: getPrisonStintDay(), block: $prison.block }>><<goto "Prison_ShowerVoyeur">><</button>></div>
<</if>>
<<if $gameSettings.contentFilter.nonConsent === true and _shString.length > 0 and not $prison.usedStringToday and not prisonPlayerActiveSexBlocked($player, $playerlock)>>
<div class="btn"><<button "Fuck one of your claimed inmates against the wet tile">>
<<if prisonPlayerActiveSexBlocked($player, $playerlock)>>
<<set $showerMsg = "Your locked cock keeps you from fucking anyone in your string. You leave them alone under the spray.">>
<<goto "Prison_Showers">>
<<else>>
<<SpendTime 20>>
<<set _str2 = prisonFilterCompatible(claimedByPlayer($prisonRoster), $player)>>
<<set _t = _str2.random()>>
<<if _t>>
<<set $prison.usedStringToday = true>>
<<run useClaimedPunk(_t)>>
<<SetCharProgression $player "dominance" 2 true>>
<<set _domG = $player.gender()>>
<<set _subG = _t.gender>>
<<SetAnalPick _domG _subG>>
<<set $showerVideo = _pick>>
<<set $showerContent = { adult: true, partnerGender: _subG, nonConsent: true }>>
<<if _t.stats>><<set _t.stats.shame = Math.min(100, (_t.stats.shame || 0) + 3)>><</if>>
<<if _t.gender is "Female">>
<<set $showerMsg = "You walk " + _t.name + " into the corner spray and she goes where you put her. You buckle on a prison-made strap, bend her over under the hot water, and fuck her ass with one hand flat between her shoulders. You grind down on the harness until the base drags an orgasm out of you and you cum while everyone else washes fast and looks elsewhere. She stays under the spray until you wave her away.">>
<<elseif _t.gender is "Shemale">>
<<set $showerMsg = "You crook a finger and " + _t.name + " follows you under the far showerhead, blues left in a wet heap. You put her face to the tile and fuck her ass until you cum, her own cock stiff and ignored against the wall while the spray drums down. She takes every thrust and keeps her mouth shut, because being your punk is safer than being anyone's for free.">>
<<else>>
<<set $showerMsg = "You send " + _t.name + " to the corner showerhead and he goes without a word, because on this block he is yours and yours is the only address that keeps him whole. You bend him over the slick tile and fuck his ass until you cum under the hot water while the room finds other things to look at. He braces on the wall, marked as yours where anyone with eyes can see.">>
<</if>>
<</if>>
<<goto "Prison_Showers">>
<</if>>
<</button>></div>
<<elseif $gameSettings.contentFilter.nonConsent === true and _shString.length > 0>>
<div class="centre-text" style="font-size:13px;">You have worked your string once today. The tile will still be here tomorrow, and so will they.</div>
<</if>>
<<if $gameSettings.contentFilter.nonConsent === true and _shString.length > 0 and not $prison.usedStringToday and prisonPlayerActiveSexBlocked($player, $playerlock)>>
<div class="centre-text" style="font-size:13px;">You cannot top your claimed inmate with the cage on. Let the stranger below lead or leave the showers.</div>
<</if>>
<<if CheckContentFilter(_shg, $player) and not $prison.anonSceneToday>>
<div class="prison-actnote"><<if prisonPlayerActiveSexBlocked($player, $playerlock)>>The cage settles the role before you move: the stranger leads, or you walk away.<<else>>A stranger holds your gaze through the steam and nods toward the blind showerhead. Either of you may take the other against the tile; the moment decides who leads.<</if>></div>
<<set _showerAnonLabel = prisonPlayerActiveSexBlocked($player, $playerlock) ? "Let the stranger fuck you under the far showerhead" : "Take the stranger's invitation under the far showerhead">>
<div class="btn"><<button _showerAnonLabel>>
<<set $prison.anonSceneToday = true>>
<<SpendTime 20>>
<<SetCharProgression $player "corruption" 1 true>>
<<set $prison.heat = Math.min(100, ($prison.heat || 0) + 4)>>
<<set _shg2 = ($prison.block is "F") ? "Female" : "Male">>
<<if not prisonPlayerActiveSexBlocked($player, $playerlock) and random(1, 100) lte 55>>
<<SetAnalPick $player.gender() _shg2>>
<<set $showerVideo = _pick>>
<<set $showerContent = { adult: true, partnerGender: _shg2, nonConsent: false }>>
<<if $prison.block is "F">>
<<set $showerMsg = "She catches your eye through the steam and tips her head at the blind corner. You buckle on the prison-made strap from your kit, crowd her into the tile under the hot spray, and fuck her ass until she cums against the wall. You keep the strap seated in her and roll the base over your clit until you cum. You rinse beside her without speaking. She leaves first.">>
<<else>>
<<set $showerMsg = "He catches your eye through the steam and tips his head toward the blind corner where the count runs long. You put him against the wet tile and fuck his ass until you cum under the spray, fast and hard while the water covers the sound. He rinses himself off and goes back to the row without looking at you.">>
<</if>>
<<else>>
<<SetAnalPick _shg2 $player.gender()>>
<<set $showerVideo = _pick>>
<<set $showerContent = { adult: true, partnerGender: _shg2, nonConsent: false }>>
<<if $prison.block is "F">>
<<set $showerMsg = "She catches your look, takes you into the camera's blind corner, and straps on under the steam. You brace against the tile while she opens your ass with the strap and keeps at it until you cum on the wall. She pulls the buckles tighter, rocks the base over her cunt, and cums before sliding out. You rinse beside each other and leave by different doors.">>
<<else>>
<<set $showerMsg = "You follow his nod into the blind corner and brace on the slick tile while he fucks your ass under the spray. You cum against the wall; he keeps one hand on your hip, drives his cock deep, and cums inside you before the shower call ends. He rinses beside you without asking your name.">>
<</if>>
<</if>>
<<goto "Prison_Showers">>
<</button>></div>
<<elseif CheckContentFilter(_shg, $player)>>
<div class="centre-text" style="font-size:13px;">You have taken your stolen minute under the far showerhead today. The CO rotation only runs so long, and it has run out.</div>
<</if>>
<<if $gameSettings.contentFilter.nonConsent === true and $gameSettings.contentFilter.PlayerFeminization == true and not $prison.showerAmbushToday and not $prison.shotCaller and not $prison.protected and ($prison.rep || 0) lt 60 and CheckContentFilter(_shg, $player)>>
<div class="btn"><<button "You are alone under the spray, and you are not">><<set $prison.showerAmbushToday = true>><<set $prison.sceneAuthority = { scene: "showerAmbush", stintDay: getPrisonStintDay(), block: $prison.block }>><<goto "Prison_ShowerAmbush">><</button>></div>
<</if>>
</div>
</fieldset>
<<PrisonNav>>
<<PrisonPeople>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<PrisonPendingMediaGuard "showerMsg" "showerVideo" "showerContent">>
<<if $prison.block is "F">>
<<SetBackground "Media/Locations/Prison/showers_f.jpg">>
<<else>>
<<SetBackground "Media/Locations/Prison/showers_m.jpg">>
<</if>>
<<set _ag = ($prison.block is "F") ? "Female" : "Male">>
<<set _showerAmbushAuthority = ($prison and $prison.sceneAuthority and $prison.sceneAuthority.scene is "showerAmbush" and $prison.sceneAuthority.stintDay is getPrisonStintDay() and $prison.sceneAuthority.block is $prison.block)>>
<<if $gameSettings.contentFilter.nonConsent === true and $gameSettings.contentFilter.PlayerFeminization == true and CheckContentFilter(_ag, $player)>>
<div class="centre-text">Under the Spray</div>
<<if $showerMsg and $showerMsg isnot "">>
<<PrisonMediaProse $showerMsg $showerVideo>>
<<if $showerVideo and $showerVideo isnot "">><<Video $showerVideo>><<set $showerVideo = "">><</if>>
<div class="btn padding-top"><<button "Wash off what you can and go">>
<<set $prison.sceneAuthority = null>>
<<set $showerMsg = "">>
<<set $showerVideo = "">>
<<set $showerContent = null>>
<<goto "Prison_Showers">>
<</button>></div>
<<elseif not _showerAmbushAuthority>>
<<if $prison>><<set $prison.sceneAuthority = null>><</if>>
<<goto "Prison_Showers">>
<<else>>
<<if $prison.block is "F">>
<div class="chat-container prison-prose"><p class="text">The room empties on the CO count and one big woman does not leave with it. She steps into your blind side under the spray, close enough that the water runs off her onto you. <span class='dialogue-speech'>"Nobody hears nothing in here over the pipes, boot. Been waiting on a minute like this since they bused you in."</span></p></div>
<<else>>
<div class="chat-container prison-prose"><p class="text">The room thins out on the CO count and a wolf you have seen tracking you stays behind, stepping into your blind side where the spray drums loudest. <span class='dialogue-speech'>"Nothing carries in here over the water, boot. Just you and me and the drain. You have been walking around owing this since the bus."</span></p></div>
<</if>>
<div class="btn-container">
<div class="btn"><<button "Fight them off wet and naked">>
<<set $prison.sceneAuthority = null>>
<<set _ag = ($prison.block is "F") ? "Female" : "Male">>
<<set _str = $player.attributes.strength.value>>
<<set _edge = 0>>
<<if $prison.gang and hasGangBackup($prisonRoster, $prison.gang)>><<set _edge = _edge + 10>><</if>>
<<if random(1, 100) lte (18 + _str * 6 + _edge)>>
<<SetCharProgression $player "dominance" 3 true>>
<<set $prison.rep = Math.min(100, ($prison.rep || 0) + 5)>>
<<set $showerVideo = "">>
<<set $showerContent = null>>
<<set $showerMsg = "Wet and bare and cornered, you drive an elbow into their throat before they get a grip on the slick tile. They hit the drain hard. Before they are back on their feet, the story already has you fighting five inmates with one hand. You let that version travel.">>
<<else>>
<<set _pgBefore = $player.gender()>>
<<SetAnalPick _ag _pgBefore>>
<<set $showerVideo = _pick>>
<<set $showerContent = { adult: true, partnerGender: _ag, nonConsent: true, playerFeminization: true }>>
<<PrisonCoerceBody>>
<<set $prison.rep = Math.max(0, ($prison.rep || 0) - 9)>>
<<run unlockPrisonAchievement('toppedByBlock')>>
<<if $prison.block is "F">>
<<set $showerMsg = "You swing, your heel skids, and the first punch never lands. She pins you to the wet wall with a forearm across the back of your neck, straps a prison-made cock on and drives it into your ass until you cum under the spray. She rubs herself against the base until she cums, then leaves you sitting in the runoff by the drain. Two women at the sinks stop talking when you look up.">>
<<else>>
<<set $showerMsg = "You swing, your heel skids, and the first punch never lands. He pins you to the wet wall with a forearm across the back of your neck, forces himself into your ass and works it under the spray until he cums inside you. He leaves you sitting in the runoff by the drain. At chow, the two men behind you stop talking when you look back.">>
<</if>>
<</if>>
<<goto "Prison_ShowerAmbush">>
<</button>></div>
<div class="btn"><<button "Do not fight it">>
<<set $prison.sceneAuthority = null>>
<<set _ag = ($prison.block is "F") ? "Female" : "Male">>
<<set _pgBefore = $player.gender()>>
<<SetAnalPick _ag _pgBefore>>
<<set $showerVideo = _pick>>
<<set $showerContent = { adult: true, partnerGender: _ag, nonConsent: true, playerFeminization: true }>>
<<PrisonCoerceBody>>
<<set $prison.rep = Math.max(0, ($prison.rep || 0) - 11)>>
<<run unlockPrisonAchievement('toppedByBlock')>>
<<if $prison.block is "F">>
<<set $showerMsg = "You stop fighting because wet and naked with your back to the tile there is no fight to win. You brace on the slick wall while she gets a prison-made strap buckled on and shoves it into you. The forced rhythm brings you to orgasm under the hot spray. She keeps the strap in you and rides the base against her clit until she cums. When she leaves, you sit in the runoff while someone outside repeats her name and laughs.">>
<<else>>
<<set $showerMsg = "You stop fighting because wet and naked with your back to the tile there is no fight to win. You brace on the slick wall while he shoves into your ass and takes you under the hot spray until he cums inside you. When he leaves, you sit in the runoff letting the water take what it can, already knowing the block will have the story before you are dry.">>
<</if>>
<<goto "Prison_ShowerAmbush">>
<</button>></div>
</div>
<</if>>
<<else>>
<<if $prison>><<set $prison.sceneAuthority = null>><</if>>
<<set $showerMsg = "">><<set $showerVideo = "">><<set $showerContent = null>>
<<goto "Prison_Showers">>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<PrisonPendingMediaGuard "showerVoyeurMsg" "showerVoyeurVideo" "showerVoyeurContent">>
<<set _g = ($prison.block is "F") ? "Female" : "Male">>
<<set _showerVoyeurAuthority = ($prison and $prison.sceneAuthority and $prison.sceneAuthority.scene is "showerVoyeur" and $prison.sceneAuthority.stintDay is getPrisonStintDay() and $prison.sceneAuthority.block is $prison.block)>>
<<if $gameSettings.contentFilter.nonConsent === true and CheckContentFilter(_g, _g) and not $prison.voyeurToday and _showerVoyeurAuthority>>
<<set $prison.sceneAuthority = null>>
<<set $prison.voyeurToday = true>>
<<if $prison.block is "F">>
<<SetBackground "Media/Locations/Prison/showers_f.jpg">>
<<else>>
<<SetBackground "Media/Locations/Prison/showers_m.jpg">>
<</if>>
<<SpendTime 20>>
<<SetCharProgression $player "corruption" 1 true>>
<<if random(1, 100) lte 55>>
<<if $prison.block is "F">><<SetVagPick _g "Female">><<else>><<SetAnalPick _g _g>><</if>>
<<set $showerVoyeurVideo = _pick>>
<<set $showerVoyeurContent = { adult: true, observed: true, actorGender: _g, partnerGender: _g, nonConsent: true }>>
<<if $prison.block is "F">>
<<set $showerVoyeurMsg = ["Two women have found a blind spot behind the last stall. The first buckles on a prison-made strap, pushes the rubber cock into the second woman's cunt, and fucks her against the wet tile. The receiving woman cums around the strap. Her partner holds it deep and rolls the base over her clit until she cums too. You watch through the steam until the water runs cold.", "A tall woman has a new inmate pressed to the tile and a prison-made strap buried in the new inmate's cunt. She fucks the receiving woman with one hand over her mouth until the woman against the wall cums around the rubber cock. Then the woman wearing the harness pulls it tight and works herself to orgasm without taking the strap out. The rest of the room studies the drains. You watch.", "Two women have the corner shower and no shame about it. The first braces on the tile while the second straps on and fucks her cunt under the hot spray. Both women cum before they trade places and start again. The steam hides nothing. You do not look away.", "A hard-faced woman has a smaller woman bent under the spray, a rubber cock pushing deep into the smaller woman's cunt. She fucks the receiving woman until she cums braced on the tile, then leans over her and rubs the base against her own cunt until she finishes. Nobody else turns a head. You watch every second through the steam."].random()>>
<<else>>
<<set $showerVoyeurMsg = ["Two men have found the blind spot behind the last stall, one bent over the drain while the top fucks the bent man's ass until the receiving man cums against the tile. The top drives deep and cums inside the receiving man. Nobody looks. You look.", "A wolf has a fish pinned to the tile with a forearm across the fish's neck and fucks the fish's ass until the fish cums against the tile. The wolf then drives deep and cums inside the fish while the room agrees not to notice. You notice.", "A big man has another inmate bent over the bench in the back and fucks the inmate's ass until the receiving inmate cums gripping the wet steel. The big man cums inside the inmate while the water runs cold. Everyone finds somewhere else to put their eyes. You do not.", "A shot-caller has one of his punks bent under the last showerhead, a hand knotted in the punk's hair, fucking the punk's ass until the punk cums against the tile. The shot-caller drives deep and cums inside the punk. The room has agreed it is not happening. You watch it happen."].random()>>
<</if>>
<<else>>
<<set $showerVoyeurVideo = "">>
<<set $showerVoyeurContent = null>>
<<set $showerVoyeurMsg = ["Nothing but tile and cold water and inmates minding their own business today. You wash fast and get out.", "Just steam and hard looks. Whatever happens in here is not happening now, and you are glad to be gone."].random()>>
<</if>>
<div class="centre-text">Showers</div>
<<PrisonMediaProse $showerVoyeurMsg $showerVoyeurVideo>>
<<if $showerVoyeurVideo and $showerVoyeurVideo isnot "">><<Video $showerVoyeurVideo>><<set $showerVoyeurVideo = "">><</if>>
<div class="btn padding-top"><<button "Look away" "Prison_Showers">><<set $showerVoyeurMsg = "">><<set $showerVoyeurVideo = "">><<set $showerVoyeurContent = null>><</button>></div>
<<else>>
<<if $prison>><<set $prison.sceneAuthority = null>><</if>>
<<set $showerVoyeurMsg = "">><<set $showerVoyeurVideo = "">><<set $showerVoyeurContent = null>>
<<goto "Prison_Showers">>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/Prison/showers_m.jpg">>
<<set _pinkPath = String($questRoutePath || "")>>
<<set _pinkTico = getCastInmate("hustler")>>
<<set _pinkCutter = getCastInmate("wolf")>>
<<set _pinkTarget = getCastInmate("pink")>>
<<set _pinkActorsAdult = isAdultPrisonInmate(_pinkTico) and isAdultPrisonInmate(_pinkCutter) and isAdultPrisonInmate(_pinkTarget)>>
<<set _pinkRoute = ($prison and $prison.inside and $prison.block is "M" and $questRouteId is "pq_side_pink_dose" and ["subject", "handler", "observer"].includes(_pinkPath) and prisonQuestState("pq_side_pink_dose") is "active")>>
<<set _pinkAdultsAllowed = prisonAdultSceneAllowed()>>
<<set _pinkPairAllowed = CheckContentFilter("Male", "Female")>>
<<set _pinkBodyAllowed = $gameSettings.contentFilter.PlayerFeminization == true>>
<<set _pinkConsentAllowed = _pinkPath is "subject" or $gameSettings.contentFilter.nonConsent === true>>
<<set _pinkRoleAllowed = not (_pinkPath is "handler" and prisonPlayerActiveSexBlocked($player, $playerlock))>>
<<set _pinkContent = _pinkAdultsAllowed and _pinkPairAllowed and _pinkBodyAllowed and _pinkConsentAllowed and _pinkRoleAllowed>>
<<if _pinkRoute and _pinkContent and _pinkActorsAdult and not $prison.pinkDose>>
<<run beginPrisonPinkDose($prison, $player, _pinkTarget, _pinkPath)>>
<</if>>
<<set _pinkReady = _pinkRoute and _pinkContent and _pinkActorsAdult and prisonPinkDoseSceneReady($prison, $player, _pinkPath) and $prison.pinkDose.phase is 0>>
<<if not _pinkReady>>
<<run abortPrisonPinkDose($prison, $player)>>
<<set $questRouteId = "">><<set $questRoutePath = "">>
<<if _pinkPath is "handler" and prisonPlayerActiveSexBlocked($player, $playerlock)>>
<<set $activeQuestId = "pq_side_pink_dose">><<goto "Prison_Quest">>
<<else>>
<<goto "Prison_Block">>
<</if>>
<<else>>
<div class="centre-text">Pink Dose</div>
<<PrisonPortrait "hustler" "M" "prison-portrait--lg">>
<<if _pinkPath is "subject">>
<<PrisonProse "You strip in the last stall and sit on the wet bench. Tico crouches in front of you with the syringe. \"Don't tense up.\" The needle bites your thigh. Heat punches through your chest and belly before you can answer. Your pecs swell into heavy tits; your waist draws in as your hips push wide against the bench. Your cock pulls tight enough to hurt, sinks back and vanishes with your balls. The skin parts into a cunt already slick from whatever else Tico mixed in. Cutter lets out a low whistle. Tico drags two fingers through the wet folds, pushes them inside and grins when your knees twitch. \"Dose took.\" Cutter starts unbuttoning his blues.">>
<<elseif _pinkPath is "handler">>
<<PrisonProse "Noah sees the syringe and lunges for the door. You catch both wrists and wrench them behind his back. \"Hold him or get out,\" Tico says. Noah is still cursing when the needle hits his thigh. The words break into a gasp. Tits swell across his chest; his waist narrows and his ass rounds against your hips. His cock knots tight, retreats into his body and takes his balls with it. By the time a wet cunt opens between her thighs, Noah can only stare down at herself. Tico slips two fingers inside her to make sure the dose worked. Cutter throws the bolt. You and Tico strip.">>
<<else>>
<<PrisonProse "\"I'm not holding him,\" you tell Tico. He shrugs. \"Then stay out of the way.\" Cutter pins Noah against the tile while Tico sinks the needle into his thigh. You back into the corner and keep your hands folded. Noah's curses thin into ragged breaths as tits rise from his chest and his waist pulls inward. His ass fills out; his cock and balls shrink tight, then disappear. A cunt opens between her legs, wet before Tico ever puts two fingers inside it. Cutter keeps Noah pinned until Tico nods. Then both men strip. You stay where you are and watch.">>
<</if>>
<div class="btn padding-top"><<button "Continue">>
<<if advancePrisonPinkDose($prison, 0)>><<goto "Prison_PinkDose1">><<else>><<run abortPrisonPinkDose($prison, $player)>><<set $questRouteId = "">><<set $questRoutePath = "">><<goto "Prison_Block">><</if>>
<</button>></div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/Prison/showers_m.jpg">>
<<set _pinkPath = String($questRoutePath || "")>>
<<set _pinkLocationAllowed = $prison and $prison.inside and $prison.block is "M">>
<<set _pinkQuestAllowed = $questRouteId is "pq_side_pink_dose" and prisonQuestState("pq_side_pink_dose") is "active">>
<<set _pinkAdultsAllowed = prisonAdultSceneAllowed()>>
<<set _pinkPairAllowed = CheckContentFilter("Male", "Female")>>
<<set _pinkBodyAllowed = $gameSettings.contentFilter.PlayerFeminization == true>>
<<set _pinkConsentAllowed = _pinkPath is "subject" or $gameSettings.contentFilter.nonConsent === true>>
<<set _pinkStateAllowed = prisonPinkDoseSceneReady($prison, $player, _pinkPath) and $prison.pinkDose.phase is 1>>
<<set _pinkAllowed = _pinkLocationAllowed and _pinkQuestAllowed and _pinkAdultsAllowed and _pinkPairAllowed and _pinkBodyAllowed and _pinkConsentAllowed and _pinkStateAllowed>>
<<if not _pinkAllowed>>
<<run abortPrisonPinkDose($prison, $player)>><<set $questRouteId = "">><<set $questRoutePath = "">><<goto "Prison_Block">>
<<else>>
<<set _pinkVideo = prisonPinkDoseVideo(1)>>
<<if _pinkPath is "subject">>
<<set _pinkText = "Tico turns you toward the tile and presses between your shoulders until your hands hit the wet floor. His cock pushes into your cunt from behind. The new muscles clamp around him on the first stroke. Cutter steps in front, catches your jaw and works his cock past your lips. Tico pounds your cunt; every thrust drives your mouth farther down Cutter's cock.">>
<<set _pinkNext = "Hold on when they reposition you">>
<<elseif _pinkPath is "handler">>
<<set _pinkText = "You shove Noah down onto her hands and knees. Her cunt is already slick when you push inside, but she still cries out at the stretch. Tico plants himself in front of her and fists a hand in her hair. He feeds her his cock as you start fucking her from behind. Each snap of your hips sends her mouth down Tico's shaft.">>
<<set _pinkNext = "Turn Noah over">>
<<else>>
<<set _pinkText = "Tico kicks Noah's knees apart and forces her onto all fours. He pushes into her cunt from behind while Cutter takes a fistful of her hair and fills her mouth. Noah coughs around Cutter's cock whenever Tico drives forward. You watch from the door, close enough to hear her palms slide on the wet tile.">>
<<set _pinkNext = "Keep watching">>
<</if>>
<<PrisonMediaProse _pinkText _pinkVideo>><<Video _pinkVideo>>
<div class="btn padding-top"><<button _pinkNext>><<if advancePrisonPinkDose($prison, 1)>><<goto "Prison_PinkDose2">><<else>><<run abortPrisonPinkDose($prison, $player)>><<goto "Prison_Block">><</if>><</button>></div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/Prison/showers_m.jpg">>
<<set _pinkPath = String($questRoutePath || "")>>
<<set _pinkLocationAllowed = $prison and $prison.inside and $prison.block is "M">>
<<set _pinkQuestAllowed = $questRouteId is "pq_side_pink_dose" and prisonQuestState("pq_side_pink_dose") is "active">>
<<set _pinkAdultsAllowed = prisonAdultSceneAllowed()>>
<<set _pinkPairAllowed = CheckContentFilter("Male", "Female")>>
<<set _pinkBodyAllowed = $gameSettings.contentFilter.PlayerFeminization == true>>
<<set _pinkConsentAllowed = _pinkPath is "subject" or $gameSettings.contentFilter.nonConsent === true>>
<<set _pinkStateAllowed = prisonPinkDoseSceneReady($prison, $player, _pinkPath) and $prison.pinkDose.phase is 2>>
<<set _pinkAllowed = _pinkLocationAllowed and _pinkQuestAllowed and _pinkAdultsAllowed and _pinkPairAllowed and _pinkBodyAllowed and _pinkConsentAllowed and _pinkStateAllowed>>
<<if not _pinkAllowed>>
<<run abortPrisonPinkDose($prison, $player)>><<set $questRouteId = "">><<set $questRoutePath = "">><<goto "Prison_Block">>
<<else>>
<<set _pinkVideo = prisonPinkDoseVideo(2)>>
<<if _pinkPath is "subject">>
<<set _pinkText = "Tico drops onto his back and pulls you across his hips. You sink onto him, your cunt stretching around his cock until your thighs meet his. Cutter kneels behind you. He spits between your ass cheeks, works the head in and leans his weight forward. Trapped between them, you rise and fall on Tico while Cutter drives into your ass from behind.">>
<<set _pinkNext = "Brace yourself when they switch">>
<<elseif _pinkPath is "handler">>
<<set _pinkText = "You lie back on the wet floor and drag Noah over your hips. Her cunt stretches as you pull her down your cock. Tico settles behind her, spits on her ass and presses in beside you. Noah's body jerks between both of you. You thrust up into her cunt while Tico fucks her ass.">>
<<set _pinkNext = "Trade places with Tico">>
<<else>>
<<set _pinkText = "Tico lies back and drags Noah down across his hips. Her cunt stretches around his cock. Cutter kneels behind her, spits between her ass cheeks and forces the head inside. Noah shakes between them as Tico thrusts up into her cunt and Cutter works deeper into her ass. You do not move from the door.">>
<<set _pinkNext = "Watch them trade places">>
<</if>>
<<PrisonMediaProse _pinkText _pinkVideo>><<Video _pinkVideo>>
<div class="btn padding-top"><<button _pinkNext>><<if advancePrisonPinkDose($prison, 2)>><<goto "Prison_PinkDose3">><<else>><<run abortPrisonPinkDose($prison, $player)>><<goto "Prison_Block">><</if>><</button>></div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/Prison/showers_m.jpg">>
<<set _pinkPath = String($questRoutePath || "")>>
<<set _pinkLocationAllowed = $prison and $prison.inside and $prison.block is "M">>
<<set _pinkQuestAllowed = $questRouteId is "pq_side_pink_dose" and prisonQuestState("pq_side_pink_dose") is "active">>
<<set _pinkAdultsAllowed = prisonAdultSceneAllowed()>>
<<set _pinkPairAllowed = CheckContentFilter("Male", "Female")>>
<<set _pinkBodyAllowed = $gameSettings.contentFilter.PlayerFeminization == true>>
<<set _pinkConsentAllowed = _pinkPath is "subject" or $gameSettings.contentFilter.nonConsent === true>>
<<set _pinkStateAllowed = prisonPinkDoseSceneReady($prison, $player, _pinkPath) and $prison.pinkDose.phase is 3>>
<<set _pinkAllowed = _pinkLocationAllowed and _pinkQuestAllowed and _pinkAdultsAllowed and _pinkPairAllowed and _pinkBodyAllowed and _pinkConsentAllowed and _pinkStateAllowed>>
<<if not _pinkAllowed>>
<<run abortPrisonPinkDose($prison, $player)>><<set $questRouteId = "">><<set $questRoutePath = "">><<goto "Prison_Block">>
<<else>>
<<set _pinkVideo = prisonPinkDoseVideo(3)>>
<<if _pinkPath is "subject">>
<<set _pinkText = "Neither man gives you time to recover. Cutter takes Tico's place beneath you and pulls your cunt back down onto his cock. Tico moves behind, spreads your ass with both thumbs and pushes in where Cutter was. They find the same rhythm. Cutter thrusts up; Tico drives forward; your body has nowhere to go between them.">>
<<set _pinkNext = "Get down between them">>
<<elseif _pinkPath is "handler">>
<<set _pinkText = "You and Tico pull out and swap places. Tico rolls Noah onto his lap and fills her cunt from below. You spread her ass, line your cock up and push inside. She cannot twist away with Tico under her and you at her back. You fuck her ass in time with every thrust he puts into her cunt.">>
<<set _pinkNext = "Put Noah on her knees">>
<<else>>
<<set _pinkText = "Tico and Cutter pull out, trade places and drag Noah back between them. Cutter takes her cunt from below. Tico spreads her ass and forces his cock in from behind. Their hips strike her from opposite sides until the only sounds left are wet skin, the shower and Noah trying to breathe. You keep your hands to yourself.">>
<<set _pinkNext = "Watch Cutter force Noah down">>
<</if>>
<<PrisonMediaProse _pinkText _pinkVideo>><<Video _pinkVideo>>
<div class="btn padding-top"><<button _pinkNext>><<if advancePrisonPinkDose($prison, 3)>><<goto "Prison_PinkDose4">><<else>><<run abortPrisonPinkDose($prison, $player)>><<goto "Prison_Block">><</if>><</button>></div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/Prison/showers_m.jpg">>
<<set _pinkPath = String($questRoutePath || "")>>
<<set _pinkLocationAllowed = $prison and $prison.inside and $prison.block is "M">>
<<set _pinkQuestAllowed = $questRouteId is "pq_side_pink_dose" and prisonQuestState("pq_side_pink_dose") is "active">>
<<set _pinkAdultsAllowed = prisonAdultSceneAllowed()>>
<<set _pinkPairAllowed = CheckContentFilter("Male", "Female")>>
<<set _pinkBodyAllowed = $gameSettings.contentFilter.PlayerFeminization == true>>
<<set _pinkConsentAllowed = _pinkPath is "subject" or $gameSettings.contentFilter.nonConsent === true>>
<<set _pinkStateAllowed = prisonPinkDoseSceneReady($prison, $player, _pinkPath) and $prison.pinkDose.phase is 4>>
<<set _pinkAllowed = _pinkLocationAllowed and _pinkQuestAllowed and _pinkAdultsAllowed and _pinkPairAllowed and _pinkBodyAllowed and _pinkConsentAllowed and _pinkStateAllowed>>
<<if not _pinkAllowed>>
<<run abortPrisonPinkDose($prison, $player)>><<set $questRouteId = "">><<set $questRoutePath = "">><<goto "Prison_Block">>
<<else>>
<<set _pinkVideo = prisonPinkDoseVideo(4)>>
<<if _pinkPath is "subject">>
<<set _pinkText = "They pull you onto your knees. Cutter puts his cock in your hand; Tico taps his against your lips. You open. He pushes past your tongue and starts using your throat while your fist works Cutter from base to head. Tico holds you there when he cums. You swallow around him without letting go of Cutter.">>
<<set _pinkNext = "Take Cutter next">>
<<elseif _pinkPath is "handler">>
<<set _pinkText = "You pull Noah onto her knees between you and Tico. He closes her hand around his cock. You push yours between her lips and fuck her mouth while she strokes him. When you cum, you keep her head still until she swallows. Her hand never stops moving on Tico.">>
<<set _pinkNext = "Let Noah change mouths">>
<<else>>
<<set _pinkText = "Cutter drags Noah onto her knees between them and wraps her fingers around his cock. Tico pushes into her mouth. He fucks her throat until he cums, one hand locked behind her head. Noah swallows and keeps stroking Cutter. You can see her jaw working from where you stand.">>
<<set _pinkNext = "Watch them swap">>
<</if>>
<<PrisonMediaProse _pinkText _pinkVideo>><<Video _pinkVideo>>
<div class="btn padding-top"><<button _pinkNext>><<if advancePrisonPinkDose($prison, 4)>><<goto "Prison_PinkDose5">><<else>><<run abortPrisonPinkDose($prison, $player)>><<goto "Prison_Block">><</if>><</button>></div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/Prison/showers_m.jpg">>
<<set _pinkPath = String($questRoutePath || "")>>
<<set _pinkLocationAllowed = $prison and $prison.inside and $prison.block is "M">>
<<set _pinkQuestAllowed = $questRouteId is "pq_side_pink_dose" and prisonQuestState("pq_side_pink_dose") is "active">>
<<set _pinkAdultsAllowed = prisonAdultSceneAllowed()>>
<<set _pinkPairAllowed = CheckContentFilter("Male", "Female")>>
<<set _pinkBodyAllowed = $gameSettings.contentFilter.PlayerFeminization == true>>
<<set _pinkConsentAllowed = _pinkPath is "subject" or $gameSettings.contentFilter.nonConsent === true>>
<<set _pinkStateAllowed = prisonPinkDoseSceneReady($prison, $player, _pinkPath) and $prison.pinkDose.phase is 5>>
<<set _pinkAllowed = _pinkLocationAllowed and _pinkQuestAllowed and _pinkAdultsAllowed and _pinkPairAllowed and _pinkBodyAllowed and _pinkConsentAllowed and _pinkStateAllowed>>
<<if not _pinkAllowed>>
<<run abortPrisonPinkDose($prison, $player)>><<set $questRouteId = "">><<set $questRoutePath = "">><<goto "Prison_Block">>
<<else>>
<<set _pinkVideo = prisonPinkDoseVideo(5)>>
<<if _pinkPath is "subject">>
<<set _pinkText = "Tico slips out of your mouth. You keep stroking his wet, half-spent cock while Cutter takes your chin and replaces him. Cutter sets the pace himself, pushing against the back of your throat until his grip tightens. He cums in your mouth. You swallow the second load with Tico still twitching in your fist.">>
<<set _pinkNext = "Feel the dose give out">>
<<elseif _pinkPath is "handler">>
<<set _pinkText = "You pull out of Noah's mouth, but leave her hand wrapped around your wet cock. Tico replaces you between her lips. He holds her by the hair and thrusts until he cums. Noah swallows again while her fist keeps moving on you, slower now, waiting for one of you to tell her she can stop.">>
<<set _pinkNext = "Watch the dose give out">>
<<else>>
<<set _pinkText = "Tico pulls out and leaves Noah's hand around his wet cock. Cutter takes his place in her mouth. He grips the back of her head and thrusts until he cums. Noah swallows the second load. Her hand keeps sliding over Tico because neither man has told her to stop. You watch all of it from the door.">>
<<set _pinkNext = "Watch the dose give out">>
<</if>>
<<PrisonMediaProse _pinkText _pinkVideo>><<Video _pinkVideo>>
<div class="btn padding-top"><<button _pinkNext>><<goto "Prison_PinkDoseRestore">><</button>></div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/Prison/showers_m.jpg">>
<<set _pinkPath = String($questRoutePath || "")>>
<<set _pinkFinish = finishPrisonPinkDose($prison, $player)>>
<<if not _pinkFinish or _pinkFinish.path isnot _pinkPath>>
<<run abortPrisonPinkDose($prison, $player)>><<set $questRouteId = "">><<set $questRoutePath = "">><<goto "Prison_Block">>
<<else>>
<<SpendTime 35>>
<<if _pinkPath is "subject">>
<<SetCharProgression $player "corruption" 4 true>>
<<set _pinkRestoreText = "Cutter has barely pulled out when a cramp folds you against the tile. The dose is already quitting. Your tits flatten under your palms; your waist thickens and your hips pull narrow. The cunt between your legs clenches empty, seals and bulges. Your cock forces its way back out, followed a heartbeat later by your balls. By the time Tico shuts off the water, you are completely male again. Cutter laughs once. \"Thirty-five minutes.\" You spit into the drain, tasting both men, and reach for your blues.">>
<<elseif _pinkPath is "handler">>
<<SetCharProgression $player "corruption" 5 true>><<SetCharProgression $player "dominance" 3 true>>
<<set _pinkRestoreText = "Tico pulls out. Noah coughs once, then doubles over as the change breaks. Her tits collapse flat; her waist thickens and her hips draw in. The cunt between her legs clenches shut. Noah's cock pushes back through the sealed flesh and his balls drop beneath it. Seconds later he is completely male again, the same man you dragged into the stall, naked on his knees with your cum and Tico's still in his mouth. He looks down at himself, then up at the three of you. \"I'm going to fucking kill you.\" Cutter waits until everybody is dressed before he unlocks the door.">>
<<else>>
<<SetCharProgression $player "corruption" 2 true>>
<<set _pinkRestoreText = "Cutter pulls out. Noah coughs, curls over his stomach and starts changing back before Cutter has finished buttoning his blues. Her tits flatten; her waist thickens and her hips narrow. The cunt between her legs seals as Noah's cock and balls force their way back into place. Within seconds he is male again, naked on the tile with both men's cum still in his mouth. His eyes find you by the door. \"You could've opened it.\" You stayed for the injection, the fucking and the reversal. Cutter slides the bolt open.">>
<</if>>
<<set _pinkOutcome = finalizePrisonQuestRoute($questRouteId, _pinkPath, "pinkDose")>>
<<set $questRouteId = "">><<set $questRoutePath = "">><<set $activeQuestId = "">>
<<PrisonProse _pinkRestoreText>>
<<if not _pinkOutcome or not _pinkOutcome.completed>><div class="prison-actnote">The body was restored, but the quest reward was rejected by the live content or route gate.</div><</if>>
<div class="btn padding-top"><<button "Leave the showers" "Prison_Showers">><</button>></div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<PrisonPendingMediaGuard "recMsg" "recVideo" "recContent">>
<<SaveLocation>>
<<if $prison.block is "F">>
<<SetBackground "Media/Locations/Prison/block_f_dayroom.jpg">>
<<else>>
<<SetBackground "Media/Locations/Prison/block_m_dayroom.jpg">>
<</if>>
<div class="centre-text">The Rec Room</div>
<div class="centre-text" style="font-size:14px;">Rows of bolted-down benches face one wall-caged TV. On movie nights the COs watch the door while inmates fuck under shared blankets, using the soundtrack to cover the noise. Everybody else keeps their eyes on the screen.</div>
<<if $recMsg and $recMsg isnot "">>
<<PrisonMediaProse $recMsg $recVideo>>
<<if $recVideo and $recVideo isnot "">><<Video $recVideo>><<set $recVideo = "">><</if>>
<<set $recMsg = "">>
<<set $recVideo = "">>
<<set $recContent = null>>
<</if>>
<<set _rString = prisonFilterCompatible(claimedByPlayer($prisonRoster), $player)>>
<<set _rg = ($prison.block is "F") ? "Female" : "Male">>
<fieldset>
<legend>Movie Night</legend>
<div class="btn-container">
<<if $gameSettings.contentFilter.nonConsent === true and CheckContentFilter(_rg, _rg) and not $prison.voyeurToday>>
<div class="btn"><<button "Watch inmates fuck under the movie blankets">>
<<set $prison.voyeurToday = true>>
<<SpendTime 20>>
<<SetCharProgression $player "corruption" 1 true>>
<<if random(1, 100) lte 55>>
<<set _rg2 = ($prison.block is "F") ? "Female" : "Male">>
<<if $prison.block is "F">><<SetVagPick _rg2 "Female">><<else>><<SetAnalPick _rg2 _rg2>><</if>>
<<set $recVideo = _pick>>
<<set $recContent = { adult: true, observed: true, actorGender: _rg2, partnerGender: _rg2, nonConsent: true }>>
<<if $prison.block is "F">>
<<set $recMsg = ["Two rows up, a big woman has a smaller woman sideways across her lap under a shared blanket. A prison-made strap moves in the smaller woman's cunt until she cums biting the wool. The woman holding her tightens the harness and rocks the base over her clit until she finishes. The movie soundtrack covers both. You watch in the flicker off the screen.", "Blue light from the TV catches a woman bent over the back-row bench under a draped blanket. Another inmate straps on and fucks the receiving woman's cunt until she cums, then presses the base between her own legs and shudders against her back. The row shifts to hide them whenever a CO crosses the door."].random()>>
<<else>>
<<set $recMsg = ["Two rows up, a wolf has a punk pulled into the wolf's lap under a draped blanket and fucks the punk's ass in a slow rhythm that has nothing to do with the movie. The punk cums gripping the bench; the wolf drives deep and cums inside the punk. Everyone watches the screen. You watch the dark.", "The blue flicker off the TV catches a man bent over the back-row bench under a shared blanket while another inmate fucks the bent man's ass. The man underneath cums into the blanket; the top drives deep and cums inside the receiving man while the block coughs over the sound. You take in every frame the screen is not showing."].random()>>
<</if>>
<<else>>
<<set $recVideo = "">>
<<set $recContent = null>>
<<set $recMsg = ["The movie is some cop picture the lifers have seen forty times. The room watches anyway. You sit in the dark for twenty quiet minutes.", "The projector flickers over a row of cons who know every line. For twenty minutes nobody reaches under the blankets or tests the new fish; you watch the movie and think about the street."].random()>>
<</if>>
<<goto "Prison_RecRoom">>
<</button>></div>
<</if>>
<<if CheckContentFilter(_rg, $player) and not $prison.anonSceneToday>>
<<set _recAnonLabel = prisonPlayerActiveSexBlocked($player, $playerlock) ? "Pleasure the stranger in the dark without using your cock" : "Have sex with the stranger in the dark">>
<div class="btn"><<button _recAnonLabel>>
<<set $prison.anonSceneToday = true>>
<<SpendTime 15>>
<<run unlockPrisonAchievement('movieNight')>>
<<SetCharProgression $player "corruption" 1 true>>
<<set $prison.heat = Math.min(100, ($prison.heat || 0) + 4)>>
<<set _rg2 = ($prison.block is "F") ? "Female" : "Male">>
<<if not prisonPlayerActiveSexBlocked($player, $playerlock) and random(1, 100) lte 50>>
<<SetOralPick $player.gender() _rg2>>
<<set $recVideo = _pick>>
<<set $recContent = { adult: true, partnerGender: _rg2, nonConsent: false }>>
<<if $prison.block is "F">>
<<set $recMsg = ["A hand settles on your thigh under the dark two minutes into the picture, and when you do not move it away it takes that for the answer it is. You never do get a good look at whose it is. She rubs your clit under the shared blanket while the movie flickers and the row stays carefully still, and you cum biting down on nothing with your eyes fixed on the screen like everyone else. The picture rolls on. Nobody ever says a word.", "Someone slides close in the dark and a mouth seals over your cunt under the draped blanket, unhurried, hidden by the flicker and the crowd. You keep your face to the screen while the stranger licks you until you cum before the reel changes. You never learn her name. At the next movie, you catch yourself looking for the same chipped nail polish."].random()>>
<<else>>
<<set $recMsg = ["A hand settles on your thigh under the shared blanket and you let it stay. You never see whose it is. He strokes your cock while the whole row faces the screen, and you cum into his fist with your jaw locked. The hand wipes itself on the blanket and disappears before the scene changes.", "A stranger ducks under the shared blanket and closes his mouth around your cock. You stare at the screen while he sucks you until you cum, then he slips back into the row without showing his face."].random()>>
<</if>>
<<else>>
<<set _rg3 = ($prison.block is "F") ? "Female" : "Male">>
<<SetOralPick _rg3 $player.gender()>>
<<set $recVideo = _pick>>
<<set $recContent = { adult: true, partnerGender: _rg3, nonConsent: false }>>
<<if $prison.block is "F">>
<<set $recMsg = "This time it is your hand that drifts, and the woman beside you in the dark leans into it instead of away. You rub her clit and finger her cunt under the blanket until she cums with her eyes screwed shut, the row around you a wall of studied indifference. She squeezes your wrist once in thanks and goes back to watching the movie like nothing happened.">>
<<else>>
<<set $recMsg = ["This time your own hand does the drifting, and the man beside you in the dark shifts to give it room instead of shrugging it off. You work him under the shared blanket with both your faces to the screen, and he cums into your fist with his breath held tight against the soundtrack. He knocks his knee against yours once, square, and you both go back to the movie. The dark forgets it immediately."].random()>>
<</if>>
<</if>>
<<goto "Prison_RecRoom">>
<</button>></div>
<<elseif CheckContentFilter(_rg, $player)>>
<div class="centre-text" style="font-size:13px;">You have taken the dark's offer once tonight. Reach for it again and the row stops pretending not to notice.</div>
<</if>>
<<if $gameSettings.contentFilter.nonConsent === true and _rString.length > 0 and not $prison.usedStringToday and not prisonPlayerActiveSexBlocked($player, $playerlock)>>
<div class="btn"><<button "Fuck one of your claimed inmates in the back row">>
<<if prisonPlayerActiveSexBlocked($player, $playerlock)>>
<<set $recMsg = "Your cock is locked, so you leave your claimed inmate alone and keep watching the movie.">>
<<goto "Prison_RecRoom">>
<<else>>
<<SpendTime 20>>
<<set _rs2 = prisonFilterCompatible(claimedByPlayer($prisonRoster), $player)>>
<<set _t = _rs2.random()>>
<<if _t>>
<<set $prison.usedStringToday = true>>
<<run useClaimedPunk(_t)>>
<<SetCharProgression $player "dominance" 2 true>>
<<set _domG = $player.gender()>>
<<set _subG = _t.gender>>
<<SetAnalPick _domG _subG>>
<<set $recVideo = _pick>>
<<set $recContent = { adult: true, partnerGender: _subG, nonConsent: true }>>
<<if _t.gender is "Female">>
<<set $recMsg = _t.name + " sits where you put her, in the last row against the wall where the screen light does not reach, and slides into your lap under the blanket when the room goes dark. The strap is already buckled under your blues. You fuck her ass through the second act with one hand over her mouth, then ride the base against your cunt until you cum. When the lights rise, she stays seated until you tap her shoulder.">>
<<elseif _t.gender is "Shemale">>
<<set $recMsg = _t.name + " takes the seat you point her to in the black of the back row and folds into your lap when the lights die, quiet and practiced. You fuck her ass under the draped blanket until you cum, her own cock stiff and ignored, while the men around you watch the movie and grant the dark its privacy. She is your punk, and the back row is one more place she knows to be it.">>
<<else>>
<<set $recMsg = _t.name + " sits where you tell him, last row, wall side, past where the TV light falls, and folds down into your lap under the blanket when the room goes black. You fuck his ass slowly until you cum under the blanket with a hand clamped over his mouth, while the tier a foot off keeps its eyes on the screen. On this block he is yours, and movie night is one more place where he answers for it.">>
<</if>>
<</if>>
<<goto "Prison_RecRoom">>
<</if>>
<</button>></div>
<<elseif $gameSettings.contentFilter.nonConsent === true and _rString.length > 0>>
<div class="centre-text" style="font-size:13px;">You have worked your string once today. The back row keeps its dark for tomorrow.</div>
<</if>>
<<if $gameSettings.contentFilter.nonConsent === true and _rString.length > 0 and not $prison.usedStringToday and prisonPlayerActiveSexBlocked($player, $playerlock)>>
<div class="centre-text" style="font-size:13px;">You cannot fuck anyone from your string while caged. Use the passive stranger option or watch the movie.</div>
<</if>>
<<if $gameSettings.contentFilter.nonConsent === true and $gameSettings.contentFilter.PlayerFeminization == true and not $prison.recRoomToday and not $prison.shotCaller and not $prison.protected and ($prison.rep || 0) lt 60 and CheckContentFilter(_rg, $player)>>
<div class="btn"><<button "Risk the back row where inmates intend to fuck you">><<set $prison.recRoomToday = true>><<set $prison.sceneAuthority = { scene: "recRoomCornered", stintDay: getPrisonStintDay(), block: $prison.block }>><<goto "Prison_RecRoomCornered">><</button>></div>
<</if>>
</div>
</fieldset>
<fieldset>
<legend>Recreation</legend>
<div class="centre-text" style="font-size:13px;">Not everything in the rec room happens in the dark. Some hours you just do the time - a bad movie and a little quiet that costs nothing.</div>
<div class="btn-container">
<<if not $prison.tvUnwindToday>>
<div class="btn"><<button "Zone out in front of the TV for a while">>
<<set $recVideo = "">>
<<set $recContent = null>>
<<set $prison.tvUnwindToday = true>>
<<SpendTime 45>>
<<run $player.status.energy.increase(12)>>
<<set $prison.heat = Math.max(0, ($prison.heat || 0) - 4)>>
<<set $recMsg = ["You claim a bolted bench and watch a rerun the lifers know by heart. For forty-five minutes you are not counting days or checking who is behind you.", "You sit through a bad picture with your mind somewhere past the wall. Nobody hustles you or tests you. When the credits roll, your jaw has finally unclenched.", "You put your feet on the bench ahead and let the flicker occupy your head. Forty-five quiet minutes pass before the lights come up."].random()>>
<<goto "Prison_RecRoom">>
<</button>></div>
<<else>>
<div class="centre-text" style="font-size:13px;">You have taken your forty-five minutes in front of the box today. It will be droning the same reruns tomorrow.</div>
<</if>>
</div>
</fieldset>
<<PrisonNav>>
<<PrisonPeople>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<PrisonPendingMediaGuard "recMsg" "recVideo" "recContent">>
<<if $prison.block is "F">>
<<SetBackground "Media/Locations/Prison/block_f_dayroom.jpg">>
<<else>>
<<SetBackground "Media/Locations/Prison/block_m_dayroom.jpg">>
<</if>>
<<set _ag = ($prison.block is "F") ? "Female" : "Male">>
<<set _recCornerAuthority = ($prison and $prison.sceneAuthority and $prison.sceneAuthority.scene is "recRoomCornered" and $prison.sceneAuthority.stintDay is getPrisonStintDay() and $prison.sceneAuthority.block is $prison.block)>>
<<if $gameSettings.contentFilter.nonConsent === true and $gameSettings.contentFilter.PlayerFeminization == true and CheckContentFilter(_ag, $player)>>
<div class="centre-text">The Back Row</div>
<<if $recMsg and $recMsg isnot "">>
<<PrisonMediaProse $recMsg $recVideo>>
<<if $recVideo and $recVideo isnot "">><<Video $recVideo>><<set $recVideo = "">><</if>>
<div class="btn padding-top"><<button "Slip out when the lights come up">>
<<set $prison.sceneAuthority = null>>
<<set $recMsg = "">>
<<set $recVideo = "">>
<<set $recContent = null>>
<<goto "Prison_RecRoom">>
<</button>></div>
<<elseif not _recCornerAuthority>>
<<if $prison>><<set $prison.sceneAuthority = null>><</if>>
<<goto "Prison_RecRoom">>
<<else>>
<<if $prison.block is "F">>
<div class="chat-container prison-prose"><p class="text">You realize a beat too late that you let yourself get seated in the back corner, and now there are bodies on both sides and one behind, and the dark that hides everyone hides this too. <span class='dialogue-speech'>"Sit still and watch your movie, boot,"</span> one breathes against your ear. <span class='dialogue-speech'>"Ain't nobody in this room gonna turn around."</span></p></div>
<<else>>
<div class="chat-container prison-prose"><p class="text">You notice too late that bodies have boxed you into the back corner. One man is behind you; another pins your knee with his. <span class='dialogue-speech'>"Eyes on the screen, boot,"</span> someone says against your ear. <span class='dialogue-speech'>"Nobody turns around."</span></p></div>
<</if>>
<div class="btn-container">
<div class="btn"><<button "Make a scene and blow it open">>
<<set $prison.sceneAuthority = null>>
<<set _ag = ($prison.block is "F") ? "Female" : "Male">>
<<set _dom = ($player.attributes.dominance ? $player.attributes.dominance.value : 5)>>
<<if random(1, 100) lte (28 + _dom * 6)>>
<<SetCharProgression $player "dominance" 2 true>>
<<set $prison.rep = Math.min(100, ($prison.rep || 0) + 4)>>
<<set $recVideo = "">>
<<set $recContent = null>>
<<set $prison.heat = Math.min(100, ($prison.heat || 0) + 5)>>
<<set $recMsg = "You come up loud, knock a bench sideways, and bark a challenge into the dark. A CO's flashlight swings in from the door. The hands vanish. You take the write-up for disrupting the movie. At the next screening, the seats on both sides of you stay empty.">>
<<else>>
<<set _pgBefore = $player.gender()>>
<<SetAnalPick _ag _pgBefore>>
<<set $recVideo = _pick>>
<<set $recContent = { adult: true, partnerGender: _ag, nonConsent: true, playerFeminization: true }>>
<<PrisonCoerceBody>>
<<set $prison.rep = Math.max(0, ($prison.rep || 0) - 10)>>
<<run unlockPrisonAchievement('toppedByBlock')>>
<<if $prison.block is "F">>
<<set $recMsg = "You start to come up and a heavy hand flattens you onto the bench, the noise dying under the movie soundtrack. One woman pins your arms while the other buries the strap in your ass and works it until you cum on the bench, then they trade places.\n\nThe second woman takes the harness, fucks your ass with it and rubs herself to orgasm against the base. When the lights come up, your open fly says everything, and your name is already on the move.">>
<<else>>
<<set $recMsg = "You start to come up and a heavy hand flattens you onto the bench, the noise dying under the movie soundtrack. One man pins your arms while the other pushes into your ass and works it until he cums, then they trade places. Every man in the room keeps his eyes forward.\n\nThe second man holds you down by the neck and fucks your ass until he cums deep in you. When the lights come up you are just another con filing out, but whispers are already moving ahead of you.">>
<</if>>
<</if>>
<<goto "Prison_RecRoomCornered">>
<</button>></div>
<div class="btn"><<button "Keep still and let them fuck you in the dark">>
<<set $prison.sceneAuthority = null>>
<<set _ag = ($prison.block is "F") ? "Female" : "Male">>
<<set _pgBefore = $player.gender()>>
<<SetAnalPick _ag _pgBefore>>
<<set $recVideo = _pick>>
<<set $recContent = { adult: true, partnerGender: _ag, nonConsent: true, playerFeminization: true }>>
<<PrisonCoerceBody>>
<<set $prison.rep = Math.max(0, ($prison.rep || 0) - 12)>>
<<run unlockPrisonAchievement('toppedByBlock')>>
<<if $prison.block is "F">>
<<set $recMsg = "You keep still because making it loud means the whole room turns and sees. Under the blanket, the first woman strap-fucks your ass and cums rubbing the base against herself, then passes the harness along.\n\nThe second woman straps it on and rides your ass until you cum. When the lights rise, you file out, and your cell number is already being whispered behind you.">>
<<else>>
<<set $recMsg = "You keep still because making it loud means the whole room turns and sees. Under the blanket, one man holds your wrists while the other pushes into your ass and fucks you until he cums deep, then they trade places.\n\nThe second man fucks your ass slow and deep under the blanket until he cums in you too. When the lights rise, you file out, and your cell number is already being whispered behind you.">>
<</if>>
<<goto "Prison_RecRoomCornered">>
<</button>></div>
</div>
<</if>>
<<else>>
<<if $prison>><<set $prison.sceneAuthority = null>><</if>>
<<set $recMsg = "">><<set $recVideo = "">><<set $recContent = null>>
<<goto "Prison_RecRoom">>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<PrisonPendingMediaGuard "laundryMsg" "laundryVideo" "laundryContent">>
<<SaveLocation>>
<<if $prison.block is "F">>
<<SetBackground "Media/Locations/Prison/workshop_f.jpg">>
<<else>>
<<SetBackground "Media/Locations/Prison/laundry_m.jpg">>
<</if>>
<div class="centre-text">The Laundry</div>
<div class="centre-text" style="font-size:14px;">Industrial machines throw off heat and noise while hanging sheets break the room into camera blinds. Contraband changes hands and inmates fuck behind the racks while the dryers swallow the sound.</div>
<<if $laundryMsg and $laundryMsg isnot "">>
<<PrisonMediaProse $laundryMsg $laundryVideo>>
<<if $laundryVideo and $laundryVideo isnot "">><<Video $laundryVideo>><<set $laundryVideo = "">><</if>>
<<set $laundryMsg = "">>
<<set $laundryVideo = "">>
<<set $laundryContent = null>>
<</if>>
<fieldset>
<legend>The back racks</legend>
<div class="btn-container">
<<set _g = ($prison.block is "F") ? "Female" : "Male">>
<<if $gameSettings.contentFilter.nonConsent === true and CheckContentFilter(_g, _g) and not $prison.voyeurToday>>
<div class="btn"><<button "Watch inmates fuck behind the laundry machines">>
<<set $prison.voyeurToday = true>>
<<SpendTime 15>>
<<SetCharProgression $player "corruption" 1 true>>
<<if random(1, 100) lte 55>>
<<if $prison.block is "F">><<SetVagPick _g "Female">><<else>><<SetAnalPick _g _g>><</if>>
<<set $laundryVideo = _pick>>
<<set $laundryContent = { adult: true, observed: true, actorGender: _g, partnerGender: _g, nonConsent: true }>>
<<if $prison.block is "F">>
<<set $laundryMsg = ["Two women have the far corner behind the dryers, one bent over the warm steel while the other pushes a prison-made strap into her cunt and fucks her from behind. The receiving woman cums around the rubber cock. Her partner keeps thrusting, pulling the harness tight over her clit until she cums too. The machines swallow every sound. You watch through a gap in the sheets.", "A hard-faced woman has another inmate pinned to the folding table and a prison-made strap buried in her cunt. The hard-faced woman fucks the receiving inmate until she cums against the warm steel, then holds her there and circles the base over her own cunt until her knees buckle. Nobody back here is folding. You keep your place at the rack and watch."].random()>>
<<else>>
<<set $laundryMsg = ["Two men have the far corner behind the dryers, one bent over the warm steel while the top fucks the bent man's ass slowly and the machines drown the sound. The receiving man cums first; the top drives deep and cums inside the receiving man. You watch through a gap in the hanging sheets.", "A wolf has one of the tier's punks bent over the folding table, fucking the punk's ass unhurried with a fistful of the inmate's collar. The punk cums against the warm steel; the wolf drives deep and cums inside the punk. The whole back of the room has agreed to see nothing. You see it through the sheets, and you do not look away."].random()>>
<</if>>
<<else>>
<<set $laundryVideo = "">>
<<set $laundryContent = null>>
<<set $laundryMsg = ["Nobody is having sex behind the machines today. You fold a shirt you do not own amid the heat and lint, then drift back out.", "Empty racks and steam. You linger a minute at the blind corner, but the only company is the smell of bleach. You move on."].random()>>
<</if>>
<<goto "Prison_Laundry">>
<</button>></div>
<</if>>
<<set _lg = ($prison.block is "F") ? "Female" : "Male">>
<<if CheckContentFilter(_lg, $player) and not $prison.anonSceneToday>>
<div class="prison-actnote"><<if prisonPlayerActiveSexBlocked($player, $playerlock)>>The cage settles the invitation: the stranger may fuck you against the warm steel, or you can walk away.<<else>>A hand parts the hanging sheets and beckons you into the dryer blind. The stranger may bend for you or turn you to the warm steel.<</if>></div>
<<set _laundryAnonLabel = prisonPlayerActiveSexBlocked($player, $playerlock) ? "Let the stranger fuck you behind the sheets" : "Accept the stranger's invitation behind the sheets">>
<div class="btn"><<button _laundryAnonLabel>>
<<set $prison.anonSceneToday = true>>
<<SpendTime 20>>
<<SetCharProgression $player "corruption" 1 true>>
<<set $prison.heat = Math.min(100, ($prison.heat || 0) + 4)>>
<<set _lg = ($prison.block is "F") ? "Female" : "Male">>
<<if not prisonPlayerActiveSexBlocked($player, $playerlock) and random(1, 100) lte 55>>
<<SetAnalPick $player.gender() _lg>>
<<set $laundryVideo = _pick>>
<<set $laundryContent = { adult: true, partnerGender: _lg, nonConsent: false }>>
<<if $prison.block is "F">>
<<set $laundryMsg = "A hand catches your wrist through the hanging sheets and a soft mouth finds you in the dark. The dryers drown her breathing and the cloth hides her face. You buckle on your prison-made strap and take her ass against the warm steel until she cums. You keep it in her and drag the base over your clit until you cum too. The sheets fall between you again before the aisle clears.">>
<<else>>
<<set $laundryMsg = "A hand reaches through the sheets and finds you. A warm mouth follows, then a body bends against the dryer in the dark. You fuck the stranger's ass against the warm steel until you cum, quick and hard. By the time you round the machines, only a swinging sheet marks where they stood.">>
<</if>>
<<else>>
<<SetAnalPick _lg $player.gender()>>
<<set $laundryVideo = _pick>>
<<set $laundryContent = { adult: true, partnerGender: _lg, nonConsent: false }>>
<<if $prison.block is "F">>
<<set $laundryMsg = "You let the hand pull you into the dark between the racks. A stranger you never see turns you to the warm steel and fucks you slowly with a strap. You cum against the machines with a fistful of somebody else's sheet in your mouth. When you turn around, the sheets are still moving and the aisle is empty.">>
<<else>>
<<set $laundryMsg = "You let the hand pull you behind the dryers. A stranger you never see bends you over the warm steel, gets into your ass in one shove and uses it until he cums in you. He leaves before you turn around; you pull up your blues and finish the load without learning his name.">>
<</if>>
<</if>>
<<goto "Prison_Laundry">>
<</button>></div>
<<elseif CheckContentFilter(_lg, $player)>>
<div class="centre-text" style="font-size:13px;">You have answered the sheets once today. The hands come again tomorrow - press it now and the wrong shift boss comes looking instead.</div>
<</if>>
<<set _ag = ($prison.block is "F") ? "Female" : "Male">>
<<if $gameSettings.contentFilter.nonConsent === true and $gameSettings.contentFilter.PlayerFeminization == true and not $prison.laundryAmbushToday and not $prison.shotCaller and not $prison.protected and ($prison.rep || 0) lt 60 and CheckContentFilter(_ag, $player)>>
<div class="btn"><<button "Risk the laundry blind where an inmate intends to fuck you">><<set $prison.laundryAmbushToday = true>><<set $prison.sceneAuthority = { scene: "laundryAmbush", stintDay: getPrisonStintDay(), block: $prison.block }>><<goto "Prison_LaundryAmbush">><</button>></div>
<</if>>
</div>
</fieldset>
<<PrisonNav>>
<<PrisonPeople>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<PrisonPendingMediaGuard "laundryMsg" "laundryVideo" "laundryContent">>
<<if $prison.block is "F">>
<<SetBackground "Media/Locations/Prison/workshop_f.jpg">>
<<else>>
<<SetBackground "Media/Locations/Prison/laundry_m.jpg">>
<</if>>
<<set _ag = ($prison.block is "F") ? "Female" : "Male">>
<<set _laundryAmbushAuthority = ($prison and $prison.sceneAuthority and $prison.sceneAuthority.scene is "laundryAmbush" and $prison.sceneAuthority.stintDay is getPrisonStintDay() and $prison.sceneAuthority.block is $prison.block)>>
<<if $gameSettings.contentFilter.nonConsent === true and $gameSettings.contentFilter.PlayerFeminization == true and CheckContentFilter(_ag, $player)>>
<div class="centre-text">Behind the Sheets</div>
<<if $laundryMsg and $laundryMsg isnot "">>
<<PrisonMediaProse $laundryMsg $laundryVideo>>
<<if $laundryVideo and $laundryVideo isnot "">><<Video $laundryVideo>><<set $laundryVideo = "">><</if>>
<div class="btn padding-top"><<button "Straighten your blues and go">>
<<set $prison.sceneAuthority = null>>
<<set $laundryMsg = "">>
<<set $laundryVideo = "">>
<<set $laundryContent = null>>
<<goto "Prison_Laundry">>
<</button>></div>
<<elseif not _laundryAmbushAuthority>>
<<if $prison>><<set $prison.sceneAuthority = null>><</if>>
<<goto "Prison_Laundry">>
<<else>>
<<if $prison.block is "F">>
<div class="chat-container prison-prose"><p class="text">A big woman off the far tier steps between you and the only way out, backing you into the racks where the machines drown everything. <span class='dialogue-speech'>"Been watching you come back here alone, boot. Figured it was time somebody showed you how it works."</span></p></div>
<<else>>
<div class="chat-container prison-prose"><p class="text">A wolf you have seen circling steps into the blind spot behind you, cutting off the racks, close enough to smell. <span class='dialogue-speech'>"Nobody comes back here alone by accident, boot. You have been asking for this since the bus. Let us not make it loud."</span></p></div>
<</if>>
<div class="btn-container">
<div class="btn"><<button "Fight your way clear">>
<<set $prison.sceneAuthority = null>>
<<set _ag = ($prison.block is "F") ? "Female" : "Male">>
<<set _str = $player.attributes.strength.value>>
<<set _edge = ($prison.hasShiv) ? 22 : 0>>
<<if $prison.gang and hasGangBackup($prisonRoster, $prison.gang)>><<set _edge = _edge + 12>><</if>>
<<if random(1, 100) lte (22 + _str * 6 + _edge)>>
<<SetCharProgression $player "dominance" 3 true>>
<<set $prison.rep = Math.min(100, ($prison.rep || 0) + 5)>>
<<set $laundryVideo = "">>
<<set $laundryContent = null>>
<<if $prison.hasShiv>><<set $prison.heat = Math.min(100, ($prison.heat || 0) + 6)>><</if>>
<<set $laundryMsg = "You get low and mean before the first hand lands, and back here in the noise nobody is coming to break it up either way. You leave them folded against a dryer holding a split lip, and walk out of the racks with your blues straight and your name a notch harder. The block hears you do not get cornered easy.">>
<<else>>
<<set _pgBefore = $player.gender()>>
<<SetAnalPick _ag _pgBefore>>
<<set $laundryVideo = _pick>>
<<set $laundryContent = { adult: true, partnerGender: _ag, nonConsent: true, playerFeminization: true }>>
<<PrisonCoerceBody>>
<<set $prison.rep = Math.max(0, ($prison.rep || 0) - 8)>>
<<run unlockPrisonAchievement('toppedByBlock')>>
<<if $prison.block is "F">>
<<set $laundryMsg = "You swing and it is not enough back here in the heat and noise. She gets you face-down over the warm steel, buckles the prison-made cock on and puts it in your ass, one hand between your shoulder blades, until you cum against the dryer. She pulls the harness tight and rubs herself to orgasm against the base, fixes your blues with a mocking pat, and melts into the racks. A face vanishes behind the sheet beside you.">>
<<else>>
<<set $laundryMsg = "You swing and it is not enough back here in the heat and noise. He gets you face down over the warm steel, puts a hand between your shoulder blades and takes your ass until he cums inside you. He fixes your blues for you with a mocking pat and melts back into the racks. The laundry saw, and the laundry talks.">>
<</if>>
<</if>>
<<goto "Prison_LaundryAmbush">>
<</button>></div>
<div class="btn"><<button "Stop fighting and let them fuck you">>
<<set $prison.sceneAuthority = null>>
<<set _ag = ($prison.block is "F") ? "Female" : "Male">>
<<set _pgBefore = $player.gender()>>
<<SetAnalPick _ag _pgBefore>>
<<set $laundryVideo = _pick>>
<<set $laundryContent = { adult: true, partnerGender: _ag, nonConsent: true, playerFeminization: true }>>
<<PrisonCoerceBody>>
<<set $prison.rep = Math.max(0, ($prison.rep || 0) - 10)>>
<<run unlockPrisonAchievement('toppedByBlock')>>
<<if $prison.block is "F">>
<<set $laundryMsg = "You stop fighting because back here in the noise there is no rescue. You brace on the warm steel while she straps a prison-made cock on and puts it in you, and the forced rhythm brings you off anyway. She holds the strap in you and rolls her cunt over the base until she cums, then disappears into the racks. You are still pulling up your blues when someone on the far side of the sheets laughs.">>
<<else>>
<<set $laundryMsg = "You stop fighting because back here in the noise there is no rescue. You brace on the warm steel while he gets his cock in you and rides your ass until he finishes, then disappears into the racks. You are still fixing your blues when someone on the far side of the sheets repeats his name and laughs.">>
<</if>>
<<goto "Prison_LaundryAmbush">>
<</button>></div>
</div>
<</if>>
<<else>>
<<if $prison>><<set $prison.sceneAuthority = null>><</if>>
<<set $laundryMsg = "">><<set $laundryVideo = "">><<set $laundryContent = null>>
<<goto "Prison_Laundry">>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<set _activeCrossVisit = ($prison and $prison.inside) ? getActiveCrossBlockVisit($prison, { day: getCurrentAbsoluteDay(), hour: $dateTime.hours, minute: $dateTime.minutes }) : null>>
<<if not $prison or not $prison.inside>>
<<goto "PoliceStation">>
<<elseif $prison.inPC>>
<<goto "Prison_Segregation">>
<<elseif _activeCrossVisit>>
<<goto "Prison_OtherBlock">>
<<else>>
<<set _other = ($prison.block is "F") ? "men's" : "women's">>
<<SetBackground "Media/Locations/Prison/vents.jpg">>
<div class="centre-text">The Crossing</div>
<div class="chat-container prison-prose"><p class="text">A guarded service corridor runs to the <<= _other>> block. Getting there is only the first leg: the guard charges again on the way home, and a stolen route can still end in two days in the hole.</p></div>
<<set _paylbl = "Pay a guard (" + CROSS_BLOCK_PAY_COST + " scrip this leg)">>
<<set _ductLbl = $prison.hasLockpick ? "Slip through the ductwork (stealth, lockpick in hand)" : "Slip through the ductwork (stealth)">>
<div class="btn-container">
<<if not $prison.crossBlockUsed>>
<<if $prison.hasLockpick>>
<div class="btn"><<button _ductLbl>><<set $prison.crossMethod = "stealth">><<set $prison.crossPickResult = "">><<goto "Prison_CrossPick">><</button>></div>
<<else>>
<div class="btn"><<button _ductLbl "Prison_CrossResolve">><<set $prison.crossMethod = "stealth">><</button>></div>
<</if>>
<<if canAfford(($prison.scrip || 0), CROSS_BLOCK_PAY_COST)>>
<div class="btn"><<button _paylbl>><<set $prison.crossMethod = "pay">><<goto "Prison_CrossResolve">><</button>></div>
<</if>>
<div class="btn"><<button "Trade a guard a name for passage (rat jacket)" "Prison_CrossResolve">><<set $prison.crossMethod = "name">><</button>></div>
<<else>>
<div class="chat-container prison-prose"><p class="text">You have already chanced the crossing once today. Push it again before the next count and you are asking for the hole.</p></div>
<</if>>
<div class="btn"><<button "Think better of it" "Prison_Block">><</button>></div>
</div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if not $prison or not $prison.inside>>
<<goto "PoliceStation">>
<<else>>
<<SetBackground "Media/Locations/Prison/vents.jpg">>
<div class="centre-text">The Maintenance Grille</div>
<div class="chat-container prison-prose"><p class="text">The grille is held by a service lock somebody upstairs has never once thought about. You have a pick, a corridor that stays empty for about ninety seconds at a time, and no way to explain yourself if this takes longer than that.</p></div>
<div id="prison-lockpick-root"></div>
<</if>>
<</nobr>>
<<done>>
<<if State.variables.prison && State.variables.prison.inside>>
<<run startLockpickMinigame(
"prison-lockpick-root",
State.variables.player.attributes.lockpick ? State.variables.player.attributes.lockpick.value : 3,
function () {
State.variables.prison.crossPickResult = "picked";
Engine.play("Prison_CrossResolve");
},
function () {
State.variables.prison.crossPickResult = "fumbled";
Engine.play("Prison_CrossResolve");
}
)>>
<</if>>
<</done>><<nobr>>
<<include "UpdateAll">>
<<set _crossResolveVisit = ($prison and $prison.inside) ? getActiveCrossBlockVisit($prison, { day: getCurrentAbsoluteDay(), hour: $dateTime.hours, minute: $dateTime.minutes }) : null>>
<<if not $prison or not $prison.inside>>
<<goto "PoliceStation">>
<<elseif $prison.inPC>>
<<goto "Prison_Segregation">>
<<elseif _crossResolveVisit>>
<<goto "Prison_OtherBlock">>
<<else>>
<<set _method = $prison.crossMethod>>
<<set _decision = null>>
<<if _method is "name">>
<<set _decision = copBribe({ corrupt: 55, greed: 50, lust: 35 }, "snitch", ($prison.heat || 0))>>
<<elseif _method is "stealth">>
<<set _dx = prisonStealthScore($prison, $player.attributes.dexterity.value)>>
/* A pick in hand is played, not assumed: a clean pick buys the quiet route,
a fumbled one leaves the grille rattling and costs more than carrying
nothing would have. */
<<if $prison.crossPickResult is "picked">><<set _dx = _dx + 5>>
<<elseif $prison.crossPickResult is "fumbled">><<set _dx = _dx - 3>>
<<elseif $prison.hasLockpick>><<set _dx = _dx + 3>><</if>>
<<set $prison.crossPickResult = "">>
<<set _r = resolvePursuit({ stealth: _dx, dexterity: _dx, wanted: ($prison.heat || 0) })>>
<<set _decision = _r.caught ? "caught" : "success">>
<</if>>
<<set _cross = resolveCrossBlockOutbound($prison, _method, { decision: _decision, day: getCurrentAbsoluteDay(), hour: $dateTime.hours, minute: $dateTime.minutes })>>
<<if _cross.time gt 0>><<SpendTime _cross.time>><</if>>
<<if _cross.rep>><<set $prison.rep = Math.max(0, Math.min(100, ($prison.rep || 0) + _cross.rep))>><</if>>
<<if _cross.heat>><<set $prison.heat = Math.max(0, Math.min(100, ($prison.heat || 0) + _cross.heat))>><</if>>
<<if _method is "name" and (_cross.outcome is "crossed" or _cross.outcome is "betrayed")>><<run addJacketMark('rat')>><</if>>
<<if _cross.outcome is "crossed">>
<<set $crossContent = { adult: false }>>
<<if _method is "pay">>
<<set $crossMsg = "The guard counts twelve scrip, palms the lot and cracks the service door. You have to turn sideways to slip through. Fifteen minutes later you are across; the return will cost the same.">>
<<elseif _method is "name">>
<<set $crossMsg = "You give the guard a name and enough detail to make it useful. The service door opens fifteen minutes later. Passage costs no scrip, but the rat jacket follows you onto the other tier.">>
<<else>>
<<set $crossMsg = "You ease the maintenance grille loose and crawl the duct until the voices belong to the other block. Twenty minutes gone, fresh heat on your back, and the same dangerous route still lies between you and home.">>
<</if>>
<<goto "Prison_OtherBlock">>
<<elseif _cross.outcome is "refused">>
<<SetBackground "Media/Locations/Prison/vents.jpg">>
<div class="centre-text">No Deal</div>
<div class="chat-container prison-prose"><p class="text">The guard listens, decides the name is not worth the risk, and leaves you standing in the service corridor. Five minutes are gone, your heat rises, and today's crossing attempt is spent.</p></div>
<div class="btn padding-top"><<button "Back to the block" "Prison_Block">><</button>></div>
<<elseif _cross.outcome is "betrayed" or _cross.outcome is "caught">>
<<run extendSentence(2)>>
<<SpendTime 2880>>
<<AdvancePrisonDays 2 true>>
<<run unlockPrisonAchievement('hole')>>
<<if _cross.outcome is "betrayed">>
<<set $workMsg = "The guard lets you finish giving up the name, then keys the radio. Two days in the hole pass before they walk you home. The rat jacket and the extra time both stay on your record.">>
<<else>>
<<set $workMsg = "A maintenance patrol opens the grille with you still inside it. Two days in the hole pass before they walk you home, with more heat and two more days left on the sentence.">>
<</if>>
<<goto "Prison_Block">>
<<else>>
<<SetBackground "Media/Locations/Prison/vents.jpg">>
<div class="centre-text">Route Closed</div>
<div class="chat-container prison-prose"><p class="text">The crossing cannot be made on those terms now. Nothing is charged and the daily attempt remains available.</p></div>
<div class="btn padding-top"><<button "Back to the crossing" "Prison_CrossBlock">><</button>></div>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<set _holeVisit = ($prison and $prison.inside) ? getActiveCrossBlockVisit($prison, { day: getCurrentAbsoluteDay(), hour: $dateTime.hours, minute: $dateTime.minutes }) : null>>
<<set _holeAuthority = ($prison and $prison.sceneAuthority and $prison.sceneAuthority.scene is "solitary" and $prison.sceneAuthority.stintDay is getPrisonStintDay())>>
<<if not $prison or not $prison.inside or $prison.inPC or _holeVisit>>
<<if $prison>><<set $prison.sceneAuthority = null>><</if>>
<<set $holeMsg = "">>
<<if not $prison or not $prison.inside>><<goto "PoliceStation">><<elseif $prison.inPC>><<goto "Prison_Segregation">><<else>><<goto "Prison_OtherBlock">><</if>>
<<else>>
<<SetBackground "Media/Locations/Prison/solitary.jpg">>
<div class="centre-text">The Hole</div>
<<if $holeMsg and $holeMsg isnot "">>
<<set $prison.sceneAuthority = null>>
<<PrisonProse $holeMsg>>
<div class="btn padding-top"><<button "They walk you back to the block">>
<<set $holeMsg = "">>
<<goto "Prison_Block">>
<</button>></div>
<<elseif not _holeAuthority>>
<<set $prison.sceneAuthority = null>>
<<goto "Prison_Block">>
<<else>>
<div class="chat-container prison-prose"><p class="text">The escort ends at a concrete box with a slot in the door and a bunk bolted to the wall. The steel shuts out the block. Two days go on your bid, and every guard on the tier has your face now.</p></div>
<fieldset>
<legend>Do the stretch</legend>
<div class="btn-container">
<div class="btn"><<button "Go grey and give the slot nothing">>
<<set $prison.sceneAuthority = null>>
<<run extendSentence(2)>>
<<SpendTime 2880>>
<<AdvancePrisonDays 2 true>>
<<set $prison.heat = Math.max(0, Math.min(100, ($prison.heat || 0) + 9))>>
<<run unlockPrisonAchievement('hole')>>
<<SetCharProgression $player "endurance" 3 true>>
<<set $holeMsg = [
"You do the box the way the old heads teach it: grey, small and silent. Give the eye at the slot nothing to write down. Sleep when you can, pace when you cannot. Two days later the steel rolls aside and you walk out hollow-eyed, stiff in the knees and still yourself.",
"You go still and quiet and let the isolation be what it is - no banging, no screaming, no show for the camera. You do your time in a concrete box one grey hour at a time. The COs lose interest when you give them nothing. You come out of it wrung thin but whole, and a shade further off their radar than you went in."
].random()>>
<<goto "Prison_Solitary">>
<</button>></div>
<div class="btn"><<button "Drill your body sharp against the walls">>
<<set $prison.sceneAuthority = null>>
<<run extendSentence(2)>>
<<SpendTime 2880>>
<<AdvancePrisonDays 2 true>>
<<set $prison.heat = Math.min(100, ($prison.heat || 0) + 15)>>
<<run unlockPrisonAchievement('hole')>>
<<SpendEnergy $player 15>>
<<SetCharProgression $player "strength" 2 true>>
<<SetCharProgression $player "endurance" 2 true>>
<<set $prison.rep = Math.min(100, ($prison.rep || 0) + 2)>>
<<set $holeMsg = [
"You turn the six-by-eight into a gym - pushups until your arms give, burpees on cold concrete, four steps to the door and four back. When you return to the block, your shirt pulls tighter across the shoulders. The first inmate who starts a joke thinks better of it.",
"You drill until the concrete is slick: pushups, squats, burpees, then back through. For two days you count sets instead of hours. When you return to the tier, your shirt sticks to new muscle and the wolves notice."
].random()>>
<<goto "Prison_Solitary">>
<</button>></div>
<div class="btn"><<button "Rage at the steel until your voice gives out">>
<<set $prison.sceneAuthority = null>>
<<run extendSentence(2)>>
<<SpendTime 2880>>
<<AdvancePrisonDays 2 true>>
<<set $prison.heat = Math.min(100, ($prison.heat || 0) + 23)>>
<<run unlockPrisonAchievement('hole')>>
<<set $prison.rep = Math.max(0, ($prison.rep || 0) - 3)>>
<<set $holeMsg = [
"The box gets to you, the way it is built to. You bang the steel until your hands split and scream at the slot until your voice tears to nothing, and the only answer the world gives back is a boot kicking the door and another line in your jacket. When they finally let you out you are raw and shaking, and the word that the hole broke you a little travels the tier faster than you do.",
"You lose it in the concrete dark - throw yourself at the door, howl at the camera, drag the bunk across the floor just to make a noise the silence cannot swallow. All it buys you is a cuff-and-strip extraction, a nurse's note, and a fatter file. The hole wins that round, and it makes sure the block hears that it did."
].random()>>
<<goto "Prison_Solitary">>
<</button>></div>
</div>
</fieldset>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _pcVisit = ($prison and $prison.inside) ? getActiveCrossBlockVisit($prison, { day: getCurrentAbsoluteDay(), hour: $dateTime.hours, minute: $dateTime.minutes }) : null>>
<<if not $prison or not $prison.inside>>
<<goto "PoliceStation">>
<<elseif $prison.inPC>>
<<goto "Prison_Segregation">>
<<elseif _pcVisit>>
<<goto "Prison_OtherBlock">>
<<else>>
<<SetBackground "Media/Locations/Prison/segregation.jpg">>
<div class="centre-text">Protective Custody</div>
<div class="chat-container prison-prose"><p class="text">You can walk up to any CO and say the words that end it: check into PC. A single cell on a quiet wing, no yard, no chow hall, no wolves in the dark. The block calls it hiding, and the block is not wrong - somebody who checks in has said out loud that they could not do the time alone. Your name on the tier does not survive it. But some nights, neither does somebody who stays.</p></div>
<<if $prison.gang>>
<div class="chat-container prison-prose"><p class="text">Running with <<= gangLabel($prison.gang)>> the way you do, checking in means walking away from the car for good. There is no version of PC the colors read as anything but a betrayal.</p></div>
<</if>>
<div class="btn-container">
<div class="btn"><<button "Check in and get behind the line">>
<<set _pcVisitNow = ($prison and $prison.inside) ? getActiveCrossBlockVisit($prison, { day: getCurrentAbsoluteDay(), hour: $dateTime.hours, minute: $dateTime.minutes }) : null>>
<<if $prison and $prison.inside and not $prison.inPC and not _pcVisitNow>>
<<set $prison.rep = Math.max(0, ($prison.rep || 0) - 15)>>
<</if>>
<<EnterProtectiveCustody>>
<</button>></div>
<div class="btn"><<button "Do your own time" "Prison_Block">><</button>></div>
</div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<if not $prison.inPC>>
<<goto "Prison_Block">>
<<else>>
<<SetBackground "Media/Locations/Prison/segregation.jpg">>
<<set _prog = getSentenceProgress()>>
<<set _canOut = canRelease()>>
<div class="centre-text">Protective Custody</div>
<div class="centre-text" style="font-size:18px;">Day <<= _prog.day>> / <<= _prog.total>> · <<= _prog.daysLeft>> days left</div>
<<if $segMsg and $segMsg isnot "">>
<<PrisonProse $segMsg>>
<<set $segMsg = "">>
<</if>>
<div class="chat-container prison-prose"><p class="text">A single cell on the quiet wing. The block cannot reach you here, and you cannot reach it. Meals arrive through a slot. The clock is loud enough to hear from the bunk.</p></div>
<fieldset>
<legend>Behind the line</legend>
<div class="btn-container">
<<if _canOut>>
<div class="btn"><<button "Walk out - your time is served" "Prison_Release">><</button>></div>
<<else>>
<div class="btn"><<button "Pass a quiet day">>
<<PrisonAdvanceToMorning>>
<<run resolvePrisonSociety($prisonRoster, undefined, 3, $prison.gang)>>
<<run newPrisonDay()>>
<<set $segMsg = [
"Another day behind the line. The wing is silent but for the buzz of the lights and the slot in the door opening for a tray. Nobody comes for you. You sleep with your back to the door for the first time in weeks.",
"You spend the day in a six-by-eight box with your own thoughts for company. The clock ticks above the door. Nobody tests the handle after lights-out.",
"The vent rattles, the fluorescent tube hums, and nobody speaks through your door. After the block, even those two sounds leave room to breathe.",
"The block feels a hundred miles off from in here. A lockdown alarm echoes somewhere down the complex. You roll toward the wall, pull the blanket up, and let somebody else count the shouting."
].random()>>
<<goto "Prison_Segregation">>
<</button>></div>
<<if not $prison.chapelToday>>
<div class="btn"><<button "Read and reflect">>
<<set $prison.chapelToday = true>>
<<SpendTime 60>>
<<set $prison.programming = ($prison.programming || 0) + 1>>
<<run awardPrisonSkillPoints($prison, "programming", "chapel")>>
<<run recordPrisonDirectorEvent($prison, "activity")>>
<<run $player.status.energy.increase(10)>>
<<set $segMsg = [
"You work through the dog-eared paperbacks the wing passes cell to cell, then finish six pages in a counselor's workbook with the pencil stub from your tray. The counselor initials the last page through the food slot.",
"You read until the words stop swimming, then write in a journal nobody will ever see but you. It steadies something loose in your chest. The counselor logs the session, and the board reads the log when your date comes."
].random()>>
<<goto "Prison_Segregation">>
<</button>></div>
<<else>>
<div class="centre-text" style="font-size:13px;">You have done your reading for the day. Tomorrow the workbook will still be here. Everything is, in PC.</div>
<</if>>
<div class="btn"><<button "Ask to return to general population">>
<<set $prison.inPC = false>>
<<goto "Prison_Block">>
<</button>></div>
<</if>>
</div>
</fieldset>
<<if not _canOut>><<PrisonQuestThreads>><</if>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<PrisonPendingMediaGuard "crossMsg" "crossVideo" "crossContent">>
<<SaveLocation>>
<<set _visit = ($prison and $prison.inside) ? getActiveCrossBlockVisit($prison, { day: getCurrentAbsoluteDay(), hour: $dateTime.hours, minute: $dateTime.minutes }) : null>>
<<if not $prison or not $prison.inside>>
<<set $crossMsg = "">>
<<set $crossVideo = "">>
<<set $crossContent = null>>
<<if $prison>><<run clearCrossBlockVisit($prison)>><</if>>
<<goto "PoliceStation">>
<<elseif $prison.inPC>>
<<set $crossMsg = "">>
<<set $crossVideo = "">>
<<set $crossContent = null>>
<<run clearCrossBlockVisit($prison)>>
<<goto "Prison_Segregation">>
<<elseif not _visit>>
<<set $crossMsg = "">>
<<set $crossVideo = "">>
<<set $crossContent = null>>
<<run clearCrossBlockVisit($prison)>>
<<goto "Prison_Block">>
<<else>>
<<set _other = _visit.targetBlock>>
<<set _visitTiming = getCrossBlockVisitTiming($prison, { day: getCurrentAbsoluteDay(), hour: $dateTime.hours, minute: $dateTime.minutes })>>
<<run unlockPrisonAchievement('crossblock')>>
<<if not Array.isArray($prison.otherRoster) or $prison.otherRoster.length is 0>>
<<set $prison.otherRoster = generatePrisonRoster(8, { block: _other, names: $maleNames, femaleNames: $femaleNames, locations: ["Prison_OtherBlock"] })>>
<</if>>
<<if _other is "F">>
<<SetBackground "Media/Locations/Prison/tier_f.jpg">>
<<set _label = "women's">>
<<else>>
<<SetBackground "Media/Locations/Prison/tier_m.jpg">>
<<set _label = "men's">>
<</if>>
<div class="centre-text">The <<= _label>> block</div>
<div class="centre-text" style="font-size:14px;">You do not belong here, and every head turns. On the wrong tier, you draw attention from predators, hustlers, and anyone bored enough to start trouble.</div>
<<if _visitTiming.overdue>><div class="centre-text" style="font-size:13px;color:#d96b5f;">You have missed the safe return window. A patrol is already looking for you because you are absent from count.</div><</if>>
<<set _crossPending = (($crossMsg and $crossMsg isnot "") or ($crossVideo and $crossVideo isnot ""))>>
<<set _crossPendingAllowed = (not _crossPending or ($crossContent and (not $crossContent.adult or (CheckContentFilter($crossContent.partnerGender, $player) and (not $crossContent.nonConsent or $gameSettings.contentFilter.nonConsent === true) and (not $crossContent.playerFeminization or $gameSettings.contentFilter.PlayerFeminization == true)))))>>
<<if not _crossPendingAllowed>>
<<set $crossMsg = "">>
<<set $crossVideo = "">>
<<set $crossContent = null>>
<</if>>
<<if $crossMsg and $crossMsg isnot "">>
<<PrisonMediaProse $crossMsg $crossVideo>>
<<if $crossVideo and $crossVideo isnot "">><<Video $crossVideo>><<set $crossVideo = "">><</if>>
<<set $crossMsg = "">>
<<set $crossContent = null>>
<</if>>
<<set _here = inmatesAtLocation($prison.otherRoster, "Prison_OtherBlock")>>
<<set _crossPool = prisonFilterCompatible(_here, $player)>>
<<if _here.length gt 0>>
/* The wrong tier's faces - display-only portrait cards (you are an outsider here;
there is no per-inmate approach, only the one stolen half hour below). Same
.location-npc-card surface as the block roster, minus the interactive footer. */
<div class="prison-people prison-people--peek">
<<for _inm range _here>>
<<set _b = prisonInmateBlurb(_inm)>>
<<set _face = npcFacePath(_b.stage, _inm.id, _inm.gender)>>
<<set _card = '<article class="location-npc-card prison-card" data-relation="neutral">'>>
<<set _card += '<div class="location-npc-card__header"><div class="location-npc-card__badges">'>>
<<if _inm.gang>><<set _card += '<span class="location-npc-card__badge prison-card__badge--gang">' + _b.gang + '</span>'>><</if>>
<<if _inm.archetype is "shotcaller">><<set _card += '<span class="location-npc-card__badge prison-card__badge--caller">Shot-caller</span>'>><</if>>
<<set _card += '</div></div>'>>
<<set _card += '<div class="location-npc-card__main"><div class="location-npc-card__avatar-shell"><img class="location-npc-card__avatar" src="' + _face + '" alt=""></div><div class="location-npc-card__content">'>>
<<set _card += '<div class="location-npc-card__eyebrow">' + _b.role + (_inm.gang ? ' · ' + _b.gang : '') + '</div>'>>
<<set _card += '<div class="location-npc-card__name-row"><div class="location-npc-card__name">' + _inm.name + '</div></div>'>>
<<set _pdesc = _inm.gender + ' · age ' + _b.age + ' · in for ' + _inm.crime.toLowerCase()>>
<<if _b.stage gt 0>><<set _pdesc += ' · Femininity ' + _b.stage + '/6'>><</if>>
<<set _card += '<div class="location-npc-card__description">' + _pdesc + '</div>'>>
<<set _card += '</div></div></article>'>>
<<= _card>>
<</for>>
</div>
<</if>>
<<if _crossPool.length > 0 and not $prison.crossSceneUsed>>
<fieldset>
<legend>The stolen half hour</legend>
<div class="btn-container">
<<if not (prisonPlayerActiveSexBlocked($player, $playerlock) and _visit.targetBlock is "F")>>
<div class="btn"><<button "Invite one of them into a blind corner for sex">>
<<if prisonPlayerActiveSexBlocked($player, $playerlock) and _visit.targetBlock is "F">>
<<set $crossMsg = "Your locked cock rules out topping anyone on this tier. You keep moving and save the half hour.">>
<<set $crossContent = { adult: false }>>
<<goto "Prison_OtherBlock">>
<<else>>
<<set $prison.crossSceneUsed = true>>
<<SpendTime 30>>
<<set _here2 = prisonFilterCompatible(inmatesAtLocation($prison.otherRoster, "Prison_OtherBlock"), $player)>>
<<set _t = _here2.random()>>
<<if not _t>>
<<set $crossVideo = "">>
<<set $crossContent = { adult: false }>>
<<set $crossMsg = "The moment passes. Nobody holds your look. A CO at the far rail has started watching you, so you keep moving.">>
<<else>>
<<set _sp = ($player.attributes.speech ? $player.attributes.speech.value : 3)>>
<<set _cor = ($player.attributes.corruption ? $player.attributes.corruption.value : 0)>>
<<set _chance = Math.min(90, 35 + _sp * 4 + _cor * 3)>>
<<if random(1, 100) lte _chance>>
<<SetCharProgression $player "corruption" 1 true>>
<<set $prison.rep = Math.min(100, ($prison.rep || 0) + 3)>>
<<if random(1, 100) lte 45>><<set _tip = random(4, 10)>><<set $prison.scrip = ($prison.scrip || 0) + _tip>><</if>>
<<set $crossContent = { adult: true, partnerGender: _t.gender }>>
<<if $prison.block is "M">>
<<SetVagPick $player.gender() "Female">>
<<set $crossVideo = _pick>>
<<if $player.gender() is "Female">>
<<set $crossMsg = [
"You are forbidden over here, which makes both of you reckless. " + _t.name + " pulls you into a blind corner, where you buckle on a prison-made strap and fuck her cunt against the wall. She cums around the strap. You hold it deep, rub the base over your clit, and cum into her shoulder before anyone counts heads.",
"You do not belong on this locked tier, and that is what excites " + _t.name + ". Behind the stairs you strap-fuck her cunt until both of you cum, then she points you toward the service corridor before count."
].random()>>
<<else>>
<<set $crossMsg = [
"You are forbidden over here, and coming from the other block only makes you more wanted. It works every angle in your favor. " + _t.name + " pulls you into a blind corner, where you get her leg up and drive into her cunt against the wall. She cums around you; you follow and cum inside her, then separate before anyone counts heads.",
"You do not belong on this locked tier, and that is what excites " + _t.name + ". Behind the stairs you fuck her cunt until she cums, then stay inside her and cum before she points you toward the service corridor."
].random()>>
<</if>>
<<elseif _t.gender is "Shemale">>
<<if $player.gender() is "Female">><<SetVagPick "Shemale" "Female">><<else>><<SetAnalPick "Shemale" $player.gender()>><</if>>
<<set $crossVideo = _pick>>
<<set _crossHole = ($player.gender() is "Female") ? "cunt" : "ass">>
<<set $crossMsg = "Every head turns when you step onto a tier where you are not supposed to be. " + _t.name + " moves first and walks you into a blind corner. She pushes her cock into your " + _crossHole + ", fucks you against the cold wall until you cum, then cums inside you. You fix your blues and start looking for a route back before count catches you gone.">>
<<else>>
<<if $player.gender() is "Female">><<SetVagPick "Male" "Female">><<else>><<SetAnalPick "Male" $player.gender()>><</if>>
<<set $crossVideo = _pick>>
<<set _crossHole = ($player.gender() is "Female") ? "cunt" : "ass">>
<<set $crossMsg = [
"Conversation stops when you walk onto the men's tier. " + _t.name + " moves before the rest, pushes his cock into your " + _crossHole + ", and fucks you against the wall until you cum. He cums inside you, then sends you away with your shirt tucked crooked and the return crossing still ahead.",
"A locked men's tier goes silent when it sees you where you do not belong. " + _t.name + " reaches you first, pulls you behind the stairs, and fucks your " + _crossHole + " until he cums inside you. Half an hour later you are fixing your blues and hunting for the service corridor home."
].random()>>
<</if>>
<<else>>
<<set $crossVideo = "">>
<<set $crossContent = { adult: false }>>
<<set $crossMsg = "You hold a look a beat too long and it does not land - just a hard stare back, and a couple of heads turning to mark how far you are pushing your luck. You break it off and move before it becomes a problem. Not every tier wants what you are selling.">>
<</if>>
<</if>>
<<goto "Prison_OtherBlock">>
<</if>>
<</button>></div>
<<else>>
<div class="prison-actnote">You cannot top anyone on the women's tier while your cock is caged. Return to your own block without sex.</div>
<</if>>
<<if $gameSettings.contentFilter.nonConsent === true and $gameSettings.contentFilter.PlayerFeminization == true and not $prison.shotCaller and not $prison.protected and _crossPool.length > 0>>
<div class="btn"><<button "The wrong heads have turned - a crowd is closing in">><<set $prison.crossSceneUsed = true>><<set $prison.sceneAuthority = { scene: "crossCornered", stintDay: getPrisonStintDay(), block: _visit.targetBlock }>><<goto "Prison_CrossCornered">><</button>></div>
<</if>>
</div>
</fieldset>
<<elseif $prison.crossSceneUsed>>
<div class="centre-text" style="font-size:13px;">You have pushed your luck over here once already. Linger any longer and the advantage you had here disappears.</div>
<</if>>
<div class="btn padding-top"><<button "Find a way back to your own block" "Prison_CrossReturn">><</button>></div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<set _visit = ($prison and $prison.inside) ? getActiveCrossBlockVisit($prison, { day: getCurrentAbsoluteDay(), hour: $dateTime.hours, minute: $dateTime.minutes }) : null>>
<<if not $prison or not $prison.inside>>
<<if $prison>><<run clearCrossBlockVisit($prison)>><</if>>
<<goto "PoliceStation">>
<<elseif $prison.inPC>>
<<run clearCrossBlockVisit($prison)>>
<<goto "Prison_Segregation">>
<<elseif not _visit>>
<<run clearCrossBlockVisit($prison)>>
<<goto "Prison_Block">>
<<else>>
<<set _timing = getCrossBlockVisitTiming($prison, { day: getCurrentAbsoluteDay(), hour: $dateTime.hours, minute: $dateTime.minutes })>>
<<if _visit.targetBlock is "F">><<SetBackground "Media/Locations/Prison/tier_f.jpg">><<else>><<SetBackground "Media/Locations/Prison/tier_m.jpg">><</if>>
<div class="centre-text">The Return Crossing</div>
<div class="chat-container prison-prose"><p class="text">Your own block is on the far side of the same service corridor. The paid door costs another <<= CROSS_BLOCK_PAY_COST>> scrip. A name might buy it, but it will put a rat jacket on you. The duct is free only if the patrol does not catch you inside it.</p></div>
<<if _timing.overdue>><div class="chat-container prison-prose"><p class="text">The safe hour is gone and your absence has reached count. A name or the duct now has to beat an active search.</p></div><</if>>
<<set _returnPayLabel = "Pay for the return (" + CROSS_BLOCK_PAY_COST + " scrip)">>
<<set _returnDuctLabel = $prison.hasLockpick ? "Take the ducts home (stealth, lockpick in hand)" : "Take the ducts home (stealth)">>
<div class="btn-container">
<<if canAfford(($prison.scrip || 0), CROSS_BLOCK_PAY_COST)>>
<div class="btn"><<button _returnPayLabel "Prison_CrossReturnResolve">><<set $prison.crossMethod = "pay">><</button>></div>
<</if>>
<div class="btn"><<button "Trade another name for the return (rat jacket)" "Prison_CrossReturnResolve">><<set $prison.crossMethod = "name">><</button>></div>
<div class="btn"><<button _returnDuctLabel "Prison_CrossReturnResolve">><<set $prison.crossMethod = "stealth">><</button>></div>
<div class="btn"><<button "Step back onto the wrong tier" "Prison_OtherBlock">><</button>></div>
</div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _returnResolveVisit = ($prison and $prison.inside) ? getActiveCrossBlockVisit($prison, { day: getCurrentAbsoluteDay(), hour: $dateTime.hours, minute: $dateTime.minutes }) : null>>
<<if not $prison or not $prison.inside>>
<<if $prison>><<run clearCrossBlockVisit($prison)>><</if>>
<<goto "PoliceStation">>
<<elseif $prison.inPC>>
<<run clearCrossBlockVisit($prison)>>
<<goto "Prison_Segregation">>
<<elseif not _returnResolveVisit>>
<<run clearCrossBlockVisit($prison)>>
<<goto "Prison_Block">>
<<else>>
<<set _method = $prison.crossMethod>>
<<set _timing = getCrossBlockVisitTiming($prison, { day: getCurrentAbsoluteDay(), hour: $dateTime.hours, minute: $dateTime.minutes })>>
<<set _searchHeat = _timing.overdue ? 25 : 0>>
<<set _decision = null>>
<<if _method is "name">>
<<set _decision = copBribe({ corrupt: 55, greed: 50, lust: 35 }, "snitch", Math.min(100, ($prison.heat || 0) + _searchHeat))>>
<<elseif _method is "stealth">>
<<set _dx = prisonStealthScore($prison, $player.attributes.dexterity.value)>>
<<if $prison.hasLockpick>><<set _dx = _dx + 3>><</if>>
<<set _r = resolvePursuit({ stealth: _dx, dexterity: _dx, wanted: Math.min(100, ($prison.heat || 0) + _searchHeat) })>>
<<set _decision = _r.caught ? "caught" : "success">>
<</if>>
<<set _cross = resolveCrossBlockReturn($prison, _method, { decision: _decision, day: getCurrentAbsoluteDay(), hour: $dateTime.hours, minute: $dateTime.minutes })>>
<<if _cross.time gt 0>><<SpendTime _cross.time>><</if>>
<<if _cross.rep>><<set $prison.rep = Math.max(0, Math.min(100, ($prison.rep || 0) + _cross.rep))>><</if>>
<<if _cross.heat>><<set $prison.heat = Math.max(0, Math.min(100, ($prison.heat || 0) + _cross.heat))>><</if>>
<<if _method is "name" and (_cross.outcome is "returned" or _cross.outcome is "betrayed")>><<run addJacketMark('rat')>><</if>>
<<if _cross.outcome is "returned">>
<<if _method is "pay">>
<<set $workMsg = "The guard takes another twelve scrip and walks you through the service door. You are back on your own block fifteen minutes later; both legs are paid and the visit is closed.">>
<<elseif _method is "name">>
<<set $workMsg = "A second name opens the return door. You make your own tier fifteen minutes later, carrying no debt in scrip and a rat jacket the block will not forget.">>
<<else>>
<<set $workMsg = "You crawl the duct back toward the voices you know and drop behind your own laundry line. Twenty minutes later the visit is closed, though the fresh guard heat remains.">>
<</if>>
<<goto "Prison_Block">>
<<elseif _cross.outcome is "refused">>
<<if $prison.visiting is "F">><<SetBackground "Media/Locations/Prison/tier_f.jpg">><<else>><<SetBackground "Media/Locations/Prison/tier_m.jpg">><</if>>
<div class="centre-text">Still on the Wrong Tier</div>
<div class="chat-container prison-prose"><p class="text">The guard rejects the name and leaves you on the wrong side of the door. Five minutes pass and your heat rises, but the active visit remains: you still have to find another way home.</p></div>
<div class="btn padding-top"><<button "Try another return route" "Prison_CrossReturn">><</button>></div>
<<elseif _cross.outcome is "betrayed" or _cross.outcome is "caught">>
<<run extendSentence(2)>>
<<SpendTime 2880>>
<<AdvancePrisonDays 2 true>>
<<run unlockPrisonAchievement('hole')>>
<<if _cross.outcome is "betrayed">>
<<set $workMsg = "The guard takes the name, opens the door, and delivers you straight to the watch commander. Two days in the hole pass before they return you to your own block. The rat jacket survives the trip.">>
<<else>>
<<set $workMsg = "The return patrol pulls you out of the duct on the wrong side of count. Two days in the hole pass before they return you to your own block, with added heat and sentence time.">>
<</if>>
<<goto "Prison_Block">>
<<else>>
<<goto "Prison_CrossReturn">>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<PrisonPendingMediaGuard "crossMsg" "crossVideo" "crossContent">>
<<set _visit = ($prison and $prison.inside) ? getActiveCrossBlockVisit($prison, { day: getCurrentAbsoluteDay(), hour: $dateTime.hours, minute: $dateTime.minutes }) : null>>
<<if not $prison or not $prison.inside>>
<<set $crossMsg = "">>
<<set $crossVideo = "">>
<<set $crossContent = null>>
<<if $prison>><<run clearCrossBlockVisit($prison)>><</if>>
<<goto "PoliceStation">>
<<elseif $prison.inPC>>
<<set $crossMsg = "">>
<<set $crossVideo = "">>
<<set $crossContent = null>>
<<run clearCrossBlockVisit($prison)>>
<<goto "Prison_Segregation">>
<<elseif not _visit>>
<<set $crossMsg = "">>
<<set $crossVideo = "">>
<<set $crossContent = null>>
<<run clearCrossBlockVisit($prison)>>
<<goto "Prison_Block">>
<<else>>
<<if _visit.targetBlock is "F">>
<<SetBackground "Media/Locations/Prison/tier_f.jpg">>
<<else>>
<<SetBackground "Media/Locations/Prison/tier_m.jpg">>
<</if>>
<<set _here3 = prisonFilterCompatible(inmatesAtLocation($prison.otherRoster, "Prison_OtherBlock"), $player)>>
<<set _t = _here3.random()>>
<<set _ag = _t ? _t.gender : (_visit.targetBlock is "F" ? "Female" : "Male")>>
<<set _cornerPending = (($crossMsg and $crossMsg isnot "") or ($crossVideo and $crossVideo isnot ""))>>
<<set _cornerPendingAllowed = (not _cornerPending or ($crossContent and (not $crossContent.adult or (CheckContentFilter($crossContent.partnerGender, $player) and (not $crossContent.nonConsent or $gameSettings.contentFilter.nonConsent === true) and (not $crossContent.playerFeminization or $gameSettings.contentFilter.PlayerFeminization == true)))))>>
<<set _crossCornerAuthority = ($prison.sceneAuthority and $prison.sceneAuthority.scene is "crossCornered" and $prison.sceneAuthority.stintDay is getPrisonStintDay() and $prison.sceneAuthority.block is _visit.targetBlock)>>
<<if $gameSettings.contentFilter.nonConsent === true and $gameSettings.contentFilter.PlayerFeminization == true and not $prison.shotCaller and not $prison.protected and _t and CheckContentFilter(_t.gender, $player) and _cornerPendingAllowed and (_cornerPending or _crossCornerAuthority)>>
<<set $prison.crossSceneUsed = true>>
<div class="centre-text">Wrong Tier, Wrong Day</div>
<<if $crossMsg and $crossMsg isnot "">>
<<PrisonMediaProse $crossMsg $crossVideo>>
<<if $crossVideo and $crossVideo isnot "">><<Video $crossVideo>><<set $crossVideo = "">><</if>>
<div class="btn padding-top"><<button "Get back to the crossing">>
<<set $prison.sceneAuthority = null>>
<<set $crossMsg = "">>
<<set $crossVideo = "">>
<<set $crossContent = null>>
<<goto "Prison_CrossReturn">>
<</button>></div>
<<else>>
<div class="chat-container prison-prose"><p class="text">The looks stopped being curious a minute ago. Now there are three or four of them between you and the crossing, and you have no name to call on and no car to stand behind. <span class='dialogue-speech'>"Long way from home,"</span> one of them says, and the rest close the gap.</p></div>
<div class="btn-container">
<div class="btn"><<button "Fight through them">>
<<set $prison.sceneAuthority = null>>
<<SpendTime 30>>
<<set _ag = _t.gender>>
<<set _str = $player.attributes.strength.value>>
<<if random(1, 100) lte (16 + _str * 5)>>
<<SetCharProgression $player "dominance" 3 true>>
<<set $prison.rep = Math.min(100, ($prison.rep || 0) + 6)>>
<<set $crossVideo = "">>
<<set $crossContent = { adult: false }>>
<<set $crossMsg = "You go through the smallest one before the circle even closes, hard enough that the rest decide you are more trouble than the sport is worth. You are through the gap and back at the crossing with your heart going like a hammer, blues torn but nothing worse. The wrong tier will remember that you would not be cornered.">>
<<else>>
<<set _pgBefore = $player.gender()>>
<<SetAnalPick _ag _pgBefore>>
<<set $crossVideo = _pick>>
<<set $crossContent = { adult: true, nonConsent: true, playerFeminization: true, partnerGender: _ag }>>
<<PrisonCoerceBody>>
<<set $prison.rep = Math.max(0, ($prison.rep || 0) - 6)>>
<<run unlockPrisonAchievement('toppedByBlock')>>
/* The clip is _t alone with the player; on the men's block _t can be a trans woman. */
<<if _visit.targetBlock is "F">>
<<set $crossMsg = "There are too many of them, this is not your tier, and nobody here owes you a thing. They pin you against the cold wall. The first woman strap-fucks your ass and cums rubbing the base against herself, then passes the harness on.\n\nThe next woman buckles it on and pounds your ass until you cum against the cinderblock. She shoves you toward the crossing when she is done, and your legs shake the whole way.">>
<<else>>
<<set _tSub = (_ag is "Male") ? "he" : "she">>
<<set _tPoss = (_ag is "Male") ? "his" : "her">>
<<set $crossMsg = "There are too many of them, this is not your tier, and nobody here owes you a thing. They pin you against the cold wall and fuck your ass in turn, each one cumming inside you before the next steps up.\n\nThe last of them, " + _t.name + ", drives " + _tPoss + " cock deep into your ass, pounding you against the wall until " + _tSub + " cums in you, then points you back at the crossing. You will not make this trip again soon.">>
<</if>>
<</if>>
<<goto "Prison_CrossCornered">>
<</button>></div>
<div class="btn"><<button "Stop fighting and let them fuck you">>
<<set $prison.sceneAuthority = null>>
<<SpendTime 30>>
<<set _ag = _t.gender>>
<<set _pgBefore = $player.gender()>>
<<SetAnalPick _ag _pgBefore>>
<<set $crossVideo = _pick>>
<<set $crossContent = { adult: true, nonConsent: true, playerFeminization: true, partnerGender: _ag }>>
<<PrisonCoerceBody>>
<<set $prison.rep = Math.max(0, ($prison.rep || 0) - 8)>>
<<run unlockPrisonAchievement('toppedByBlock')>>
/* The clip is _t alone with the player; on the men's block _t can be a trans woman. */
<<if _visit.targetBlock is "F">>
<<set $crossMsg = "You stop fighting because the whole tier is theirs. They bend you to the cold wall and pass a prison-made strap from woman to woman, each one fucking your ass and rubbing herself to orgasm against the base.\n\nThe last woman to take it pins you to the wall and drives it into your ass until you cum. She walks you to the crossing with your blues still crooked and waits until the gate shuts.">>
<<else>>
<<set _tSub = (_ag is "Male") ? "he" : "she">>
<<set _tPoss = (_ag is "Male") ? "his" : "her">>
<<set _tCap = (_ag is "Male") ? "He" : "She">>
<<set $crossMsg = "You stop fighting because the whole tier is theirs. They bend you to the cold wall, two of them holding your wrists while the rest go one at a time, each one cumming in you and stepping aside for the next.\n\nThe last of them, " + _t.name + ", shoves " + _tPoss + " cock into your ass and pounds it until " + _tSub + " cums in you. " + _tCap + " walks you to the crossing with your blues still crooked and waits until the gate shuts.">>
<</if>>
<<goto "Prison_CrossCornered">>
<</button>></div>
</div>
<</if>>
<<else>>
<<set $prison.sceneAuthority = null>>
<<set $crossMsg = "">>
<<set $crossVideo = "">>
<<set $crossContent = null>>
<<goto "Prison_OtherBlock">>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<PrisonRestoreBackground>>
<<set _incident = $prison ? $prison.playerIncident : null>>
<<set _actor = (_incident and $prisonRoster) ? getInmate($prisonRoster, _incident.actorId) : null>>
<<set _incidentAuthority = ($prison and $prison.sceneAuthority and $prison.sceneAuthority.scene is "playerIncident" and $prison.sceneAuthority.stintDay is getPrisonStintDay() and _incident and $prison.sceneAuthority.targetId is _incident.actorId)>>
<<if not _actor or not _incidentAuthority>>
<<if $prison>><<set $prison.playerIncident = null>><<set $prison.sceneAuthority = null>><</if>>
<<goto "Prison_Block">>
<<else>>
<<set _actorShe = (_actor.gender isnot "Male")>>
<<set _actorSubject = _actorShe ? "She" : "He">>
<<set _actorObject = _actorShe ? "her" : "him">>
<<set _ib = prisonInmateBlurb(_actor)>>
<<set _iface = npcFacePath(_ib.stage, _actor.id, _actor.gender)>>
<div class="prison-dossier">
<div class="prison-dossier__main">
<div class="prison-dossier__portrait"><img class="prison-dossier__face" @src="_iface" @alt="_actor.name"></div>
<div class="prison-dossier__body">
<div class="prison-dossier__role">Unplanned contact · <<= _ib.role>></div>
<div class="prison-dossier__name-row"><span class="prison-dossier__name"><<= _actor.name>></span></div>
</div>
</div>
</div>
<<if _incident.type is "attack">>
<<set _attackLine = _actor.name + " steps across your path, shoves you back into the rail, and swings before the nearest table can clear. " + _actorSubject + " did not come to talk.">>
<<PrisonProse _attackLine>>
<div class="btn padding-top"><<button "Defend yourself">>
<<set $prison.fightTargetsToday = $prison.fightTargetsToday || []>>
<<if not $prison.fightTargetsToday.includes(_actor.id)>><<run $prison.fightTargetsToday.push(_actor.id)>><</if>>
<<set $prison.fight = { targetId: _actor.id, source: "npc", stintDay: getPrisonStintDay(), returnLocation: "Prison_Block", resolved: false, dosed: false }>>
<<set $prison.playerIncident = null>>
<<set $prison.sceneAuthority = { scene: "prisonFight", stintDay: getPrisonStintDay(), targetId: _actor.id }>>
<<set $interactionNpc = createPrisonCombatant(_actor, $player, getPrisonStintDay())>>
<<set _battleSetControls = { attack: true, seduce: false, items: false, actions: true, noEscape: true, noWeapons: true, forcePhysical: true, isolated: true }>>
<<SpendTime 20>>
<<StartFight $player $interactionNpc _battleSetControls "Prison_FightWon" "Prison_FightLost" "Fight" false>>
<</button>></div>
<<else>>
<<set _offerLine = prisonPlayerEstrogenOffer(_actor)>>
<<PrisonProse _offerLine>>
<div class="btn-container">
<<if $gameSettings.contentFilter.PlayerFeminization == true and $player.gender() isnot "Female" and femStage($player) lt 6>>
<div class="btn"><<button "Take the estrogen">>
<<run applyFeminizationStage($player, 1)>>
<<if _actor.stats>><<set _actor.stats.trust = Math.min(100, (_actor.stats.trust || 0) + 3)>><</if>>
<<set $prisonIncidentMsg = "You take the tablet from " + _actor.name + " and swallow it dry. " + _actorSubject + " watches until " + _actorSubject.toLowerCase() + " is sure it went down. Another stage of feminization has begun.">>
<<set $prison.playerIncident = null>>
<<set $prison.sceneAuthority = null>>
<<SpendTime 15>>
<<goto "Prison_Block">>
<</button>></div>
<</if>>
<div class="btn"><<button "Refuse">>
<<if _actor.stats>><<set _actor.stats.trust = Math.max(0, (_actor.stats.trust || 0) - 2)>><</if>>
<<set $prisonIncidentMsg = "You close " + _actor.name + "'s fingers around the packet and tell " + _actorObject + " no. " + _actorSubject + " studies you for a moment, pockets the dose, and lets you pass.">>
<<set $prison.playerIncident = null>>
<<set $prison.sceneAuthority = null>>
<<SpendTime 5>>
<<goto "Prison_Block">>
<</button>></div>
</div>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<PrisonRestoreBackground>>
<<set _fight = $prison ? $prison.fight : null>>
<<set _target = (_fight and $prisonRoster) ? getInmate($prisonRoster, _fight.targetId) : null>>
<<set _fightAuthority = ($prison and $prison.sceneAuthority and $prison.sceneAuthority.scene is "prisonFight" and _fight and _fight.stintDay is getPrisonStintDay() and $prison.sceneAuthority.targetId is _fight.targetId)>>
<<if not _target or not _fightAuthority>>
<<if $prison>><<set $prison.fight = null>><<set $prison.sceneAuthority = null>><</if>>
<<goto "Prison_Block">>
<<else>>
<<if not _fight.resolved>>
<<set _fightOut = applyPrisonPlayerFightResult(_target, true, _fight.source)>>
<<set $prison.rep = Math.max(0, Math.min(100, ($prison.rep || 0) + _fightOut.repDelta))>>
<<set _fight.resultLine = _fightOut.line>>
<<set _fight.resolved = true>>
<</if>>
<div class="centre-text">You Won the Fight</div>
<<PrisonProse _fight.resultLine>>
<<if _fight.spoilsSummary>><<PrisonProse _fight.spoilsSummary>><</if>>
<<if _fight.doseLine>><<PrisonProse _fight.doseLine>><</if>>
<div class="btn-container">
/* The yard's arithmetic for a beaten con. Coercive, so it needs the nonConsent
toggle and the pair filter; a lover or a claimed punk has their own scenes. */
<<if not _fight.spoilsAct and not $prison.spoilsToday and $gameSettings.contentFilter.nonConsent === true and CheckContentFilter(_target.gender, $player) and canTakePrisonFightSpoils(_target) and not isLoverOfPlayer(_target) and not isClaimedByPlayer(_target) and not prisonPlayerActiveSexBlocked($player, $playerlock)>>
<<set _spoilsMouthLbl = "Fuck " + _target.name + " in the mouth">>
<<set _spoilsAssLbl = "Fuck " + _target.name + " in the ass">>
<<set _spoilsCuntLbl = "Put " + _target.name + " on " + (_target.gender is "Male" ? "his" : "her") + " knees between your thighs">>
<div class="btn"><<button _spoilsMouthLbl>>
<<PrisonTakeFightSpoils "oral">>
<</button>></div>
<div class="btn"><<button _spoilsAssLbl>>
<<PrisonTakeFightSpoils "anal">>
<</button>></div>
/* A winner with a cunt can settle it with a mouth instead of a strap. This
is the women's-block currency: nothing changes hands except who kneels. */
<<if canTakeCuntFightSpoils($player.gender())>>
<div class="btn"><<button _spoilsCuntLbl>>
<<PrisonTakeFightSpoils "cunt">>
<</button>></div>
<</if>>
<<elseif not _fight.spoilsAct and $prison.spoilsToday and $gameSettings.contentFilter.nonConsent === true and CheckContentFilter(_target.gender, $player) and canTakePrisonFightSpoils(_target) and not isLoverOfPlayer(_target) and not isClaimedByPlayer(_target)>>
<div class="prison-actnote">You have already collected off somebody today. Take it twice in one day and the tier stops reading it as a debt paid and starts reading it as a habit the COs will notice.</div>
<</if>>
<<if not _fight.spoilsAct and not $prison.spoilsToday and $gameSettings.contentFilter.nonConsent === true and CheckContentFilter(_target.gender, $player) and canTakePrisonFightSpoils(_target) and prisonPlayerActiveSexBlocked($player, $playerlock)>>
<div class="prison-actnote">With your cock locked, you cannot fuck the beaten inmate. Leave them alone and continue.</div>
<</if>>
<<if not _fight.dosed and ($prison.estrogenDoses || 0) gt 0 and canUsePrisonEstrogenOn(_target)>>
<div class="btn"><<button "Make them take estrogen (1 dose)">>
<<if ($prison.estrogenDoses || 0) gt 0 and canUsePrisonEstrogenOn(_target)>>
<<set $prison.estrogenDoses = Math.max(0, ($prison.estrogenDoses || 0) - 1)>>
<<set _fight.doseLine = applyPrisonPostFightEstrogen(_target)>>
<<set _fight.dosed = true>>
<<set _fightTransfer = collectPrisonWomensTransfers()>>
<<if _fightTransfer.text>><<set _fight.doseLine += " " + _fightTransfer.text>><</if>>
<</if>>
<<goto "Prison_FightWon">>
<</button>></div>
<<elseif not _fight.dosed and canUsePrisonEstrogenOn(_target)>>
<div class="prison-actnote">You won, but you do not have an estrogen dose. The commissary sells diverted tablets.</div>
<</if>>
<div class="btn"><<button "Leave them and return">>
<<set _fightReturn = _fight.returnLocation>>
<<run clearPrisonCombatRelation($player, $interactionNpc)>>
<<set $prison.fight = null>>
<<set $prison.sceneAuthority = null>>
<<unset $interactionNpc $finishLock $finishLockLoose $battleType $activeInmateId>>
<<set $canShowStatsBtn = true>>
<<goto _fightReturn>>
<</button>></div>
</div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<PrisonRestoreBackground>>
<<set _fight = $prison ? $prison.fight : null>>
<<set _target = (_fight and $prisonRoster) ? getInmate($prisonRoster, _fight.targetId) : null>>
<<set _fightAuthority = ($prison and $prison.sceneAuthority and $prison.sceneAuthority.scene is "prisonFight" and _fight and _fight.stintDay is getPrisonStintDay() and $prison.sceneAuthority.targetId is _fight.targetId)>>
<<if not _target or not _fightAuthority>>
<<if $prison>><<set $prison.fight = null>><<set $prison.sceneAuthority = null>><</if>>
<<goto "Prison_Block">>
<<else>>
<<if not _fight.resolved>>
<<set _fightOut = applyPrisonPlayerFightResult(_target, false, _fight.source)>>
<<set $prison.rep = Math.max(0, Math.min(100, ($prison.rep || 0) + _fightOut.repDelta))>>
<<set _fight.resultLine = _fightOut.line>>
<<set _fight.resolved = true>>
<</if>>
<div class="centre-text">You Lost the Fight</div>
<<PrisonProse _fight.resultLine>>
<div class="btn padding-top"><<button "Get back to the tier">>
<<set _fightReturn = _fight.returnLocation>>
<<run clearPrisonCombatRelation($player, $interactionNpc)>>
<<set $prison.fight = null>>
<<set $prison.sceneAuthority = null>>
<<unset $interactionNpc $finishLock $finishLockLoose $battleType $activeInmateId>>
<<set $canShowStatsBtn = true>>
<<goto _fightReturn>>
<</button>></div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<PrisonRestoreBackground>>
<<set _fight = $prison ? $prison.fight : null>>
<<set _target = (_fight and $prisonRoster) ? getInmate($prisonRoster, _fight.targetId) : null>>
<<set _spoilsAuthority = ($prison and $prison.sceneAuthority and $prison.sceneAuthority.scene is "prisonFight" and _fight and _fight.stintDay is getPrisonStintDay() and $prison.sceneAuthority.targetId is _fight.targetId)>>
<<set _spoilsValid = (_target and _spoilsAuthority and _fight.spoilsAct and $gameSettings.contentFilter.nonConsent === true and CheckContentFilter(_target.gender, $player))>>
<<if not _spoilsValid>>
<<goto "Prison_FightWon">>
<<else>>
/* A cunt has no placement to choose, so that act closes on its own final beat. */
<<set _spoilsCums = playerCumsInFightSpoils($player.gender()) and _fight.spoilsAct isnot "cunt">>
<div class="centre-text">The Winner's Due</div>
<<PrisonMediaProse _fight.spoilsLine _fight.spoilsVideo true>>
<<if _fight.spoilsVideo>><<Video _fight.spoilsVideo>><</if>>
<<if _spoilsCums>>
<<if _fight.spoilsAct is "oral">>
<<set _spoilsInLbl = "Cum down " + _target.name + "'s throat">>
<<set _spoilsOutLbl = "Pull out and cum on " + _target.name + "'s face">>
<<else>>
<<set _spoilsInLbl = "Cum in " + _target.name + "'s ass">>
<<set _spoilsOutLbl = "Pull out and cum on " + _target.name + "'s back">>
<</if>>
<div class="btn-container">
<div class="btn"><<button _spoilsInLbl>>
<<PrisonFinishFightSpoils "inside">>
<</button>></div>
<div class="btn"><<button _spoilsOutLbl>>
<<PrisonFinishFightSpoils "outside">>
<</button>></div>
</div>
<<else>>
/* A strap has nothing to finish with, so the scene ends on the withdrawal. */
<<PrisonProse _fight.spoilsEndLine>>
<<set _spoilsLeaveLbl = "Leave " + _target.name + " where " + (_target.gender is "Male" ? "he" : "she") + " is">>
<div class="btn-container">
<div class="btn"><<button _spoilsLeaveLbl>>
<<goto "Prison_FightWon">>
<</button>></div>
</div>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<PrisonRestoreBackground>>
<<set _fight = $prison ? $prison.fight : null>>
<<set _target = (_fight and $prisonRoster) ? getInmate($prisonRoster, _fight.targetId) : null>>
<<set _spoilsAuthority = ($prison and $prison.sceneAuthority and $prison.sceneAuthority.scene is "prisonFight" and _fight and _fight.stintDay is getPrisonStintDay() and $prison.sceneAuthority.targetId is _fight.targetId)>>
<<set _spoilsValid = (_target and _spoilsAuthority and _fight.spoilsAct and _fight.spoilsPlacement and playerCumsInFightSpoils($player.gender()) and $gameSettings.contentFilter.nonConsent === true and CheckContentFilter(_target.gender, $player))>>
<<if not _spoilsValid>>
<<goto "Prison_FightWon">>
<<else>>
<div class="centre-text">The Winner's Due</div>
<<PrisonMediaProse _fight.spoilsCumLine _fight.spoilsCumVideo true>>
<<if _fight.spoilsCumVideo>><<Video _fight.spoilsCumVideo>><</if>>
<<set _spoilsDoneLbl = "Leave " + _target.name + " on the floor">>
<div class="btn-container">
<div class="btn"><<button _spoilsDoneLbl>>
<<goto "Prison_FightWon">>
<</button>></div>
</div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<PrisonRestoreBackground>>
<<set _inm = getInmate($prisonRoster, $activeInmateId)>>
<<set _inmateLocation = ($player and $player.info) ? $player.info.currentLocation : "">>
<<set _inmateAuthority = ($prison and $prison.sceneAuthority and $prison.sceneAuthority.scene is "inmate" and $prison.sceneAuthority.stintDay is getPrisonStintDay() and $prison.sceneAuthority.targetId is $activeInmateId and $prison.sceneAuthority.block is _inmateLocation)>>
<<set _inmatePresent = (_inm and prisonInmatePresentAt(_inm, _inmateLocation, $dateTime.hours, getPrisonStintDay(), $prison.cellmateId))>>
<<if not _inm or not _inmateAuthority or not _inmatePresent>>
<<if $prison>><<set $prison.sceneAuthority = null>><</if>>
<<set $activeInmateId = null>><<set $inmateLine = "">><<set $inmateRead = false>>
<<if _inmateLocation and _inmateLocation.indexOf("Prison_") is 0>><<goto _inmateLocation>><<else>><<goto "Prison_Block">><</if>>
<<else>>
<<set _b = prisonInmateBlurb(_inm)>>
<<set _face = npcFacePath(_b.stage, _inm.id, _inm.gender)>>
<<set _trust = Math.max(0, Math.min(100, Math.floor((_inm.stats ? _inm.stats.trust : 0) || 0)))>>
<<set _affection = prisonInmateAffection(_inm)>>
<<set _rel = prisonCardRelation(_inm)>>
<<set _she = (_inm.gender isnot "Male")>>
<<set _liveGoal = prisonGoalLabel(_inm.currentGoal || _inm.goal)>>
<div class="prison-dossier" @data-relation="_rel.rel">
<div class="prison-dossier__main">
<div class="prison-dossier__portrait"><img class="prison-dossier__face" @src="_face" @alt="_inm.name"></div>
<div class="prison-dossier__body">
<div class="prison-dossier__role"><<= _b.role>><<if _b.gang>> · <<= _b.gang>><</if>> · <<= _inm.gender>></div>
<div class="prison-dossier__name-row"><span class="prison-dossier__name"><<= _inm.name>></span><span class="prison-dossier__pill"><<= _rel.label>></span></div>
<div class="prison-dossier__crime">In for <<= _inm.crime.toLowerCase()>><<if _inm.homeTurf>> · out of <<= _inm.homeTurf>><</if>></div>
<div class="prison-dossier__goal">"<<= _liveGoal>>"</div>
<div class="prison-meter"><span class="prison-meter__label">Trust</span><span class="prison-meter__track"><span class="prison-meter__fill" @style="'width:' + _trust + '%'"></span></span><span class="prison-meter__val"><<= _inm.stats.trust>>/100</span></div>
<div class="prison-meter"><span class="prison-meter__label">Affection</span><span class="prison-meter__track"><span class="prison-meter__fill prison-meter__fill--love" @style="'width:' + _affection + '%'"></span></span><span class="prison-meter__val"><<= _affection>>/100</span></div>
<div class="prison-meter"><span class="prison-meter__label">Standing</span><span class="prison-meter__track"><span class="prison-meter__fill prison-meter__fill--standing" @style="'width:' + Math.max(0, Math.min(100, _inm.stats.standing)) + '%'"></span></span><span class="prison-meter__val"><<= _inm.stats.standing>>/100</span></div>
<div class="prison-meter"><span class="prison-meter__label">Nerve</span><span class="prison-meter__track"><span class="prison-meter__fill prison-meter__fill--nerve" @style="'width:' + Math.max(0, Math.min(100, _inm.stats.azart)) + '%'"></span></span><span class="prison-meter__val"><<= _inm.stats.azart>>/100</span></div>
<div class="prison-meter"><span class="prison-meter__label">Fear</span><span class="prison-meter__track"><span class="prison-meter__fill prison-meter__fill--fear" @style="'width:' + Math.max(0, Math.min(100, _inm.stats.fear)) + '%'"></span></span><span class="prison-meter__val"><<= _inm.stats.fear>>/100</span></div>
<<if _b.stage gt 0>>
<div class="prison-meter"><span class="prison-meter__label">Femininity</span><span class="prison-meter__track"><span class="prison-meter__fill prison-meter__fill--fem" @style="'width:' + Math.round(_b.stage / 6 * 100) + '%'"></span></span><span class="prison-meter__val"><<= _b.stage>>/6</span></div>
<</if>>
</div>
</div>
</div>
/* Road/mark-aware greeting: how this con reads the player now, given the jacket
(a rat gets contempt, a made dog gets wary respect). Empty for the player's own
people and for a clean sheet - then the normal ladder speaks. Doc 22.9. */
<<set _qrl = questReactionLine(_inm)>>
<<if _qrl>><<PrisonProse _qrl>><</if>>
<<if isClaimedByPlayer(_inm)>><div class="centre-text" style="font-size:13px;"><<= _she ? "She" : "He">> is yours on the block - <<= submissionLabel(_inm.submission).toLowerCase()>><<if _inm.submission gte 2>>, trained to answer when you call<<elseif _inm.submission gte 1>>, compliant but watchful<<else>>, and still looking for a way out<</if>>.</div><<elseif isLoverOfPlayer(_inm)>><div class="centre-text" style="font-size:13px;"><<= _she ? "She" : "He">> comes to your bunk by choice, and the tier knows to leave it alone.</div><</if>>
<<if _inm.sexProfile and _inm.sexProfile.encounters gt 0>>
<div class="prison-actnote">Shared intimacy: <<= _inm.sexProfile.completed>> completed, <<= _inm.sexProfile.encounters - _inm.sexProfile.completed>> interrupted or unfinished<<if _inm.sexProfile.lastPose>> · last position: <<= _inm.sexProfile.lastPose>><</if>>.</div>
<</if>>
<<set _moveCaptionVideo = ($moveVideo and $moveVideo isnot "") ? $moveVideo : (($moveVideos and $moveVideos.length gt 0) ? $moveVideos[0] : "")>>
<<if $inmateLine and $inmateLine isnot "">>
<<PrisonMediaProse $inmateLine _moveCaptionVideo $movePlayerRole>>
<</if>>
<<if $moveVideo and $moveVideo isnot "">><<Video $moveVideo>><<set $moveVideo = "">><</if>>
<<if $moveVideos and $moveVideos.length gt 0>>
<<for _moveClipIndex, _moveClip range $moveVideos>><<if _moveClipIndex gt 0>><<PrisonMediaProse "" _moveClip $movePlayerRole>><</if>><<Video _moveClip>><</for>>
<<set $moveVideos = []>>
<</if>>
<<set $movePlayerRole = null>>
<div class="prison-imenu">
<div class="prison-imenu__cats">
<<if prisonBusinessMatchesTarget($prison.business, _inm.id)>>
<div class="prison-icat prison-icat--business">
<div class="prison-icat__head"><span class="prison-icat__icon">✉</span><span class="prison-icat__title">Open business</span></div>
<div class="prison-icat__body">
<<set _bizLabel = "Handle the " + prisonBusinessKindLabel($prison.business.kind).toLowerCase() + " with " + _inm.name>>
<div class="btn"><<button _bizLabel>><<set $prison.sceneAuthority = { scene: "businessTarget", stintDay: getPrisonStintDay(), targetId: _inm.id, block: $player.info.currentLocation }>><<goto "Prison_BusinessTarget">><</button>></div>
<div class="prison-actnote">This is the named other end of the job. What you do here closes the ledger.</div>
</div>
</div>
<</if>>
<div class="prison-icat prison-icat--talk">
<div class="prison-icat__head"><span class="prison-icat__icon">💬</span><span class="prison-icat__title">Talk</span></div>
<div class="prison-icat__body">
<div class="btn"><<button "Talk">>
<<set _e = getInmate($prisonRoster, $activeInmateId)>>
<<if isAdultPrisonInmate(_e)>>
<<set $prisonConversationFresh = true>>
<<set $prisonConversationPlayerLine = "">>
<<set $prisonConversationNpcLine = "">>
<<set $prisonConversationCanReact = false>>
<<goto "Prison_Conversation">>
<<else>>
<<goto "Prison_Block">>
<</if>>
<</button>></div>
<<set _sizeLbl = "Size " + ((_inm.gender isnot "Male") ? "her" : "him") + " up">>
<div class="btn"><<button _sizeLbl>>
<<set _e = getInmate($prisonRoster, $activeInmateId)>>
<<set $inmateRead = true>>
<<set _e.read = true>>
<<set $inmateLine = sizeUpRead(_e)>>
<<goto "Prison_Inmate">>
<</button>></div>
<<if _inm.stats.trust gte 45>>
<div class="btn"><<button "Hear their story">>
<<set _e = getInmate($prisonRoster, $activeInmateId)>>
<<PrisonEnsureDialogueMemory _e.id>>
<<set $inmateLine = inmateBackstory(_e, undefined, _conversationMemory.recent)>>
<<PrisonRememberDialogue _e.id $inmateLine>>
<<goto "Prison_Inmate">>
<</button>></div>
<</if>>
<<if canUsePrisonEstrogenOn(_inm)>>
<<set _estrogenTried = ($prison.estrogenAttemptsToday || []).includes(_inm.id)>>
<<if ($prison.estrogenDoses || 0) gt 0 and not _estrogenTried>>
<div class="btn"><<button "Convince them to take estrogen (1 dose)">>
<<set _estReturn = "Prison_Inmate">>
<<set _e = getInmate($prisonRoster, $activeInmateId)>>
<<set $prison.estrogenAttemptsToday = $prison.estrogenAttemptsToday || []>>
<<if _e and not $prison.estrogenAttemptsToday.includes(_e.id) and ($prison.estrogenDoses || 0) gt 0>>
<<run $prison.estrogenAttemptsToday.push(_e.id)>>
<<set _estDom = $player.attributes.dominance ? $player.attributes.dominance.value : $player.attributes.dexterity.value>>
<<set _estSpeech = $player.attributes.speech ? $player.attributes.speech.value : 3>>
<<set _estSpeaker = { persuasion: _estSpeech, dominance: _estDom, reputation: ($prison.rep || 0), rapport: (_e.stats ? _e.stats.trust : 0) }>>
<<set _estResult = resolvePrisonEstrogenPersuasion(_e, _estSpeaker)>>
<<if _estResult.success>><<set $prison.estrogenDoses = Math.max(0, ($prison.estrogenDoses || 0) - 1)>><</if>>
<<set $inmateLine = _estResult.line>>
<<SpendTime 20>>
<<set _estTransfer = collectPrisonWomensTransfers()>>
<<if _estTransfer.text>>
<<set $prisonIncidentMsg = $inmateLine + " " + _estTransfer.text>>
<<set $inmateLine = "">>
<<set $activeInmateId = null>>
<<if $prison>><<set $prison.sceneAuthority = null>><</if>>
<<set _estReturn = "Prison_Block">>
<</if>>
<</if>>
<<goto _estReturn>>
<</button>></div>
<<elseif ($prison.estrogenDoses || 0) is 0>>
<div class="prison-actnote">A private conversation about estrogen needs a dose in hand. Diverted tablets are sold at commissary.</div>
<<elseif _estrogenTried>>
<div class="prison-actnote">You have already pressed the estrogen question with <<= _inm.name>> today.</div>
<</if>>
<</if>>
<div class="btn"><<button "Shoot the shit">>
<<SpendTime 10>>
<<set _e = getInmate($prisonRoster, $activeInmateId)>>
<<if _e.talkDay isnot ($prison.stintDay || 0)>><<set _e.talkDay = ($prison.stintDay || 0)>><<set _e.talkTrust = 0>><</if>>
<<set _tGain = Math.min(2, Math.max(0, 7 - (_e.talkTrust || 0)))>>
<<set _e.talkTrust = (_e.talkTrust || 0) + _tGain>>
<<set _e.stats.trust = Math.min(100, _e.stats.trust + _tGain)>>
<<PrisonEnsureDialogueMemory _e.id>>
<<set $inmateLine = smallTalkLine(_e, _e.stats.trust, undefined, 30, _conversationMemory.recent)>>
<<PrisonRememberDialogue _e.id $inmateLine>>
<<goto "Prison_Inmate">>
<</button>></div>
<<if _inm.stats.trust gte 35>>
<div class="btn"><<button "Ask what they know">>
<<SpendTime 10>>
<<set _e = getInmate($prisonRoster, $activeInmateId)>>
<<set _intel = inmateIntel(_e, $prisonRoster)>>
<<set $inmateLine = _intel.line>>
<<goto "Prison_Inmate">>
<</button>></div>
<</if>>
<<set _reassuredToday = ($prison.reassuredToday || []).includes(_inm.id)>>
<<if canReassure(_inm) and not _reassuredToday>>
<div class="btn"><<button "Steady them">>
<<set _e = getInmate($prisonRoster, $activeInmateId)>>
<<set $prison.reassuredToday = $prison.reassuredToday || []>>
<<if not $prison.reassuredToday.includes(_e.id)>><<run $prison.reassuredToday.push(_e.id)>><</if>>
<<set _rr = resolveReassure(_e)>>
<<if _e.gender isnot "Male">>
<<set $inmateLine = ["You sit beside her, keep your voice below the television, and name every person between this table and the door. Nobody is coming through them unnoticed. Her hands stop shaking long enough to light a cigarette.", "She is wound tight when you find her, watching every movement on the tier. You stay beside her until her breathing evens out, then walk one slow lap of the block together so she can see who is where."].random()>>
<<else>>
<<set $inmateLine = ["You sit beside him, keep your voice below the television, and name every person between this table and the door. Nobody is coming through them unnoticed. His hands stop shaking long enough to light a cigarette.", "He is wound tight when you find him, watching every movement on the tier. You stay beside him until his breathing evens out, then walk one slow lap of the block together so he can see who is where."].random()>>
<</if>>
<<goto "Prison_Inmate">>
<</button>></div>
<</if>>
/* Squaring a beef. An enemy is locked out of every warm action and out of
canBecomeLover, so without a way back the con was dead content for the rest of
the stint. Three routes, one attempt per inmate per day. */
<<set _amendsDone = ($prison.amendsToday || []).includes(_inm.id)>>
<<if canMakeAmends(_inm) and not _amendsDone>>
<<set _amendsPayChance = amendsChance(_inm, "pay", ($prison.rep || 0))>>
<<set _amendsHumbleChance = amendsChance(_inm, "humble", ($prison.rep || 0))>>
<<set _amendsBrokerChance = amendsChance(_inm, "broker", ($prison.rep || 0))>>
<<set _amendsPayLabel = "Pay " + _inm.name + " off and call it square (" + AMENDS_SCRIP + " scrip, " + _amendsPayChance + "%)">>
<<set _amendsHumbleLabel = "Say it out loud where the tier can hear (" + _amendsHumbleChance + "%)">>
<<set _amendsBrokerLabel = "Send somebody with weight to speak for you (" + _amendsBrokerChance + "%)">>
<div class="prison-actnote">There is bad blood between you and <<= _inm.name>>. Until it is settled, <<= _inm.gender isnot "Male" ? "she" : "he">> will not take anything from you.</div>
<<if ($prison.scrip || 0) gte AMENDS_SCRIP>>
<div class="btn"><<button _amendsPayLabel>>
<<set _e = getInmate($prisonRoster, $activeInmateId)>>
<<set $prison.amendsToday = $prison.amendsToday || []>>
<<set _am = resolveAmends(_e, "pay", ($prison.rep || 0), ($prison.scrip || 0), Math.random, $prison)>>
<<if _am.attempted>>
<<set $prison.scrip = Math.max(0, ($prison.scrip || 0) + _am.scripDelta)>>
<<set $prison.rep = Math.max(0, Math.min(100, ($prison.rep || 0) + _am.repDelta))>>
<<set $inmateLine = _am.line>>
<<SpendTime 15>>
<</if>>
<<goto "Prison_Inmate">>
<</button>></div>
<<else>>
<div class="prison-actnote"><strong>Pay it off:</strong> needs <<= AMENDS_SCRIP>> scrip (you have <<= $prison.scrip || 0>>).</div>
<</if>>
<div class="btn"><<button _amendsHumbleLabel>>
<<set _e = getInmate($prisonRoster, $activeInmateId)>>
<<set $prison.amendsToday = $prison.amendsToday || []>>
<<set _am = resolveAmends(_e, "humble", ($prison.rep || 0), ($prison.scrip || 0), Math.random, $prison)>>
<<if _am.attempted>>
<<set $prison.rep = Math.max(0, Math.min(100, ($prison.rep || 0) + _am.repDelta))>>
<<set $inmateLine = _am.line>>
<<SpendTime 15>>
<</if>>
<<goto "Prison_Inmate">>
<</button>></div>
<div class="btn"><<button _amendsBrokerLabel>>
<<set _e = getInmate($prisonRoster, $activeInmateId)>>
<<set $prison.amendsToday = $prison.amendsToday || []>>
<<set _am = resolveAmends(_e, "broker", ($prison.rep || 0), ($prison.scrip || 0), Math.random, $prison)>>
<<if _am.attempted>>
<<set $prison.rep = Math.max(0, Math.min(100, ($prison.rep || 0) + _am.repDelta))>>
<<set $inmateLine = _am.line>>
<<SpendTime 15>>
<</if>>
<<goto "Prison_Inmate">>
<</button>></div>
<<elseif canMakeAmends(_inm)>>
<div class="prison-actnote">You have already made your approach to <<= _inm.name>> today. Let it sit until tomorrow.</div>
<</if>>
/* Asking a heavy for a wall. The pair actions could arrange protection for two
other inmates; the player could never ask for it directly outside the prologue
and the wolf-debt quest. Safety costs standing here, same as it always has. */
<<set _wallOffer = protectionOffer(_inm, ($prison.scrip || 0), $prison.protected is true)>>
<<if _wallOffer.available>>
<<set _wallLabel = "Ask " + _inm.name + " to stand behind you (" + _wallOffer.scripCost + " scrip, " + _wallOffer.chance + "%)">>
<div class="btn"><<button _wallLabel>>
<<set _e = getInmate($prisonRoster, $activeInmateId)>>
<<set _wall = resolveAskProtection(_e, ($prison.scrip || 0), $prison.protected is true, Math.random)>>
<<if _wall.attempted>>
<<set $prison.scrip = Math.max(0, ($prison.scrip || 0) + _wall.scripDelta)>>
<<set $prison.rep = Math.max(0, Math.min(100, ($prison.rep || 0) + _wall.repDelta))>>
<<if _wall.success>>
<<set $prison.protected = true>>
<<set $prison.protectorId = _e.id>>
<</if>>
<<set $inmateLine = _wall.line>>
<<SpendTime 20>>
<</if>>
<<goto "Prison_Inmate">>
<</button>></div>
<<elseif not ($prison.protected is true) and _wallOffer.reasons.length gt 0>>
<<set _wallWhy = _wallOffer.reasons.join(" ")>>
<div class="prison-actnote"><strong>Ask <<= _inm.name>> for a wall:</strong> <<= _wallWhy>></div>
<</if>>
</div>
</div>
<div class="prison-icat prison-icat--together">
<div class="prison-icat__head"><span class="prison-icat__icon">♟</span><span class="prison-icat__title">Do time together</span></div>
<div class="prison-icat__body">
<<set _socialDom = $player.attributes.dominance ? $player.attributes.dominance.value : $player.attributes.dexterity.value>>
<<set _socialIsCelly = ($prison.cellmateId isnot undefined and _inm.id is $prison.cellmateId)>>
<<set _socialCtx = { playerRep: ($prison.rep || 0), playerScrip: ($prison.scrip || 0), playerGender: $player.gender(), playerDominance: _socialDom, playerActiveSexBlocked: prisonPlayerActiveSexBlocked($player, $playerlock), stintDay: getPrisonStintDay(), isCellmate: _socialIsCelly }>>
<<set _socialActs = PRISON_COMPANION_ACTIONS>>
<<if _socialIsCelly>><div class="prison-actnote">You are locked in with <<= _inm.name>> every night. Whatever you build with <<= _inm.gender isnot "Male" ? "her" : "him">> moves faster than anything on the tier.</div><</if>>
<<set _socialShown = 0>>
<<for _social range _socialActs>>
<<capture _social>>
<<if not _social.adult>>
/* Paying actions (run_hustle & co) share one daily budget on top of the
per-inmate token - the roster is too wide for per-target income taps. */
<<set _socialAvailability = prisonCompanionActionAvailability(_social.key, _inm, _socialCtx)>>
<<set _socialUnused = not hasUsedPrisonSocialAction($prison, _social.key, _inm.id)>>
<<set _socialPayReady = (not isPayingPrisonSocialAction(_social.key) or prisonSocialPayBudgetLeft($prison) gt 0)>>
<<set _socialEnabled = (_socialAvailability.available and _socialUnused and _socialPayReady)>>
<<set _socialShown += 1>>
<<set _socialChance = _socialAvailability.chance || 0>>
<<set _socialLabel = _social.label + (_socialEnabled ? " (" + _socialChance + "%)" : "")>>
<<if _socialEnabled>>
<div class="btn"><<button _socialLabel>>
<<set _e = getInmate($prisonRoster, $activeInmateId)>>
<<set _liveDom = $player.attributes.dominance ? $player.attributes.dominance.value : $player.attributes.dexterity.value>>
<<set _ctx = { playerRep: ($prison.rep || 0), playerScrip: ($prison.scrip || 0), playerGender: $player.gender(), playerDominance: _liveDom, playerActiveSexBlocked: prisonPlayerActiveSexBlocked($player, $playerlock), stintDay: getPrisonStintDay(), isCellmate: ($prison.cellmateId isnot undefined and _e and _e.id is $prison.cellmateId) }>>
<<set _liveAvailability = prisonCompanionActionAvailability(_social.key, _e, _ctx)>>
<<set _socialLive = (_e and _liveAvailability.available and not hasUsedPrisonSocialAction($prison, _social.key, _e.id) and (not isPayingPrisonSocialAction(_social.key) or prisonSocialPayBudgetLeft($prison) gt 0))>>
<<if _socialLive>>
<<set _out = resolvePrisonCompanionAction(_social.key, _e, _ctx, Math.random)>>
<<if _out.valid>>
<<set $prison.scrip = Math.max(0, ($prison.scrip || 0) + _out.scripDelta)>>
<<set $prison.rep = Math.max(0, Math.min(100, ($prison.rep || 0) + _out.repDelta))>>
<<set $prison.heat = Math.max(0, Math.min(100, ($prison.heat || 0) + _out.heatDelta))>>
<<if _out.energyCost gt 0>><<SpendEnergy $player _out.energyCost>><</if>>
<<if _out.minutes gt 0>><<SpendTime _out.minutes>><</if>>
<<run markPrisonSocialAction($prison, _social.key, _e.id)>>
<<set $inmateLine = _out.line>>
<</if>>
<<goto "Prison_Inmate">>
<</if>>
<</button>></div>
<<else>>
<<set _socialReason = not _socialUnused ? "Already attempted with this inmate today." : (not _socialPayReady ? "Daily tier-business budget exhausted." : _socialAvailability.reasons.join(" "))>>
<div class="prison-actnote"><strong><<= _social.label>>:</strong> <<= _socialReason>></div>
<</if>>
<</if>>
<</capture>>
<</for>>
<<set _ownedSissies = prisonSissiesOwnedBy(_inm, $prisonRoster)>>
<<for _ownedSissy range _ownedSissies>>
<<capture _ownedSissy>>
<<set _sissyPrice = Math.max(1, Number(_ownedSissy.sissyUsePrice || 1))>>
<<set _sissyRented = ($prison.sissyRentalsToday || []).includes(_inm.id)>>
<<set _sissyAllowed = CheckContentFilter(prisonSexGender(_ownedSissy), $player) and not prisonPlayerActiveSexBlocked($player, $playerlock)>>
<<if _sissyRented>>
<div class="prison-actnote">You already rented <<= _ownedSissy.name>> from <<= _inm.name>> today.</div>
<<else>>
<<for _rentalAct range ["oral", "anal"]>>
<<capture _ownedSissy _rentalAct>>
<<if _rentalAct is "oral">>
<<set _rentLabel = "Rent " + _ownedSissy.name + " for oral (" + _sissyPrice + " scrip)">>
<<else>>
<<set _rentLabel = "Rent " + _ownedSissy.name + " for anal (" + _sissyPrice + " scrip)">>
<</if>>
<<if _sissyAllowed>>
<div class="btn"><<button _rentLabel>>
<<set _ownerLive = getInmate($prisonRoster, $activeInmateId)>>
<<set _sissyLive = getInmate($prisonRoster, _ownedSissy.id)>>
<<set _rentalActLive = _rentalAct>>
<<set _priceLive = _sissyLive ? Math.max(1, Number(_sissyLive.sissyUsePrice || 1)) : 999>>
<<set _rentalLive = (_ownerLive and _sissyLive and (_rentalActLive is "oral" or _rentalActLive is "anal") and isPrisonSissy(_sissyLive) and _sissyLive.sissyOwnerId is _ownerLive.id and CheckContentFilter(prisonSexGender(_sissyLive), $player) and not prisonPlayerActiveSexBlocked($player, $playerlock) and not ($prison.sissyRentalsToday || []).includes(_ownerLive.id))>>
<<if _rentalLive>>
<<if ($prison.scrip || 0) gte _priceLive>>
<<set $prison.scrip = Math.max(0, ($prison.scrip || 0) - _priceLive)>>
<<set $prison.sissyRentalsToday = $prison.sissyRentalsToday || []>>
<<run $prison.sissyRentalsToday.push(_ownerLive.id)>>
<<set _sissyGender = prisonSexGender(_sissyLive)>>
<<if _rentalActLive is "oral">>
<<SetOralPick $player.gender() _sissyGender>>
<<else>>
<<SetAnalPick $player.gender() _sissyGender>>
<</if>>
<<set $moveVideo = _pick>>
<<set $movePlayerRole = "dom">>
<<set $inmateLine = prisonSissyRentalLine(_ownerLive, _sissyLive, $player.gender(), _priceLive, _rentalActLive)>>
<<SpendTime 25>>
<<else>>
<<set $inmateLine = prisonSissyRentalQuoteLine(_ownerLive, _sissyLive, _priceLive, ($prison.scrip || 0))>>
<<SpendTime 5>>
<</if>>
<</if>>
<<goto "Prison_Inmate">>
<</button>></div>
<<else>>
<<if prisonPlayerActiveSexBlocked($player, $playerlock)>>
<div class="prison-actnote"><strong><<= _rentLabel>>:</strong> The cage keeps your cock out of the rental. No scrip is charged.</div>
<<else>>
<div class="btn prison-sex-option--locked" data-tooltip="Requires an enabled pairing between your character and a shemale in the content filter."><button type="button" disabled><<= _rentLabel>></button></div>
<</if>>
<</if>>
<</capture>>
<</for>>
<</if>>
<</capture>>
<</for>>
<<if isPrisonSissy(_inm)>>
<<if isPlayerPrisonSissy(_inm)>>
<<set _ownSissyAllowed = CheckContentFilter(prisonSexGender(_inm), $player)>>
<<set _toyVoice = prisonToyVoice(_inm)>>
<<set _toyStage = Math.min(_inm.body.face, _inm.body.breast, _inm.body.butt)>>
<<if _inm.submission gte 2>>
<<set _toyHeel = ", and " + _toyVoice.they + " comes to heel before you ask">>
<<elseif _inm.submission gte 1>>
<<set _toyHeel = ", and " + _toyVoice.they + " stopped arguing a while ago">>
<<else>>
<<set _toyHeel = ", and the fight is not out of " + _toyVoice.them + " yet">>
<</if>>
<div class="centre-text" style="font-size:13px;">Yours: <<= submissionLabel(_inm.submission).toLowerCase()>><<= _toyHeel>>. Femininity <<= _toyStage>>/6.</div>
/* Ownership no longer rebuilds the body on the spot. The change is a lever
the owner works by hand, one diverted tablet at a time, and the block
watches it happen over weeks. */
<<set _toyDoseTaken = ($prison.toyDoseToday || []).includes(_inm.id)>>
<<set _toyDose = prisonToyEstrogenAvailability(_inm, ($prison.estrogenDoses || 0), _toyDoseTaken)>>
<<if _toyDose.allowed>>
<div class="btn"><<button "Make them drink estrogen (1 dose)">>
<<set _toyDoseReturn = "Prison_Inmate">>
<<set _toyLive = getInmate($prisonRoster, $activeInmateId)>>
<<set _toyDoseDone = ($prison.toyDoseToday || []).includes($activeInmateId)>>
<<set _toyDoseLive = prisonToyEstrogenAvailability(_toyLive, ($prison.estrogenDoses || 0), _toyDoseDone)>>
<<if _toyDoseLive.allowed>>
<<set $prison.toyDoseToday = $prison.toyDoseToday || []>>
<<run $prison.toyDoseToday.push(_toyLive.id)>>
<<set _toyDoseResult = forcePrisonToyEstrogen(_toyLive, { day: getPrisonStintDay(), byName: ($player.info.firstName || "you") })>>
<<if _toyDoseResult.applied>><<set $prison.estrogenDoses = Math.max(0, ($prison.estrogenDoses || 0) - 1)>><</if>>
<<set $inmateLine = _toyDoseResult.line>>
<<SpendTime 15>>
/* A dose that finishes the ladder takes them off the men's block
before the scene is over - the sweep runs here so the player is
told at once instead of finding an empty bunk in the morning. */
<<set _toyTransfer = collectPrisonWomensTransfers()>>
<<if _toyTransfer.text>>
<<set $prisonIncidentMsg = $inmateLine + " " + _toyTransfer.text>>
<<set $inmateLine = "">>
<<set $activeInmateId = null>>
<<if $prison>><<set $prison.sceneAuthority = null>><</if>>
<<set _toyDoseReturn = "Prison_Block">>
<</if>>
<</if>>
<<goto _toyDoseReturn>>
<</button>></div>
<<else>>
<div class="prison-actnote"><strong>Make them drink estrogen (1 dose):</strong> <<= _toyDose.reasons.join(" ")>></div>
<</if>>
<<if _ownSissyAllowed and not prisonPlayerActiveSexBlocked($player, $playerlock)>>
<<set _toyOralLabel = "Use your toy's mouth">>
<<set _toyAnalLabel = "Fuck your toy's ass">>
<div class="btn"><<button _toyOralLabel>>
<<set _ownSissyLive = getInmate($prisonRoster, $activeInmateId)>>
<<if _ownSissyLive and isPlayerPrisonSissy(_ownSissyLive) and CheckContentFilter(prisonSexGender(_ownSissyLive), $player) and not prisonPlayerActiveSexBlocked($player, $playerlock)>>
/* Every use walks the ownership arc. A still-resentful sissy can
balk, which costs the scene instead of handing over a free one. */
<<set _ownSissyUse = useClaimedPunk(_ownSissyLive)>>
<<if _ownSissyUse.resisted>>
<<set $inmateLine = prisonPlayerSissyResistLine(_ownSissyLive, "oral")>>
<<SpendTime 10>>
<<else>>
<<set _ownSissyGender = prisonSexGender(_ownSissyLive)>>
<<SetOralPick $player.gender() _ownSissyGender>>
<<set $moveVideo = _pick>>
<<set $movePlayerRole = "dom">>
<<set $inmateLine = prisonPlayerSissyUseLine(_ownSissyLive, $player.gender(), "oral")>>
<<if _ownSissyUse.advanced>><<set $inmateLine += " " + prisonSissyBreakInLine(_ownSissyLive, _ownSissyUse.stage)>><</if>>
<<SetCharProgression $player "dominance" 1 true>>
<<SpendTime 20>>
<</if>>
<</if>>
<<goto "Prison_Inmate">>
<</button>></div>
<div class="btn"><<button _toyAnalLabel>>
<<set _ownSissyLive = getInmate($prisonRoster, $activeInmateId)>>
<<if _ownSissyLive and isPlayerPrisonSissy(_ownSissyLive) and CheckContentFilter(prisonSexGender(_ownSissyLive), $player) and not prisonPlayerActiveSexBlocked($player, $playerlock)>>
<<set _ownSissyUse = useClaimedPunk(_ownSissyLive)>>
<<if _ownSissyUse.resisted>>
<<set $inmateLine = prisonPlayerSissyResistLine(_ownSissyLive, "anal")>>
<<SpendTime 10>>
<<else>>
<<set _ownSissyGender = prisonSexGender(_ownSissyLive)>>
<<SetAnalPick $player.gender() _ownSissyGender>>
<<set $moveVideo = _pick>>
<<set $movePlayerRole = "dom">>
<<set $inmateLine = prisonPlayerSissyUseLine(_ownSissyLive, $player.gender(), "anal")>>
<<if _ownSissyUse.advanced>><<set $inmateLine += " " + prisonSissyBreakInLine(_ownSissyLive, _ownSissyUse.stage)>><</if>>
<<SetCharProgression $player "dominance" 1 true>>
<<SpendTime 25>>
<</if>>
<</if>>
<<goto "Prison_Inmate">>
<</button>></div>
<<elseif prisonPlayerActiveSexBlocked($player, $playerlock)>>
<div class="prison-actnote">Your locked cock cannot be used on your toy. Send them out on loan or leave without sex.</div>
<<else>>
<div class="prison-actnote">Your current content-filter pairing does not provide matching media for this toy.</div>
<</if>>
/* The boss's string is an asset, not just an appetite: the tier pays to
borrow what you own, once per head per day. */
<<set _rentOutTaken = ($prison.sissyRentOutToday || []).includes(_inm.id)>>
<<if _rentOutTaken>>
<<set _rentOutNote = _inm.name + " has already been out on loan today. The tier gets " + _toyVoice.them + " again tomorrow.">>
<div class="prison-actnote"><<= _rentOutNote>></div>
<<elseif _inm.submission lt 1>>
<<set _rentOutNote = _inm.name + " is not broken in enough to send out alone yet. Somebody would get hurt, or " + _toyVoice.they + " would talk.">>
<div class="prison-actnote"><<= _rentOutNote>></div>
<<else>>
<<set _rentOutQuote = prisonSissyRentOutPrice(_inm, ($prison.rep || 0))>>
<<set _rentOutLabel = "Put " + _inm.name + " out on loan (" + _rentOutQuote + " scrip)">>
<div class="btn"><<button _rentOutLabel>>
<<set _rentOutLive = getInmate($prisonRoster, $activeInmateId)>>
<<set _rentOutDone = ($prison.sissyRentOutToday || []).includes($activeInmateId)>>
<<if _rentOutLive and isPlayerPrisonSissy(_rentOutLive) and not _rentOutDone and _rentOutLive.submission gte 1>>
<<set $prison.sissyRentOutToday = $prison.sissyRentOutToday || []>>
<<run $prison.sissyRentOutToday.push(_rentOutLive.id)>>
<<set _rentOutResult = resolvePrisonSissyRentOut(_rentOutLive, ($prison.rep || 0))>>
<<set $prison.scrip = ($prison.scrip || 0) + _rentOutResult.scrip>>
<<set $prison.rep = Math.max(0, Math.min(100, ($prison.rep || 0) + _rentOutResult.rep))>>
<<set $inmateLine = _rentOutResult.line>>
<<SpendTime 30>>
<</if>>
<<goto "Prison_Inmate">>
<</button>></div>
<</if>>
<<elseif isPrisonSissy(_inm)>>
<<set _sissyAskLabel = "Ask " + _inm.name + " for sex">>
<div class="btn"><<button _sissyAskLabel>>
<<set _e = getInmate($prisonRoster, $activeInmateId)>>
<<set $inmateLine = prisonSissyRefusalLine(_e, $prisonRoster)>>
<<SpendTime 5>>
<<goto "Prison_Inmate">>
<</button>></div>
<</if>>
<</if>>
<<set _sexContentAllowed = isAdultPrisonInmate(_inm) and not isPrisonSissy(_inm) and CheckContentFilter(prisonSexGender(_inm), $player)>>
<<if _sexContentAllowed>>
<<set _activeSexChance = prisonActiveSexChance(_inm, _socialCtx)>>
<<set _sexEntryLabel = '<span class="prison-sex-entry__button-title">Find a private moment</span><span class="prison-sex-entry__button-copy">Choose an approach and read their answer.</span>'>>
<section class="prison-sex-entry">
<div class="prison-sex-entry__copy">
<span class="prison-sex-entry__eyebrow">Intimacy</span>
<strong>Read the room before you make a move</strong>
<span>Letting them lead is safe once trust is there. Taking charge still depends on your standing.</span>
</div>
<div class="prison-sex-entry__signals" aria-label="Current intimacy outlook">
<span data-role="passive">Let them lead · willing</span>
<span data-role="active">Take the lead · <<if _activeSexChance gt 0>><<= _activeSexChance>>% chance<<else>>not yet<</if>></span>
</div>
<div class="btn prison-sex-entry__cta"><<button _sexEntryLabel>>
<<set $prison.sceneAuthority = { scene: "prisonSexSelect", stintDay: getPrisonStintDay(), targetId: _inm.id, block: $player.info.currentLocation }>>
<<goto "Prison_SexSelect">>
<</button>></div>
</section>
<<set _socialShown += 1>>
<</if>>
<<set _pairCount = prisonPairCandidates(_inm, $prisonRoster).length>>
<<if _pairCount gt 0>>
<div class="btn"><<button "Bring someone else into it">>
<<set $pairTargetId = null>>
<<set $pairLine = "">>
<<goto "Prison_PairSelect">>
<</button>></div>
<</if>>
<<if _socialShown is 0>><div class="prison-actnote">More shared options open with trust, scrip, and the right kind of partner.</div><</if>>
</div>
</div>
<div class="prison-icat prison-icat--tier">
<div class="prison-icat__head"><span class="prison-icat__icon">🤝</span><span class="prison-icat__title">The tier</span></div>
<div class="prison-icat__body">
<<if not $prison.tierSwayToday>>
<div class="btn"><<button "Put in a word for them on the tier">>
<<set _e = getInmate($prisonRoster, $activeInmateId)>>
<<set _heC = (_e.gender isnot "Male") ? "She" : "He">>
<<set _him = (_e.gender isnot "Male") ? "her" : "him">>
<<set _res = resolveSway(_e, "up", ($prison.rep || 0), undefined, $prison)>>
<<if not _res.attempted>>
<<set $inmateLine = "You have already spent today's gossip moving one name on the tier.">>
<<else>>
<<SpendTime 120>>
<<if _res.success>>
<<set $inmateLine = "For two hours you work the tables and the rail, repeating the same three points: " + _e.name + " pays debts, keeps quiet, and stands up when it matters. Before you finish the last lap, two people who used to ignore " + _him + " make room on their bench.">>
<<else>>
<<set $inmateLine = "You try to talk " + _e.name + " up, but your own word does not carry far enough yet, and it reaches " + _him + " mangled, like you were angling at something. " + _heC + " eyes you a shade cooler than before.">>
<</if>>
<</if>>
<<goto "Prison_Inmate">>
<</button>></div>
<<if not isAllyOfPlayer(_inm) and not isLoverOfPlayer(_inm) and not isClaimedByPlayer(_inm)>>
<div class="btn"><<button "Quietly run them down to the tier">>
<<set _e = getInmate($prisonRoster, $activeInmateId)>>
<<set _heC = (_e.gender isnot "Male") ? "She" : "He">>
<<set _him = (_e.gender isnot "Male") ? "her" : "him">>
<<set _his = (_e.gender isnot "Male") ? "her" : "his">>
<<set _himself = (_e.gender isnot "Male") ? "herself" : "himself">>
<<set _res = resolveSway(_e, "down", ($prison.rep || 0), undefined, $prison)>>
<<if not _res.attempted>>
<<set $inmateLine = "You have already spent today's gossip moving one name on the tier.">>
<<else>>
<<SpendTime 120>>
<<if _res.success>>
<<set $inmateLine = "You spend two hours feeding the tier small doubts about " + _e.name + ": a debt paid late, a story that changes, a promise nobody remembers seeing kept. By the time you circle back, people are checking " + _his + " claims instead of taking them on faith. " + _heC + " has not traced it to you.">>
<<else>>
<<set $inmateLine = "You start working " + _e.name + "'s name down the tier. The story circles back with your name attached. " + _heC + " knows who started it and shuts you out.">>
<</if>>
<</if>>
<<goto "Prison_Inmate">>
<</button>></div>
<</if>>
<<else>>
<div class="prison-actnote">You have already spent today's gossip moving one name on the tier. By tomorrow, people may listen again.</div>
<</if>>
<<if canFormAlliance(_inm)>>
<div class="btn"><<button "Offer to watch each other's backs">>
<<set _e = getInmate($prisonRoster, $activeInmateId)>>
<<run formPrisonAlliance(_e)>>
<<run unlockPrisonAchievement('alliance')>>
<<if _e.gender isnot "Male">>
<<set $inmateLine = "You lay out the terms: if somebody comes for one of you, the other gets off the bunk. She checks that you mean it, grips your hand, and tells you which table is hers at chow. From now on, you sit there too.">>
<<else>>
<<set $inmateLine = "You lay out the terms: if somebody comes for one of you, the other gets off the bunk. He checks that you mean it, grips your hand, and tells you which table is his at chow. From now on, you sit there too.">>
<</if>>
<<set $inmateLine = $inmateLine + " " + allianceReplyLine(_e)>>
<<goto "Prison_Inmate">>
<</button>></div>
<<elseif isAllyOfPlayer(_inm)>>
<div class="prison-actnote"><<= (_inm.gender isnot "Male") ? "She" : "He">> rides with you - your back is <<= (_inm.gender isnot "Male") ? "hers" : "his">>, and <<= (_inm.gender isnot "Male") ? "hers" : "his">> is yours.</div>
<</if>>
<<if canVouch(_inm) and not $prison.vouchedToday>>
<div class="btn"><<button "Ask them to vouch for you">>
<<set $prison.vouchedToday = true>>
<<set _e = getInmate($prisonRoster, $activeInmateId)>>
<<set _v = resolvePrisonVouch(_e)>>
<<set $prison.rep = Math.min(100, ($prison.rep || 0) + _v.repDelta)>>
<<set $inmateLine = _e.name + " spends a little of their own name on yours, telling whoever will hear it that you are solid, that you are with them. The word carries as far as their standing does, and yours rises " + _v.repDelta + " before they return to your side.">>
<<goto "Prison_Inmate">>
<</button>></div>
<<elseif $prison.vouchedToday>>
<div class="prison-actnote">You have already leaned on someone's name today. Spread it thinner and it stops meaning anything. Come back tomorrow.</div>
<</if>>
<<if canFavor(_inm) and not $prison.favorToday>>
<div class="btn"><<button "Call in a favor">>
<<set $prison.favorToday = true>>
<<set _e = getInmate($prisonRoster, $activeInmateId)>>
<<set _fav = resolveFavor(_e)>>
<<if _fav.scrip>><<set $prison.scrip = ($prison.scrip || 0) + _fav.scrip>><</if>>
<<if _fav.rep>><<set $prison.rep = Math.min(100, ($prison.rep || 0) + _fav.rep)>><</if>>
<<set $inmateLine = _fav.line>>
<<goto "Prison_Inmate">>
<</button>></div>
<</if>>
</div>
</div>
<div class="prison-icat prison-icat--move">
<div class="prison-icat__head"><span class="prison-icat__icon">🔥</span><span class="prison-icat__title">Make a move</span></div>
<div class="prison-icat__body">
<<set _claimSissyAccess = prisonPlayerSissyClaimAvailability(_inm, ($prison.rep || 0))>>
<<if _claimSissyAccess.allowed>>
<div class="btn"><<button "Make them your toy (100%)">>
<<set _e = getInmate($prisonRoster, $activeInmateId)>>
<<set _claimSissyLive = prisonPlayerSissyClaimAvailability(_e, ($prison.rep || 0))>>
<<if _claimSissyLive.allowed and claimPrisonSissyForPlayer(_e, ($prison.rep || 0), { day: getPrisonStintDay(), byName: ($player.info.firstName || "you") })>>
<<set $inmateLine = prisonPlayerSissyClaimLine(_e)>>
<<SpendTime 180>>
<</if>>
<<goto "Prison_Inmate">>
<</button>></div>
<<elseif _inm.block is "M" and _inm.gender isnot "Female" and not isPrisonSissy(_inm)>>
<div class="prison-actnote"><strong>Make them your toy (100%):</strong> Requires reputation <<= PLAYER_SISSY_REP_GATE>> (current <<= Math.max(0, Math.min(100, Math.round($prison.rep || 0)))>>) and fear <<= PLAYER_SISSY_FEAR_GATE>> (current <<= _claimSissyAccess.fear>>). <<= _claimSissyAccess.reasons.join(" ")>></div>
<</if>>
<<set _foughtToday = ($prison.fightTargetsToday || []).includes(_inm.id)>>
<<if not _foughtToday>>
<<set _fightLabel = "Fight " + _inm.name>>
<div class="btn"><<button _fightLabel>>
<<set _e = getInmate($prisonRoster, $activeInmateId)>>
<<if _e>>
<<set $prison.fightTargetsToday = $prison.fightTargetsToday || []>>
<<run $prison.fightTargetsToday.push(_e.id)>>
<<set $prison.fight = { targetId: _e.id, source: "player", stintDay: getPrisonStintDay(), returnLocation: $player.info.currentLocation, resolved: false, dosed: false }>>
<<set $prison.sceneAuthority = { scene: "prisonFight", stintDay: getPrisonStintDay(), targetId: _e.id }>>
<<set $interactionNpc = createPrisonCombatant(_e, $player, getPrisonStintDay())>>
<<set _battleSetControls = { attack: true, seduce: false, items: false, actions: true, noEscape: true, noWeapons: true, forcePhysical: true, isolated: true }>>
<<SpendTime 20>>
<<StartFight $player $interactionNpc _battleSetControls "Prison_FightWon" "Prison_FightLost" "Fight" true>>
<</if>>
<</button>></div>
<<else>>
<div class="prison-actnote">You have already fought <<= _inm.name>> today. Another round waits until tomorrow.</div>
<</if>>
<<if $gameSettings.contentFilter.nonConsent === true and CheckContentFilter(_inm.gender, $player) and isClaimedByPlayer(_inm) and not isPlayerPrisonSissy(_inm) and not $prison.usedStringToday and not prisonPlayerActiveSexBlocked($player, $playerlock)>>
<div class="btn"><<button "Use your claimed punk for sex">>
<<if prisonPlayerActiveSexBlocked($player, $playerlock)>>
<<set $inmateLine = "Your cock is locked, so you leave them alone and keep today's use available.">>
<<goto "Prison_Inmate">>
<<else>>
<<set $prison.usedStringToday = true>>
<<SpendTime 20>>
<<set _e = getInmate($prisonRoster, $activeInmateId)>>
<<set _use = useClaimedPunk(_e)>>
<<set _stg = _use.stage>>
<<if _stg gte 2>><<run unlockPrisonAchievement('brokeIn')>><</if>>
<<set _domG = $player.gender()>>
<<set _subG = _e.gender>>
<<SetAnalPick _domG _subG>>
<<set $moveVideo = _pick>>
<<set $movePlayerRole = "dom">>
<<set _useTool = ($player.gender() is "Female") ? "prison-made strap" : "cock">>
<<set _useCumHer = ($player.gender() is "Female") ? "You leave the strap inside her ass and work the harness against your cunt until you cum." : "You cum in her ass without easing your grip.">>
<<set _useCumHim = ($player.gender() is "Female") ? "You leave the strap inside his ass and work the harness against your cunt until you cum." : "You cum in his ass without easing your grip.">>
<<set _useOral = ($player.gender() is "Female") ? "licks your cunt" : "sucks your cock">>
<<if _e.gender is "Female">>
<<if _use.resisted>>
<<set $inmateLine = ["She twists when you reach for her, so you grab her hair, put her down on the bunk, and force your " + _useTool + " into her ass. She glares over her shoulder through every stroke. " + _useCumHer + " You leave her to pull up her blues.", "She goes stiff and spits a curse when you crowd her into the bunk. You pin her down and fuck her ass with your " + _useTool + " while she fights you for the full twenty minutes. " + _useCumHer + " She will not look at you afterward."].random()>>
<<elseif _stg lte 0>>
<<set $inmateLine = ["She comes when you make her, sullen and stiff, and lies there while you work your " + _useTool + " into her ass. Her jaw stays set and her eyes stay on the wall until you cum. When you move your hand, she flinches before fixing her blues.", "You bend her over the bunk and she takes your " + _useTool + " in her ass rather than take the box. " + _useCumHer + " She yanks her blues up, checks the open door, and leaves without meeting your eye."].random()>>
<<elseif _stg is 1>>
<<set $inmateLine = ["She does not fight anymore. She comes when you crook a finger and lies quiet on the hard bunk while you fuck her ass with your " + _useTool + ". " + _useCumHer + " Being yours is the only safe thing she has left, and she has made her peace with the price.", "She lies back and lets you push your " + _useTool + " into her ass and fuck her slowly, compliant and silent. " + _useCumHer + " She gathers herself without a word, resigned to being yours because on this block it keeps her safe."].random()>>
<<else>>
<<set $inmateLine = ["She is waiting before you ask, blues already half off. You bend her over, push your " + _useTool + " into her ass, and fuck her while she pushes back with a practiced sigh. She cums under you; " + _useCumHer.toLowerCase() + " She stays bent over while you catch your breath.", "You do not have to say a word. She lies across your lap, takes your " + _useTool + " in her ass, and rides it slow and quiet the way you trained her to. She cums with your name in her mouth; " + _useCumHer.toLowerCase() + " The routine keeps her whole and wanting.", "She strips without ceremony, " + _useOral + " until you are hard or wet, then lies face down. You fuck her ass with your " + _useTool + " until she cums into the sheet. " + _useCumHer + " Being yours is a routine now, and the routine runs itself."].random()>>
<</if>>
<<elseif _e.gender is "Shemale">>
<<if _use.resisted>>
<<set $inmateLine = ["She still bucks when you reach for her, her own cock forgotten in the fight. You put her face down, push your " + _useTool + " into her ass, and fuck her over her cursing. " + _useCumHer + " Hers on paper, not yet in the way that counts.", "She twists and swears until you pin her wrists and fuck her ass with your " + _useTool + ". She takes every thrust glaring at the wall, giving you her body and nothing else. " + _useCumHer + " The wanting will take more nights to break into her."].random()>>
<<elseif _stg lte 0>>
<<set $inmateLine = ["She drops to the bunk when you make her, sullen and silent, and takes your " + _useTool + " in her ass with her own cock ignored against the sheet. You fuck her until you cum. She dresses fast and scrubs the wet spot with her sleeve.", "You bend her over and she takes your " + _useTool + " in her ass because the box is worse. " + _useCumHer + " She pulls up her blues and stands at the door until you let her leave."].random()>>
<<elseif _stg is 1>>
<<set $inmateLine = ["She does not fight anymore. She drops to the bunk when you crook a finger and takes your " + _useTool + " in her ass without a word. You fuck her until you cum. Being your punk is her only protection, and she clings to it, the fight gone if not the shame.", "You bend her over and fuck her ass with your " + _useTool + " the way you always do now. Her own cock stays neglected against her belly. " + _useCumHer + " She holds still afterward, resigned to being yours and safer for it."].random()>>
<<else>>
<<set $inmateLine = ["She is on the bunk with her blues down before you cross the cell. You push your " + _useTool + " into her ass and fuck her slowly while stroking her cock. She cums between you; " + _useCumHer.toLowerCase() + " Your name stays in her mouth like a lifeline.", "She kneels and " + _useOral + " first, unasked, then climbs onto the bunk and offers her ass. You fuck her with your " + _useTool + " while stroking her cock until she cums. " + _useCumHer + " Being wanted is the only wall she has.", "There is no ceremony anymore. She strips, gets face down, and takes your " + _useTool + " in her ass, willing and wanting. She cums untouched against the sheet; " + _useCumHer.toLowerCase() + " She stays put while you catch your breath against her spine."].random()>>
<</if>>
<<else>>
<<if _use.resisted>>
<<set $inmateLine = ["He shoves back when you reach for him, so you grab his collar, put him down, and push your " + _useTool + " into his ass. You fuck him while he glares over his shoulder. " + _useCumHim + " He pulls up his blues without looking at you.", "He twists and curses until you pin his wrists and fuck his ass with your " + _useTool + ". He fights you for the full twenty minutes. " + _useCumHim + " He leaves the bunk stiff and silent."].random()>>
<<elseif _stg lte 0>>
<<set $inmateLine = ["He takes your " + _useTool + " in his ass because the alternative is worse, not because he has given in. Sullen and rigid on the bunk, he stares at the wall until you cum. He yanks his blues up and will not look at you. Owning him is real. His wanting it is not.", "You bend him over and fuck his ass with your " + _useTool + " while he stays silent and hating it. " + _useCumHim + " The fight is still under the surface, and breaking it will take more nights."].random()>>
<<elseif _stg is 1>>
<<set $inmateLine = ["He does not fight anymore. He drops to the bunk when you crook a finger and takes your " + _useTool + " in his ass without a word. You fuck him until you cum. Being your punk is his only protection, and he clings to it, the fight gone if not the shame.", "You bend him over and fuck his ass with your " + _useTool + " the way you always do now. " + _useCumHim + " He holds still afterward, not eager yet, just resigned to being yours because it keeps him whole."].random()>>
<<else>>
<<set $inmateLine = ["He is on the bunk with his blues down before you cross the cell. You push your " + _useTool + " into his ass and fuck him slowly until he cums untouched against the sheet. " + _useCumHim + " Your name stays in his mouth like a lifeline.", "He kneels and " + _useOral + " first, unasked, then bends over the bunk and offers his ass. You fuck him with your " + _useTool + " while stroking his cock until he cums. " + _useCumHim + " Being wanted is the only wall he has.", "There is no ceremony left. He strips, gets face down, and takes your " + _useTool + " in his ass, willing and wanting. " + _useCumHim + " He stays where he is and lets you breathe against his neck. He is yours, fully and without argument."].random()>>
<</if>>
<</if>>
<<goto "Prison_Inmate">>
<</if>>
<</button>></div>
<<elseif $gameSettings.contentFilter.nonConsent === true and CheckContentFilter(_inm.gender, $player) and isClaimedByPlayer(_inm)>>
<div class="prison-actnote">You have taken your fill of <<= _inm.name>> today. <<= _she ? "She" : "He">> stays yours - the string keeps until the count comes again.</div>
<</if>>
<<if $gameSettings.contentFilter.nonConsent === true and CheckContentFilter(_inm.gender, $player) and isClaimedByPlayer(_inm) and not isPlayerPrisonSissy(_inm) and not $prison.usedStringToday and prisonPlayerActiveSexBlocked($player, $playerlock)>>
<div class="prison-actnote">You cannot fuck <<= _inm.name>> while your cock is caged. Leave without sex.</div>
<</if>>
<<if isClaimedByPlayer(_inm)>>
<<if $gameSettings.contentFilter.nonConsent === true and CheckContentFilter(_inm.gender, $player) and not $prison.pimpedToday>>
<<set _pimpHim = (_inm.gender isnot "Male") ? "her" : "him">>
<<set _pimpLbl = "Put " + _pimpHim + " to work">>
<div class="btn"><<button _pimpLbl>>
<<set $prison.pimpedToday = true>>
<<SpendTime 120>>
<<set _earn = random(6, 14)>>
<<set $prison.scrip = ($prison.scrip || 0) + _earn>>
<<set $prison.rep = Math.min(100, ($prison.rep || 0) + 2)>>
<<set _e = getInmate($prisonRoster, $activeInmateId)>>
<<if _e.stats>><<set _e.stats.shame = Math.min(100, (_e.stats.shame || 0) + 5)>><</if>>
<<if _e.gender is "Female">>
<<set _pbase = [
"You send her down the tier to whoever is holding scrip, and she knows better than to come back light. They fuck her in the dark and she brings you the packs after, not once meeting your eye.",
"Word is out that your woman is earning, and a quiet line forms by the showers. She takes each customer behind the partition and hands you every pack when she comes out, watching your face before she dares keep her eyes up.",
"You point her at the ones holding the most scrip and she goes. They take her into the blind corners in pairs and threes, bend her over, and fuck her. She returns with every pack still warm and puts them into your hand."
].random()>>
<<elseif _e.gender is "Shemale">>
<<set _pbase = [
"You send her down the tier to whoever is holding scrip, and she knows better than to come back light. She sucks their cocks on her knees in the dark and brings you the packs after, eyes on the floor.",
"Word is out that your woman is earning, and a line forms in the shower blind. She sucks every cock sent behind the partition, then brings you the packs and waits for permission to rinse her mouth.",
"You send her down the tier to suck off anyone holding scrip, then let the high rollers fuck her ass in the camera blinds. Her own cock stays untouched through all of it. Two hours later she hands you the whole take."
].random()>>
<<else>>
<<set _pbase = [
"You send him down the tier to whoever is holding scrip, and he knows better than to come back light. He sucks their cocks on his knees in the dark and brings you the packs after, eyes on the floor.",
"Word is out that your punk is earning, and a line forms in the shower blind. He sucks every cock sent behind the partition, then brings you the packs and waits for permission to rinse his mouth.",
"You put him on his knees for the men holding scrip, then bend him over for anyone paying extra to fuck his ass. Two hours later he brings you the full take without meeting your eye."
].random()>>
<</if>>
<<set $inmateLine = _pbase + " Your cut comes to " + _earn + " scrip.">>
<<goto "Prison_Inmate">>
<</button>></div>
<</if>>
<<if $gameSettings.contentFilter.nonConsent === true and CheckContentFilter(_inm.gender, $player) and not $prison.servicedToday and not prisonPlayerActiveSexBlocked($player, $playerlock)>>
<<set _svcLbl = "Make " + ((_inm.gender isnot "Male") ? "her" : "him") + (($player.gender() is "Female") ? " lick your cunt" : " suck your cock")>>
<div class="btn"><<button _svcLbl>>
<<if prisonPlayerActiveSexBlocked($player, $playerlock)>>
<<set $inmateLine = "The cage prevents anyone from servicing your locked penis. You leave the order unmade.">>
<<goto "Prison_Inmate">>
<<else>>
<<set $prison.servicedToday = true>>
<<SpendTime 10>>
<<set _e = getInmate($prisonRoster, $activeInmateId)>>
<<if _e.stats>><<set _e.stats.shame = Math.min(100, (_e.stats.shame || 0) + 3)>><</if>>
<<SetOralPick $player.gender() _e.gender>>
<<set $moveVideo = _pick>>
<<set $movePlayerRole = "dom">>
<<set _svcShe = (_e.gender is "Male") ? "he" : "she">>
<<set _svcSheC = (_e.gender is "Male") ? "He" : "She">>
<<set _svcHer = (_e.gender is "Male") ? "his" : "her">>
<<if $player.gender() is "Female">>
<<set $inmateLine = ["You sit on the bunk and crook a finger. " + _svcSheC + " kneels between your thighs, spreads your cunt with both hands, and licks your clit until you cum against " + _svcHer + " mouth. " + _svcSheC + " wipes " + _svcHer + " lips and waits for permission to stand.", "No ceremony. " + _svcSheC + " kneels on the cell floor and licks your cunt with quick, practiced strokes until you cum with one fist in " + _svcHer + " hair and the other pressed over your mouth."].random()>>
<<else>>
<<set $inmateLine = ["You sit back and " + _svcShe + " sinks down without being told twice, taking your cock into " + _svcHer + " mouth. " + _svcSheC + " sucks until you cum down " + _svcHer + " throat, then wipes " + _svcHer + " mouth and waits for permission to stand.", "You want the short version tonight and " + _svcShe + " knows it. " + _svcSheC + " kneels on the cell floor, sucks your cock until you cum, and swallows because that is the deal and the deal runs itself now."].random()>>
<</if>>
<<goto "Prison_Inmate">>
<</if>>
<</button>></div>
<</if>>
<<elseif isLoverOfPlayer(_inm)>>
<<if CheckContentFilter(_inm.gender, $player) and not $prison.loverNightToday>>
<<set _nightLbl = "Steal half an hour with " + _inm.name>>
<div class="btn"><<button _nightLbl>>
<<set $prison.loverNightToday = true>>
<<SpendTime 30>>
<<run $player.status.energy.increase(10)>>
<<set _e = getInmate($prisonRoster, $activeInmateId)>>
<<set _pdom = $player.attributes.dexterity.value>>
<<if $player.attributes.dominance>><<set _pdom = $player.attributes.dominance.value>><</if>>
<<set _role = prisonPlayerActiveSexBlocked($player, $playerlock) ? "inmate" : loverRole(_e, _pdom)>>
<<if _e.stats>><<set _e.stats.trust = Math.min(100, (_e.stats.trust || 0) + 2)>><</if>>
<<set _yourHole = ($player.gender() is "Female") ? "cunt" : "ass">>
<<set _theirHole = (_e.gender is "Female") ? "cunt" : "ass">>
<<set _lead = _role>>
<<set _topG = (_lead is "player") ? $player.gender() : _e.gender>>
<<set _botG = (_lead is "player") ? _e.gender : $player.gender()>>
<<if _botG is "Female">><<SetVagPick _topG "Female">><<else>><<SetAnalPick _topG _botG>><</if>>
<<set $moveVideo = _pick>>
<<set $movePlayerRole = (_role is "player") ? "dom" : "sub">>
<<set _loverTool = ($player.gender() is "Female") ? "prison-made strap" : "cock">>
<<if _role is "player">>
<<if _e.gender is "Female">>
<<set $inmateLine = [
"She meets your eyes and pulls you into a kiss. You go down on her and work her through an orgasm with your tongue, then push your " + _loverTool + " into her cunt and fuck her while she laces her fingers in yours. You cum together and stay close while your breathing settles.",
"She catches your collar and kisses you hard. You rub her clit until she is wet, push your " + _loverTool + " into her cunt, and fuck her while she keeps one hand locked around yours. She cums around you; you follow a moment later, still holding her hand."
].random()>>
<<elseif _e.gender is "Shemale">>
<<set $inmateLine = [
"She opens her blues for you and pulls you close. You work two fingers into her ass, push your " + _loverTool + " in, and take her cock in your fist as you move. She cums between you; you keep thrusting until you cum too, then she kisses you.",
"You push your " + _loverTool + " into her ass and fuck her slowly, kissing the sounds out of her mouth while stroking her cock. She cums between you and clenches around you; you cum a moment later. She wipes you both clean and stays tucked against you."
].random()>>
<<else>>
<<set $inmateLine = [
"He leans back into your arms without asking, because by now he does not need to. You push your " + _loverTool + " into his ass slowly, chest to his back, and stroke his cock until he cums. You cum with him and stay wrapped around him while both of you catch your breath.",
"He locks his fingers through yours as you push your " + _loverTool + " into his ass and fuck him slowly with your mouth on his neck. He cums into your hand; you follow while he keeps your arm against his chest."
].random()>>
<</if>>
<<elseif _role is "inmate">>
<<if _e.gender is "Female">>
<<set $inmateLine = [
"She works two fingers into your " + _yourHole + ", buckles on the strap, and fucks you while you hold her hair and kiss her quiet. You cum against her hand. She keeps the strap in you and rolls the base over her clit until she cums too, then holds you close until your legs stop shaking.",
"She gets her mouth on you first, then straps on, pushes the rubber cock into your " + _yourHole + ", and thrusts slowly while you gasp into her shoulder. You cum under her. She pulls the harness tight and rides the base to her own orgasm, then wipes the lube from your thighs."
].random()>>
<<elseif _e.gender is "Shemale">>
<<set $inmateLine = [
"She draws you against her, works her cock into your " + _yourHole + ", and holds your waist while you push back onto her. You cum in her arms; she follows and cums in you, then stays buried while you kiss.",
"She fingers your " + _yourHole + " open, pushes her cock in, and fucks you with one hand flat over your chest. You both cum before the half hour is gone, then share a towel while you clean up."
].random()>>
<<else>>
<<set $inmateLine = [
"He pushes his cock into your " + _yourHole + " slowly, one arm locked around your chest, and you push back until you cum shaking against him. He follows and cums in you, then keeps holding on while both of you catch your breath.",
"He works two fingers into your " + _yourHole + ", pushes his cock in, and kisses the back of your neck while he fucks you. You cum under him; he cums inside you, wipes you both clean, and stays close while your breathing settles."
].random()>>
<</if>>
<</if>>
<<goto "Prison_Inmate">>
<</button>></div>
<<elseif CheckContentFilter(_inm.gender, $player)>>
<div class="prison-actnote">You have already taken private time with <<= _inm.name>> today. Come back tomorrow.</div>
<</if>>
<<if not $prison.quietMomentToday>>
<div class="btn"><<button "Steal a quiet moment">>
<<set $prison.quietMomentToday = true>>
<<SpendTime 10>>
<<set _e = getInmate($prisonRoster, $activeInmateId)>>
<<if _e.stats>><<set _e.stats.trust = Math.min(100, (_e.stats.trust || 0) + 2)>><</if>>
<<if _e.gender isnot "Male">>
<<set $inmateLine = ["You draw her close and hold her for ten minutes, forehead against hers. She glances around twice, then finally lets her weight rest against you.", "She rests her head on your shoulder while you keep an eye on the people around you, and neither of you tries to turn it into a speech."].random()>>
<<else>>
<<set $inmateLine = ["You draw him close and hold him for ten minutes, forehead against his. He glances around twice, then finally lets his weight rest against you.", "He leans against your shoulder while you keep an eye on the people around you, and neither of you tries to turn it into a speech."].random()>>
<</if>>
<<goto "Prison_Inmate">>
<</button>></div>
<</if>>
<<else>>
<<if $prison.road is "con" and prisonQuestState('pq_yard_wolf') is "completed" and $gameSettings.contentFilter.nonConsent === true and CheckContentFilter(_inm.gender, $player) and not $prison.claimAttemptToday and not prisonPlayerActiveSexBlocked($player, $playerlock)>>
<div class="btn"><<button "Make a move">>
<<if prisonPlayerActiveSexBlocked($player, $playerlock)>>
<<set $inmateLine = "Your locked cock ends the move before it costs today's attempt.">>
<<goto "Prison_Inmate">>
<<else>>
<<set $prison.claimAttemptToday = true>>
<<SpendTime 30>>
<<set _e = getInmate($prisonRoster, $activeInmateId)>>
<<set _dom = $player.attributes.dexterity.value>>
<<if $player.attributes.dominance>><<set _dom = $player.attributes.dominance.value>><</if>>
<<set _res = resolveMakeMove(_e, _dom)>>
<<if _res.success>>
<<SetCharProgression $player "dominance" 4 true>>
<<set $prison.rep = Math.min(100, ($prison.rep || 0) + 6)>>
<<run unlockPrisonAchievement('claimedPunk')>>
<<set _cooled = coolLovers($prisonRoster, 8)>>
<<set _domG = $player.gender()>>
<<set _subG = _e.gender>>
<<SetAnalPick _domG _subG>>
<<set $moveVideo = _pick>>
<<set $movePlayerRole = "dom">>
<<set _claimTool = ($player.gender() is "Female") ? "prison-made strap" : "cock">>
<<set _claimCumHer = ($player.gender() is "Female") ? "You keep the strap buried in her ass and ride the base against your cunt until you cum." : "You cum in her ass before letting her up.">>
<<set _claimCumHim = ($player.gender() is "Female") ? "You keep the strap buried in his ass and ride the base against your cunt until you cum." : "You cum in his ass before letting him up.">>
<<set _claimOral = ($player.gender() is "Female") ? "lick your cunt" : "suck your cock">>
<<if _e.gender is "Female">>
<<set $inmateLine = [
"You back her against the bunk, bend her over, and push your " + _claimTool + " into her ass. You fuck her until she cums shaking against the frame. " + _claimCumHer + " She will not meet your eye when you tell the block she is yours.",
"It does not take much once she knows the score. You fuck her ass slowly with your " + _claimTool + " while the tier hears every stroke. She cums with your hand over her mouth; " + _claimCumHer.toLowerCase() + " You make sure the rail hears her anyway.",
"You get a fistful of her hair, fold her over the bunk, and fuck her ass with your " + _claimTool + " until her knees shake. " + _claimCumHer + " When you open the door, nobody at the rail will meet her eyes.",
"You crowd her into the camera blind, finger her cunt until she cums, then turn her to the wall and fuck her ass with your " + _claimTool + ". " + _claimCumHer + " She fixes her blues and says your name low.",
"You have her bent over the bunk with your " + _claimTool + " in her ass before the second thought lands. She cums despite the fight still in her; " + _claimCumHer.toLowerCase() + " The block hears a mark become yours in real time.",
"She spits that she is nobody's until you get her down and fuck her ass slow and thorough with your " + _claimTool + ". " + _claimCumHer + " She gathers her blues without a word while the tier marks you both accordingly."
].random()>>
<<elseif _e.gender is "Shemale">>
<<set $inmateLine = [
"You crowd her against the bunk, bend her over, and push your " + _claimTool + " into her ass. You work her cock in your hand as you take her, until she cums between you. " + _claimCumHer + " She is your punk on the block now.",
"You fuck her ass slowly against the wall with your " + _claimTool + " and one hand on her neck. Her cock spills cum onto the concrete; " + _claimCumHer.toLowerCase() + " The neighboring cells go quiet before you let her up.",
"You get a fistful of her collar, fold her over the bunk, and fuck her ass until she cums untouched. " + _claimCumHer + " She waits on her knees while you tell the faces at the door that she belongs to you.",
"You put her on her knees and make her " + _claimOral + ", then turn her to the wall and fuck her ass with your " + _claimTool + ". " + _claimCumHer + " Her own cock stays hard and ignored when she leaves the blind.",
"She talks tough until you grab her hair, push your " + _claimTool + " into her ass, and fuck the words out of her against the bunk. She cums untouched between you; " + _claimCumHer.toLowerCase() + " At chow she stands behind your chair.",
"You pin her wrists and fuck her ass slowly with your " + _claimTool + " until her cock pulses cum onto the sheet. " + _claimCumHer + " She is your punk from tonight, with the whole tier as witness."
].random()>>
<<else>>
<<set $inmateLine = [
"You crowd him against the bunk, bend him over, and push your " + _claimTool + " into his ass. You stroke his cock while you fuck him until he cums against the frame. " + _claimCumHim + " He is your punk on the block now.",
"You fuck his ass slowly against the wall with your " + _claimTool + " and one hand on his neck. He cums onto the concrete; " + _claimCumHim.toLowerCase() + " The neighboring cells go quiet before you let him up.",
"You get a fistful of his collar, fold him over the bunk, and fuck his ass until he cums untouched. " + _claimCumHim + " He waits on his knees while you tell the faces at the door that he belongs to you.",
"You put him on his knees and make him " + _claimOral + ", then turn him to the wall and fuck his ass with your " + _claimTool + ". " + _claimCumHim + " He leaves the blind walking stiffly. Nobody asks why.",
"He talks tough until you grab his collar, push your " + _claimTool + " into his ass, and fuck the words into moans loud enough for both cells beside you. He cums against the bunk; " + _claimCumHim.toLowerCase() + " He keeps two steps behind you afterward.",
"You pin his wrists and fuck his ass slowly with your " + _claimTool + " until his cock pulses cum onto the sheet. " + _claimCumHim + " He is your punk from tonight, with the whole tier as witness."
].random()>>
<</if>>
<<if _cooled > 0>><<set $inmateLine += " It will get back to the one who chose you - it always does in here - and a thing like this is not unchosen. You feel the cost of it settle even as you take what you wanted.">><</if>>
<<else>>
<<set $moveVideo = "">>
<<set $movePlayerRole = null>>
<<set $prison.rep = Math.max(0, ($prison.rep || 0) - 4)>>
<<if _e.gender isnot "Male">>
<<set $inmateLine = [
"She shoves you off and squares up, and the look on her face says you misjudged her. Not this one - and the tier clocks the miss.",
"You reach for her and catch a nail across the cheek for it. Wrong mark, and the tier saw you try and miss.",
"She laughs in your face and walks off. You are not moving on this one, and everyone watching knows it."
].random()>>
<<else>>
<<set $inmateLine = [
"He shoves you off and squares up, and the look on his face says you misjudged him. Not this one, not today.",
"You reach for him and catch an elbow for it. Wrong mark - he is harder than he looked, and the tier saw you try and miss.",
"He laughs in your face and walks off. You are not moving on this one, and everyone watching knows it."
].random()>>
<</if>>
<</if>>
<<goto "Prison_Inmate">>
<</if>>
<</button>></div>
<<elseif $gameSettings.contentFilter.nonConsent === true and CheckContentFilter(_inm.gender, $player)>>
<div class="prison-actnote">You have made your play for the day. Push another mark now and you look hungry enough to bargain against yourself. Come back fresh tomorrow.</div>
<</if>>
<<if $prison.road is "con" and prisonQuestState('pq_yard_wolf') is "completed" and $gameSettings.contentFilter.nonConsent === true and CheckContentFilter(_inm.gender, $player) and not $prison.claimAttemptToday and prisonPlayerActiveSexBlocked($player, $playerlock)>>
<div class="prison-actnote">The cage blocks the active sexual part of the move. You can leave the attempt for later.</div>
<</if>>
<<set _loverOpen = ($prison.road is "solo" and prisonQuestState('pq_solo_real') is "completed" and CheckContentFilter(_inm.gender, $player))>>
<<if _loverOpen and not canBecomeLover(_inm, $prison.protectorId)>>
<<set _loverWhy = loverBlockReasons(_inm, $prison.protectorId).join(" ")>>
<div class="prison-actnote"><strong>Ask <<= _inm.name>> to be with you:</strong> <<= _loverWhy>></div>
<</if>>
<<if $prison.road is "solo" and prisonQuestState('pq_solo_real') is "completed" and CheckContentFilter(_inm.gender, $player) and canBecomeLover(_inm, $prison.protectorId)>>
<<set _loverLbl = "Ask " + _inm.name + " to be with you">>
<div class="btn"><<button _loverLbl>>
<<set $prison.loverNightToday = true>>
<<SpendTime 30>>
<<run $player.status.energy.increase(10)>>
<<set _e = getInmate($prisonRoster, $activeInmateId)>>
<<run takeAsLover(_e)>>
<<run unlockPrisonAchievement('prisonLover')>>
<<set _pdom = $player.attributes.dexterity.value>>
<<if $player.attributes.dominance>><<set _pdom = $player.attributes.dominance.value>><</if>>
<<set _role = prisonPlayerActiveSexBlocked($player, $playerlock) ? "inmate" : loverRole(_e, _pdom)>>
<<set _lead = _role>>
<<set _topG = (_lead is "player") ? $player.gender() : _e.gender>>
<<set _botG = (_lead is "player") ? _e.gender : $player.gender()>>
<<SetOralPick _topG _botG>>
<<set $moveVideo = _pick>>
<<set $movePlayerRole = (_role is "player") ? "dom" : "sub">>
<<if _e.gender is "Female">>
<<set $inmateLine = "You tell her you want this to keep going after tonight. She studies you long enough to make you sweat, then kisses you and pulls you onto the bunk. You lick her cunt until she cums, and she uses her mouth and fingers on you until you cum into the same thin blanket. Before she leaves, she tells you where to sit beside her at chow.">>
<<elseif _e.gender is "Shemale">>
<<set $inmateLine = "You tell her you want her beside you, not on your string. She asks twice whether you mean it, then pulls you onto the bunk. You suck her cock until she cums, and she uses her mouth and hands on you until you cum too. When the half hour is up, she leaves wearing your spare T-shirt under her blues.">>
<<else>>
<<set $inmateLine = "You tell him you want this to be more than borrowed sex. He stares at the floor, asks if you are serious, then pulls you onto the bunk. You suck each other until you both cum and lie shoulder to shoulder until the keys come back. He leaves with his chin up, daring the tier to comment.">>
<</if>>
<<goto "Prison_Inmate">>
<</button>></div>
<</if>>
<<if CheckContentFilter(_inm.gender, $player) and canProposition(_inm, $prison.protectorId)>>
<<set _propLbl = "Proposition " + _inm.name>>
<div class="btn"><<button _propLbl>>
<<SpendTime 20>>
<<run $player.status.energy.increase(6)>>
<<set _e = getInmate($prisonRoster, $activeInmateId)>>
<<set _pdom = $player.attributes.dexterity.value>>
<<if $player.attributes.dominance>><<set _pdom = $player.attributes.dominance.value>><</if>>
<<set _hk = resolveHookup(_e, _pdom, ($prison.rep || 0))>>
<<set _role = prisonPlayerActiveSexBlocked($player, $playerlock) ? "inmate" : _hk.role>>
<<set _lead = _role>>
<<set _topG = (_lead is "player") ? $player.gender() : _e.gender>>
<<set _botG = (_lead is "player") ? _e.gender : $player.gender()>>
<<if _botG is "Female">><<SetVagPick _topG "Female">><<else>><<SetAnalPick _topG _botG>><</if>>
<<set $moveVideo = _pick>>
<<set $movePlayerRole = (_role is "player") ? "dom" : "sub">>
<<set _yourHole = ($player.gender() is "Female") ? "cunt" : "ass">>
<<set _propTool = ($player.gender() is "Female") ? "prison-made strap" : "cock">>
<<if _role is "player">>
<<if _e.gender is "Female">>
<<set $inmateLine = ["You tell her plainly that you want her tonight, no strings, and she grins. You push your " + _propTool + " into her cunt and fuck her against the bunk until she cums with her legs around you. You cum a moment later, and afterward she steals half your blanket.", "You ask for one night and she answers by pulling you onto the bunk. You work your " + _propTool + " into her cunt, greedy and unhurried, until both of you cum. She laughs against your neck and says you should have asked weeks ago."].random()>>
<<elseif _e.gender is "Shemale">>
<<set $inmateLine = ["You lay it out plainly - tonight, no strings - and she agrees before the sentence ends. You push your " + _propTool + " into her ass and stroke her cock while you fuck her. She cums between you; you cum with her, quick and hot, and neither of you owes the other anything.", "She says yes with her blues already coming down. You take her from behind with your " + _propTool + " in her ass, one hand stroking her cock until she cums. You cum a moment later, with no claim in it and no fear either."].random()>>
<<else>>
<<set $inmateLine = ["You tell him straight that you want him tonight and mean nothing past tonight, and he is game. You push your " + _propTool + " into his ass and fuck him against the bunk while stroking his cock. He cums into your hand; you cum with him, with no claim filed either way.", "You say it plainly and he answers by reaching for his blues. You bend him over, push your " + _propTool + " into his ass, and fuck him until both of you cum. It carries none of the block's usual weight - not owning, not owed, because you both wanted the same thing."].random()>>
<</if>>
<<elseif _role is "inmate">>
<<if _e.gender is "Female">>
<<set $inmateLine = ["She works two fingers into your " + _yourHole + ", buckles on the strap, and fucks you against the bunk while you fist the sheet. You cum first. She angles the base over her clit and thrusts until she cums too, then wipes the strap and leaves with a nod.", "She gets her mouth on you first, then straps on and fucks your " + _yourHole + " until you cum into the sheet. She keeps the rubber cock in you and rocks herself to orgasm against the base, then you straighten the bunk together."].random()>>
<<elseif _e.gender is "Shemale">>
<<set $inmateLine = ["She turns you to the wall, pushes her cock into your " + _yourHole + ", and fucks you while you reach back to stroke her. You both cum before the twenty minutes are gone and clean up at the sink.", "She fucks your " + _yourHole + " over the bunk, deep and unhurried despite the short window. When she cums in you, she pulls out, fixes her blues, and leaves with a nod."].random()>>
<<else>>
<<set $inmateLine = ["He pushes his cock into your " + _yourHole + " and fucks you against the bunk while you stroke yourself. You both cum before the twenty minutes are gone, then dress without discussing a repeat.", "He works two fingers into your " + _yourHole + ", fucks you deep, and cums inside you while you cum into your hand. He passes you a towel, fixes his blues, and leaves."].random()>>
<</if>>
<</if>>
<<goto "Prison_Inmate">>
<</button>></div>
<</if>>
<</if>>
</div>
</div>
<div class="prison-icat prison-icat--car">
<div class="prison-icat__head"><span class="prison-icat__icon">🚩</span><span class="prison-icat__title">The car</span></div>
<div class="prison-icat__body">
<<if _inm.gang>>
<div class="btn"><<button "Ask about their set">>
<<set _e = getInmate($prisonRoster, $activeInmateId)>>
<<PrisonEnsureDialogueMemory _e.id>>
<<set $inmateLine = gangReadLine(_e, undefined, _conversationMemory.recent)>>
<<PrisonRememberDialogue _e.id $inmateLine>>
<<goto "Prison_Inmate">>
<</button>></div>
<</if>>
</div>
</div>
</div>
<<run layoutPrisonInteractionMenu()>>
<div class="prison-imenu__foot">
<div class="btn"><<button "Step away" `$player.info.currentLocation`>><<set $prison.sceneAuthority = null>><<set $activeInmateId = null>><<set $inmateLine = "">><<set $inmateRead = false>><</button>></div>
</div>
</div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _inm = getInmate($prisonRoster, $activeInmateId)>>
<<if not $prison or not $prison.inside or not isAdultPrisonInmate(_inm)>>
<<goto "Prison_Block">>
<<else>>
<<PrisonConversationContext _inm>>
<<if $prisonConversationFresh or not $prisonConversationNpcLine>>
<<set _conversationCtx.topic = "opening">>
<<set $prisonConversationPlayerLine = "">>
<<set $prisonConversationNpcLine = inmateTalkLine(_inm, _inm.stats.trust, undefined, 30, _conversationCtx)>>
<<PrisonRememberDialogue _inm.id $prisonConversationNpcLine>>
<<set $prisonConversationFresh = false>>
<<set $prisonConversationCanReact = false>>
<</if>>
<<PrisonRestoreBackground>>
<<set _conversationBlurb = prisonInmateBlurb(_inm)>>
<<set _conversationFace = npcFacePath(_conversationBlurb.stage, _inm.id, _inm.gender)>>
<div class="centre-text">A Word With <<= _inm.name>></div>
<div class="prison-conversation-card">
<img class="prison-conversation-card__face" @src="_conversationFace" @alt="_inm.name">
<div class="prison-conversation-card__copy">
<strong><<= _inm.name>></strong>
<span><<= _conversationBlurb.role>><<if _conversationBlurb.gang>> · <<= _conversationBlurb.gang>><</if>> · trust <<= _inm.stats.trust>>/100</span>
</div>
</div>
<<if $prisonConversationPlayerLine and $prisonConversationPlayerLine isnot "">>
<div class="prison-conversation-turn prison-conversation-turn--player">
<span class="prison-conversation-turn__speaker">You</span>
<p>"<<= $prisonConversationPlayerLine>>"</p>
</div>
<</if>>
<div class="prison-conversation-turn prison-conversation-turn--inmate">
<span class="prison-conversation-turn__speaker"><<= _inm.name>></span>
<p><<= $prisonConversationNpcLine>></p>
</div>
<<if $prisonConversationCanReact and _conversationMemory.lastTopic and not _conversationMemory.reacted[_conversationMemory.lastTopic]>>
<fieldset>
<legend>Your answer</legend>
<div class="btn-container">
<div class="btn"><<button "Meet them halfway">><<PrisonConversationTurn "support" "I hear you. I am not here to judge it.">><</button>></div>
<div class="btn"><<button "Press the point">><<PrisonConversationTurn "challenge" "That sounds like an excuse. You know it.">><</button>></div>
<<if _conversationMemory.sharedDay isnot getPrisonStintDay()>>
<div class="btn"><<button "Share something of your own">><<PrisonConversationTurn "share" "I have my own version of that. Mine still wakes me too.">><</button>></div>
<</if>>
<div class="btn"><<button "Change the subject">><<set $prisonConversationCanReact = false>><<goto "Prison_Conversation">><</button>></div>
</div>
</fieldset>
<<else>>
<fieldset>
<legend>Choose the next subject</legend>
<div class="prison-conversation-topics">
<div class="btn"><<button "Ask where they came up">><<PrisonConversationTurn "home" "Where did you come up? What was it like?">><</button>></div>
<div class="btn"><<button "Ask about the charge">><<PrisonConversationTurn "charge" "What really happened with your case?">><</button>></div>
<div class="btn"><<button "Ask how they do the time">><<PrisonConversationTurn "time" "How do you carry the days without letting them carry you?">><</button>></div>
<div class="btn"><<button "Ask what they are building toward">><<PrisonConversationTurn "plans" "What are you trying to get out of this bid?">><</button>></div>
<<if _inm.gang>>
<div class="btn"><<button "Ask what riding with the set costs">><<PrisonConversationTurn "gang" "What does riding with your set really cost?">><</button>></div>
<</if>>
<<if _conversationCastRole isnot "">>
<div class="btn"><<button "Ask about their place on the block">><<PrisonConversationTurn "cast" "Everybody here seems to know your role. Tell me what it means.">><</button>></div>
<</if>>
<<if (_conversationBlurb.stage || 0) gt 0 or (_inm.feminizationHistory and _inm.feminizationHistory.length gt 0)>>
<div class="btn"><<button "Ask how they were feminized">><<PrisonConversationTurn "feminization" "Who changed your body, when did it happen, and how do you feel about it now?">><</button>></div>
<</if>>
<<if _inm.stats.trust gte 45>>
<div class="btn"><<button "Ask what the jacket leaves out">><<PrisonConversationTurn "story" "That is the official version. What really happened?">><</button>></div>
<</if>>
</div>
</fieldset>
<</if>>
<div class="prison-actnote">Every answer costs ten minutes. Trust earned from conversation is capped per inmate each prison day.</div>
<div class="prison-imenu__foot"><div class="btn"><<button "End the conversation" "Prison_Inmate">><<set $prisonConversationPlayerLine = "">><<set $prisonConversationNpcLine = "">><<set $prisonConversationCanReact = false>><</button>></div></div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<PrisonRestoreBackground>>
<<set _source = getInmate($prisonRoster, $activeInmateId)>>
<<if not _source>>
<<goto "Prison_Block">>
<<else>>
<<set _candidates = prisonPairCandidates(_source, $prisonRoster)>>
<div class="centre-text">Work the social map</div>
<<set _pairIntro = "Choose who to bring into the conversation with " + _source.name + ". Every connection you make can keep earning, protecting, scheming or souring after lights-out.">>
<<PrisonProse _pairIntro>>
<div class="prison-pair-list">
<<for _target range _candidates>>
<<capture _target>>
<<set _tb = prisonInmateBlurb(_target)>>
<<set _tf = npcFacePath(_tb.stage, _target.id, _target.gender)>>
<<set _bond = prisonBondBetween(_source, _target.id)>>
<<set _pairCard = '<article class="prison-pair-choice"><img class="prison-pair-choice__face" src="' + _tf + '" alt=""><div class="prison-pair-choice__body"><div class="prison-pair-choice__name">' + _target.name + '</div><div class="prison-pair-choice__meta">' + _tb.role + (_target.gang ? ' · ' + _tb.gang : '') + '</div><div class="prison-pair-choice__bond">' + prisonBondLabel(_bond) + ' · ' + _bond + '</div></div><span class="prison-pair-choice__cta">Choose</span></article>'>>
<<button _pairCard>>
<<set $pairTargetId = _target.id>>
<<set $pairLine = "">>
<<goto "Prison_PairPlan">>
<</button>>
<</capture>>
<</for>>
</div>
<<if _candidates.length is 0>><div class="prison-actnote">Nobody else from this block is available.</div><</if>>
<<set _pairBackLabel = "Back to " + _source.name>>
<div class="prison-imenu__foot"><div class="btn"><<button _pairBackLabel "Prison_Inmate">><</button>></div></div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<PrisonRestoreBackground>>
<<set _source = getInmate($prisonRoster, $activeInmateId)>>
<<set _target = getInmate($prisonRoster, $pairTargetId)>>
<<if not _source or not _target>>
<<goto "Prison_PairSelect">>
<<else>>
<<set _sb = prisonInmateBlurb(_source)>>
<<set _tb = prisonInmateBlurb(_target)>>
<<set _sf = npcFacePath(_sb.stage, _source.id, _source.gender)>>
<<set _tf = npcFacePath(_tb.stage, _target.id, _target.gender)>>
<<set _bond = Math.round((prisonBondBetween(_source, _target.id) + prisonBondBetween(_target, _source.id)) / 2)>>
<div class="centre-text">Shape the relationship</div>
<div class="prison-pair-stage">
<div class="prison-pair-person"><img @src="_sf" @alt="_source.name"><strong><<= _source.name>></strong><span><<= _sb.role>></span></div>
<div class="prison-pair-link"><span><<= prisonBondLabel(_bond)>></span><strong><<= _bond>></strong></div>
<div class="prison-pair-person"><img @src="_tf" @alt="_target.name"><strong><<= _target.name>></strong><span><<= _tb.role>></span></div>
</div>
<<set _pairCaptionVideo = ($pairVideos and $pairVideos.length gt 0) ? $pairVideos[0] : "">>
<<if $pairLine and $pairLine isnot "">><<PrisonMediaProse $pairLine _pairCaptionVideo>><</if>>
<<if $pairVideos and $pairVideos.length gt 0>>
<<for _pairClipIndex, _pairClipPath range $pairVideos>><<if _pairClipIndex gt 0>><<PrisonMediaProse "" _pairClipPath>><</if>><<Video _pairClipPath>><</for>>
<<set $pairVideos = []>>
<</if>>
<<set _pairActs = availablePrisonPairActions(_source, _target, ($prison.rep || 0))>>
<div class="prison-pair-actions">
<<for _pairAct range _pairActs>>
<<capture _pairAct>>
/* Scheme/introduce print scrip/rep with no roll; the per-pair token alone made
them farmable across every pair on the roster - the paying actions share one
daily budget. */
<<set _pairAdultAllowed = (not _pairAct.adult or CheckContentFilter(prisonSexGender(_source), prisonSexGender(_target)))>>
<<set _pairPlayerAllowed = (not _pairAct.involvesPlayer or (CheckContentFilter(prisonSexGender(_source), $player) and CheckContentFilter(prisonSexGender(_target), $player)))>>
<<set _pairCoerciveAllowed = (not _pairAct.coercive or $gameSettings.contentFilter.nonConsent === true)>>
<<if _pairAdultAllowed and _pairPlayerAllowed and _pairCoerciveAllowed and not hasUsedPrisonSocialAction($prison, _pairAct.key, _source.id, _target.id) and (not isPayingPrisonSocialAction(_pairAct.key) or prisonSocialPayBudgetLeft($prison) gt 0)>>
<div class="btn"><<button _pairAct.label>>
<<set _a = getInmate($prisonRoster, $activeInmateId)>>
<<set _b = getInmate($prisonRoster, $pairTargetId)>>
<<set _pairLiveAdult = (_a and _b and (not _pairAct.adult or CheckContentFilter(prisonSexGender(_a), prisonSexGender(_b))))>>
<<set _pairLivePlayer = (_a and _b and (not _pairAct.involvesPlayer or (CheckContentFilter(prisonSexGender(_a), $player) and CheckContentFilter(prisonSexGender(_b), $player))))>>
<<set _pairLiveCoercive = (not _pairAct.coercive or $gameSettings.contentFilter.nonConsent === true)>>
<<set _pairLive = (_a and _b and _pairLiveAdult and _pairLivePlayer and _pairLiveCoercive and not hasUsedPrisonSocialAction($prison, _pairAct.key, _a.id, _b.id) and (not isPayingPrisonSocialAction(_pairAct.key) or prisonSocialPayBudgetLeft($prison) gt 0))>>
<<if _pairLive>>
<<set _pairDom = $player.attributes.dominance ? $player.attributes.dominance.value : $player.attributes.dexterity.value>>
<<set _out = resolvePrisonPairAction(_pairAct.key, _a, _b, ($prison.rep || 0), undefined, { playerGender: $player.gender(), playerDominance: _pairDom, playerActiveSexBlocked: prisonPlayerActiveSexBlocked($player, $playerlock) })>>
<<if _out.valid>>
<<set $prison.scrip = Math.max(0, ($prison.scrip || 0) + _out.scripDelta)>>
<<set $prison.rep = Math.max(0, Math.min(100, ($prison.rep || 0) + _out.repDelta))>>
<<set $prison.heat = Math.max(0, Math.min(100, ($prison.heat || 0) + _out.heatDelta))>>
<<if _out.energyCost gt 0>><<SpendEnergy $player _out.energyCost>><</if>>
<<if _out.minutes gt 0>><<SpendTime _out.minutes>><</if>>
<<run markPrisonSocialAction($prison, _pairAct.key, _a.id, _b.id)>>
<<set $pairVideos = []>>
<<if _out.clips and _out.clips.length gt 0>>
<<for _pairSexClip range _out.clips>>
<<set _pairSexCategory = (_pairSexClip.act is "oral") ? "Oral" : ((_pairSexClip.act is "vag") ? "Vag" : "Anal")>>
<<set _pairSexPick = SetSexPickByTable(_pairSexCategory, _pairSexClip.topGender, _pairSexClip.bottomGender)>>
<<if _pairSexPick and _pairSexPick isnot "">><<run $pairVideos.push(_pairSexPick)>><</if>>
<</for>>
<<SetCharProgression $player "corruption" 1 true>>
<</if>>
<<set $pairLine = _out.line>>
<</if>>
<</if>>
<<goto "Prison_PairPlan">>
<</button>></div>
<</if>>
<</capture>>
<</for>>
</div>
<<if _pairActs.length is 0>><div class="prison-actnote">These two have no useful move available right now. Change their trust, standing or existing bond first.</div><</if>>
<div class="prison-imenu__foot">
<div class="btn"><<button "Choose someone else" "Prison_PairSelect">><</button>></div>
<<set _pairBackLabel = "Back to " + _source.name>>
<div class="btn"><<button _pairBackLabel "Prison_Inmate">><<set $pairLine = "">><</button>></div>
</div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<PrisonRegimeGuard "work" "Work detail" "08:00-12:00">>
<<if prisonRegimeOpen("work", $dateTime.hours, getPrisonStintDay())>>
<<if $prison.workedToday>>
<<set $prisonScheduleName = "Work detail">>
<<set $prisonScheduleHours = "already completed today">>
<<set $prisonScheduleMessage = "You have already worked your assigned detail. The boss will not issue a second shift until tomorrow.">>
<<goto "Prison_ScheduleClosed">>
<<else>>
<<SaveLocation>>
<<if $prison.block is "F">>
<<SetBackground "Media/Locations/Prison/workshop_f.jpg">>
<<else>>
<<SetBackground "Media/Locations/Prison/workshop_m.jpg">>
<</if>>
<div class="centre-text">Work Detail</div>
<div class="chat-container prison-prose"><p class="text">The block runs on labor. A shift buys a little scrip, can chip a day off your bid, and keeps the guards off your back.</p></div>
<div class="btn-container">
<<for _j range WORK_JOBS>>
<<capture _j>>
<<set _goodTimeRoom = applyGoodTime(0).remaining>>
<<set _lbl = _j.label + " (+" + _j.scrip + " scrip" + (_goodTimeRoom gte _j.goodTime ? ", -" + _j.goodTime + " day" : "") + ")">>
<div class="btn"><<button _lbl>>
<<set $prison.workedToday = true>>
<<run awardPrisonSkillPoints($prison, "work")>>
<<run recordPrisonDirectorEvent($prison, "activity")>>
<<set _stat = _j.stat>>
<<set _xp = _j.statXp>>
<<set $prison.scrip = ($prison.scrip || 0) + _j.scrip>>
<<set _workGoodTime = applyGoodTime(_j.goodTime)>>
<<SetCharProgression $player _stat _xp true>>
<<set _workEnergyCost = prisonEnergyCost($prison, _j.energy)>>
<<SpendEnergy $player _workEnergyCost>>
<<set _wm = _j.flavor.random() + " Plus " + _j.scrip + " scrip.">>
<<if _workGoodTime.applied gt 0>>
<<set _wm += " " + _workGoodTime.applied + (_workGoodTime.applied is 1 ? " day comes" : " days come") + " off your bid.">>
<<else>>
<<set _wm += " Today's good-time allowance is already full, so the detail cannot shave another day off your bid.">>
<</if>>
<<if _j.find and random(1, 100) lte 30>>
<<set $prison.materials = addPrisonMaterial($prison.materials, _j.find)>>
<<set _wm += " You pocket a little " + prisonMaterialLabel(_j.find).toLowerCase() + " off the shift nobody will miss - it goes to the stash.">>
<</if>>
<<set $workMsg = _wm>>
<<SpendTime 240>>
<<goto "Prison_Block">>
<</button>></div>
<</capture>>
<</for>>
<div class="btn"><<button "Not today" "Prison_Block">><</button>></div>
</div>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<PrisonRegimeGuard "commissary" "Commissary" "16:00-18:00" "commissaryMsg" "commissaryVideo" "commissaryContent">>
<<if prisonRegimeOpen("commissary", $dateTime.hours, getPrisonStintDay())>>
<<SaveLocation>>
<<SetBackground "Media/Locations/Prison/commissary.jpg">>
<div class="centre-text">Commissary</div>
<div class="centre-text prison-scrip-line" style="font-size:15px;"><<PrisonItemIcon "scrip">> Scrip: <<= ($prison.scrip || 0)>></div>
<<if $commissaryMsg and $commissaryMsg isnot "">>
<<PrisonMediaProse $commissaryMsg $commissaryVideo>>
<<if $commissaryVideo and $commissaryVideo isnot "">><<Video $commissaryVideo>><<set $commissaryVideo = "">><</if>>
<<set $commissaryMsg = "">>
<<set $commissaryVideo = "">>
<<set $commissaryContent = null>>
<</if>>
<div class="btn-container">
<<for _it range COMMISSARY>>
<<set _price = prisonTradePrice($prison, _it.cost)>>
<<capture _it _price>>
<<set _cicon = prisonItemIconTag(_it.key)>>
<<set _clbl = _cicon + _it.label + " (" + _price + " scrip)">>
<<if canAfford(($prison.scrip || 0), _price)>>
<div class="btn"><<button _clbl>>
<<if canAfford(($prison.scrip || 0), _price)>>
<<set $commissaryVideo = "">>
<<set $commissaryContent = null>>
<<set $prison.scrip = ($prison.scrip || 0) - _price>>
<<if _it.effect is "heal">>
<<run $player.status.health.increase(40)>>
<<elseif _it.effect is "energy">>
<<run $player.status.energy.increase(40)>>
<<elseif _it.effect is "weapon">>
<<set $prison.hasShiv = true>>
<<run unlockPrisonAchievement('shivved')>>
<<elseif _it.effect is "material">>
<<set $prison.materials = addPrisonMaterial($prison.materials, _it.material)>>
<<elseif _it.effect is "heat">>
<<set $prison.heat = Math.max(0, ($prison.heat || 0) - 20)>>
<<elseif _it.effect is "meds">>
<<run $player.status.health.increase(30)>>
<<run $player.status.energy.increase(30)>>
<<elseif _it.effect is "estrogen">>
<<set $prison.estrogenDoses = ($prison.estrogenDoses || 0) + 1>>
<</if>>
<<set $commissaryMsg = _it.desc>>
<<goto "Prison_Commissary">>
<<else>>
<<goto "Prison_Commissary">>
<</if>>
<</button>></div>
<<else>>
<div class="btn non-interacting"><<button _clbl>><</button>></div>
<</if>>
<</capture>>
<</for>>
</div>
<<set _cmg = ($prison.block is "F") ? "Female" : "Male">>
<<if CheckContentFilter(_cmg, $player)>>
<fieldset>
<legend>The Back Tab</legend>
<div class="centre-text" style="font-size:13px;">The one behind the counter runs the block's other bank. Scrip runs out. The tab never has to.</div>
<div class="btn-container">
<<if not $prison.commissaryTabToday>>
<div class="btn"><<button "Run a tab with the loan shark">>
<<if not $prison.commissaryTabToday and CheckContentFilter(_cmg, $player)>>
<<set $prison.commissaryTabToday = true>>
<<run unlockPrisonAchievement('backTab')>>
<<SpendTime 20>>
<<SetCharProgression $player "corruption" 1 true>>
<<set _cmg2 = ($prison.block is "F") ? "Female" : "Male">>
<<SetAnalPick _cmg2 $player.gender()>>
<<set $commissaryVideo = _pick>>
<<set $commissaryContent = { adult: true, partnerGender: _cmg2, nonConsent: false }>>
<<set _adv = random(12, 22)>>
<<set $prison.scrip = ($prison.scrip || 0) + _adv>>
<<set $prison.rep = Math.max(0, ($prison.rep || 0) - 2)>>
<<if $prison.block is "F">>
<<set $commissaryMsg = "She is a loan shark with a store around her, and her interest never comes due in cash. You follow her into the stockroom behind the counter and pay down the tab the way half the broke tier pays it: she bends you over a crate of ramen and canned mackerel, pushes a prison-made strap into your ass, and takes her own pace with it. She counts you out your advance after, all business, and marks the ledger square. A cash advance of " + _adv + " scrip, and the vig paid in full.">>
<<else>>
<<set $commissaryMsg = "He is a loan shark with a store around him, and the interest on his tab was never going to be paid in scrip. You follow him into the stockroom behind the counter and pay it down the way half the broke tier does: he bends you over a crate of ramen and canned mackerel, pushes his cock into your ass, and takes his own pace with it. He counts you out the advance after, all business, and marks his ledger square. A cash advance of " + _adv + " scrip, and the vig paid in full.">>
<</if>>
<<goto "Prison_Commissary">>
<<else>>
<<goto "Prison_Commissary">>
<</if>>
<</button>></div>
<<else>>
<div class="centre-text" style="font-size:13px;">You have worked your tab down today. The ledger reopens tomorrow.</div>
<</if>>
</div>
</fieldset>
<</if>>
<fieldset>
<legend>The Hustler's Stash</legend>
<<PrisonPortrait "hustler">>
<div class="centre-text" style="font-size:13px;">The block hustler keeps a back-room line on what scrip alone will not fix. Priced high, and sold once.</div>
<div class="btn-container">
<<if not $prison.hasEscapeTool>>
<<set _btlbl = prisonItemIconTag("escape_tool") + "Cut-down bolt cutters (20 scrip)">>
<<if canAfford(($prison.scrip || 0), 20)>>
<div class="btn"><<button _btlbl>>
<<if not $prison.hasEscapeTool and canAfford(($prison.scrip || 0), 20)>>
<<set $commissaryVideo = "">>
<<set $commissaryContent = null>>
<<set $prison.scrip = ($prison.scrip || 0) - 20>>
<<set $prison.hasEscapeTool = true>>
<<if $prison.hasEscapeTool and $prison.hasDisguise and $prison.hasLockpick>><<run unlockPrisonAchievement('escapeKit')>><</if>>
<<set $commissaryMsg = "A pair of bolt cutters with the handles hacksawed down to hide in a waistband, wrapped in an oily rag. They will bite through a fence tie quiet and fast the night you decide to run. Stash them deep.">>
<<goto "Prison_Commissary">>
<<else>>
<<goto "Prison_Commissary">>
<</if>>
<</button>></div>
<<else>>
<div class="btn non-interacting"><<button _btlbl>><</button>></div>
<</if>>
<</if>>
<<if not $prison.hasDisguise>>
<<set _dglbl = prisonItemIconTag("disguise") + "Civilian clothes (16 scrip)">>
<<if canAfford(($prison.scrip || 0), 16)>>
<div class="btn"><<button _dglbl>>
<<if not $prison.hasDisguise and canAfford(($prison.scrip || 0), 16)>>
<<set $commissaryVideo = "">>
<<set $commissaryContent = null>>
<<set $prison.scrip = ($prison.scrip || 0) - 16>>
<<set $prison.hasDisguise = true>>
<<if $prison.hasEscapeTool and $prison.hasDisguise and $prison.hasLockpick>><<run unlockPrisonAchievement('escapeKit')>><</if>>
<<set $commissaryMsg = "A shirt and cap come folded inside a laundry bag, both smelling of hot dryers. The number has been cut from the collar. From ten feet away, you look like somebody carrying a maintenance order.">>
<<goto "Prison_Commissary">>
<<else>>
<<goto "Prison_Commissary">>
<</if>>
<</button>></div>
<<else>>
<div class="btn non-interacting"><<button _dglbl>><</button>></div>
<</if>>
<</if>>
</div>
<<if $prison.hasEscapeTool and $prison.hasDisguise>>
<div class="centre-text" style="font-size:13px;">The hustler spreads both hands. You have cleaned the stash out - there is nothing back here you do not already carry.</div>
<</if>>
</fieldset>
<<PrisonNav>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<SetBackground "Media/Locations/Prison/storeroom.jpg">>
<div class="centre-text"><<PrisonItemIcon "stash" "prison-item-icon--table">></div>
<div class="centre-text">The Stash</div>
<div class="centre-text" style="font-size:14px;">A gap behind a loose panel where the block keeps what the block should not have. Raw stock goes in one end; leverage comes out the other.</div>
<<if $stashMsg and $stashMsg isnot "">>
<<PrisonProse $stashMsg>>
<<set $stashMsg = "">>
<</if>>
<fieldset>
<legend>On hand</legend>
<div class="prison-roster">
<<for _m range PRISON_MATERIALS>>
<<set _mc = prisonMaterialCount($prison.materials, _m.key)>>
<div class="centre-text" style="font-size:14px;"><<= _m.label>>: <<= _mc>></div>
<</for>>
<<if ($prison.pruno || 0) gt 0>><div class="centre-text" style="font-size:14px;"><<PrisonItemIcon "pruno">> Batches of pruno: <<= ($prison.pruno || 0)>></div><</if>>
<<set _tools = []>>
<<if $prison.hasShiv>><<run _tools.push(prisonItemIconTag("shank") + "a shank")>><</if>>
<<if $prison.hasSoapSock>><<run _tools.push(prisonItemIconTag("soap_sock") + "a lock in a sock")>><</if>>
<<if $prison.hasLockpick>><<run _tools.push(prisonItemIconTag("lockpick") + "a lockpick")>><</if>>
<<if $prison.hasEscapeTool>><<run _tools.push(prisonItemIconTag("escape_tool") + "cut-down bolt cutters")>><</if>>
<<if $prison.hasDisguise>><<run _tools.push(prisonItemIconTag("disguise") + "civvies to walk out in")>><</if>>
<<if _tools.length gt 0>><div class="prison-holding"><span class="prison-holding__label">Holding:</span> <<= _tools.join(" ")>></div><</if>>
</div>
</fieldset>
<fieldset>
<legend>Scrounge</legend>
<div class="btn-container">
<<if not $prison.scavengedToday>>
<div class="btn"><<button "Scrounge the block for stock">>
<<set $prison.scavengedToday = true>>
<<SpendTime 30>>
<<set _found = scavengePrison()>>
<<set $prison.materials = addPrisonMaterial($prison.materials, _found)>>
<<set _extraFound = prisonCraftExtraFind($prison)>>
<<if _extraFound>>
<<set _foundExtra = scavengePrison()>>
<<set $prison.materials = addPrisonMaterial($prison.materials, _foundExtra)>>
<</if>>
<<if random(1, 100) lte 20>>
<<set $prison.heat = Math.min(100, ($prison.heat || 0) + 3)>>
<<set $stashMsg = "You work the tier for what nobody is watching and come away with a strip of " + prisonMaterialLabel(_found).toLowerCase() + " down your waistband. A CO clocks you loitering where you should not be and files it. Worth the look.">>
<<else>>
<<set $stashMsg = "You drift the block slow and come back with a length of " + prisonMaterialLabel(_found).toLowerCase() + " nobody will miss. It goes in the stash for later.">>
<</if>>
<<if _extraFound>><<set $stashMsg += " Your crafting eye also picks out " + prisonMaterialLabel(_foundExtra).toLowerCase() + " worth keeping.">><</if>>
<<goto "Prison_Stash">>
<</button>></div>
<<else>>
<div class="centre-text" style="font-size:13px;">You have scrounged the block once today. There is only so much anybody can lift before the tier notices. Try again tomorrow.</div>
<</if>>
</div>
</fieldset>
<fieldset>
<legend>The bench</legend>
<div class="btn-container">
<<for _r range PRISON_CRAFT_RECIPES>>
<<capture _r>>
<<set _can = canCraftPrison($prison.materials, _r.key)>>
<<set _clbl = prisonItemIconTag(_r.key) + _r.label + " (" + prisonRecipeCostLabel(_r) + ")">>
<<if _can>>
<div class="btn"><<button _clbl>>
<<set _res = applyPrisonCraft($prison.materials, _r.key)>>
<<if _res.ok>>
<<set $prison.materials = _res.materials>>
<<if _res.product is "shank">>
<<set $prison.hasShiv = true>>
<<run unlockPrisonAchievement('shivved')>>
<<set $stashMsg = "You grind the steel to a wicked point against the concrete and wrap the grip in tape and torn cloth. Crude, ugly, and enough to make a wolf reconsider. You are holding now.">>
<<elseif _res.product is "lockpick">>
<<set $prison.hasLockpick = true>>
<<run unlockPrisonAchievement('toolmaker')>>
<<if $prison.hasEscapeTool and $prison.hasDisguise>><<run unlockPrisonAchievement('escapeKit')>><</if>>
<<set $stashMsg = "You work the wire into a rake and bend a tension bar from the offcut. It is not pretty, but it will talk to a cheap lock, and half the locks in here are cheap. The crossing and the fence just got easier.">>
<<elseif _res.product is "pruno">>
<<set $prison.pruno = ($prison.pruno || 0) + 1>>
<<run unlockPrisonAchievement('brewed')>>
<<set $stashMsg = "You bag the fruit and sugar, spit in it for luck, and hide it behind the vent to work. In a few days it will be pruno - rank, potent, and worth real scrip to the right thirsty buyer.">>
<<elseif _res.product is "soap_sock">>
<<set $prison.hasSoapSock = true>>
<<run unlockPrisonAchievement('sapped')>>
<<set $stashMsg = "You drop the bar into the toe of the sock and knot it tight. It hangs heavy and swings mean, and it will drop somebody once before it comes apart - and a torn sock and a bar of soap are nothing the COs can write you up for.">>
<</if>>
<</if>>
<<goto "Prison_Stash">>
<</button>></div>
<<else>>
<div class="btn non-interacting"><<button _clbl>><</button>></div>
<</if>>
<</capture>>
<</for>>
</div>
</fieldset>
<<if ($prison.pruno || 0) gt 0>>
<fieldset>
<legend>Pruno</legend>
<div class="btn-container">
<div class="btn"><<button "Drink a batch">>
<<set $prison.pruno = Math.max(0, ($prison.pruno || 0) - 1)>>
<<SpendTime 30>>
<<run $player.status.energy.increase(25)>>
<<run $player.status.health.increase(10)>>
<<set $prison.heat = Math.min(100, ($prison.heat || 0) + 2)>>
<<set $stashMsg = "You knock back a cup of the stuff. It tastes like a gym sock full of pennies and hits like a truck, and for one loose hour the walls stand a little further off.">>
<<goto "Prison_Stash">>
<</button>></div>
<div class="btn"><<button "Sell a batch down the tier">>
<<set $prison.pruno = Math.max(0, ($prison.pruno || 0) - 1)>>
<<set _earn = random(6, 12)>>
<<set $prison.scrip = ($prison.scrip || 0) + _earn>>
<<set $stashMsg = "You move a batch to a thirsty con two cells down. They pay without haggling - a real thirst never does. Plus " + _earn + " scrip.">>
<<goto "Prison_Stash">>
<</button>></div>
</div>
</fieldset>
<</if>>
<<PrisonNav>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<PrisonPendingMediaGuard "prisonScheduleMessage" "prisonScheduleVideo" "prisonScheduleContent">>
<<if $prison.block is "F">><<SetBackground "Media/Locations/Prison/block_f_dayroom.jpg">><<else>><<SetBackground "Media/Locations/Prison/block_m_dayroom.jpg">><</if>>
<div class="centre-text">Movement Closed</div>
<<if $prisonScheduleMessage and $prisonScheduleMessage isnot "">>
<<PrisonMediaProse $prisonScheduleMessage $prisonScheduleVideo>>
<<if $prisonScheduleVideo and $prisonScheduleVideo isnot "">>
<<Video $prisonScheduleVideo>>
<</if>>
<<set $prisonScheduleMessage = "">>
<<set $prisonScheduleVideo = "">>
<<set $prisonScheduleContent = null>>
<<else>>
<<set $prisonScheduleVideo = "">>
<<set $prisonScheduleContent = null>>
<</if>>
<div class="chat-container prison-prose"><p class="text">The gate to <<= $prisonScheduleName || "that part of the prison">> is shut. Movement is called only during <<= $prisonScheduleHours || "its scheduled window">>; a stale pass or a saved route does not get you through the steel.</p></div>
<<set _scheduleWaitMinutes = $prisonScheduleKind ? minutesUntilPrisonAreaOpens($prisonScheduleKind, $dateTime.hours, $dateTime.minutes, getPrisonStintDay()) : null>>
<div class="btn-container">
<div class="btn"><<button "Back to the day room" "Prison_Block">><</button>></div>
<<if _scheduleWaitMinutes isnot null and _scheduleWaitMinutes gt 0 and $prisonScheduleDestination>>
<<set _scheduleWaitLabel = "Wait until " + ($prisonScheduleName || "the area").toLowerCase() + " opens (" + _scheduleWaitMinutes + " min)">>
<<set _scheduleDestination = $prisonScheduleDestination>>
<<capture _scheduleWaitMinutes _scheduleDestination>>
<div class="btn"><<button _scheduleWaitLabel>><<SpendTime _scheduleWaitMinutes>><<goto _scheduleDestination>><</button>></div>
<</capture>>
<</if>>
<<PrisonWaitForNextCall>>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<PrisonRestoreBackground>>
<<PrisonAdvanceToMorning>>
<<set $prisonMorningReport = resolvePrisonSociety($prisonRoster, undefined, 3, $prison.gang).concat(playerPeopleReport($prisonRoster))>>
<<run applyGangWarFallout($prisonMorningReport)>>
<<run newPrisonDay()>>
<<PrisonNightRoll>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _paroleVisit = ($prison and $prison.inside) ? getActiveCrossBlockVisit($prison, { day: getCurrentAbsoluteDay(), hour: $dateTime.hours, minute: $dateTime.minutes }) : null>>
<<set _paroleQuestRoute = ($prison and $prison.inside and not _paroleVisit and $prison.road isnot "con" and $questRouteId is "pq_prog_board" and $questRoutePath is "board" and prisonQuestState('pq_prog_board') is "active")>>
<<if not _paroleQuestRoute>>
<<if $prison>><<set $prison.paroleDecision = null>><</if>>
<<set $questRouteId = "">>
<<set $questRoutePath = "">>
<<if not $prison or not $prison.inside>><<goto "PoliceStation">><<elseif _paroleVisit>><<goto "Prison_OtherBlock">><<elseif $prison.inPC>><<goto "Prison_Segregation">><<else>><<goto "Prison_Block">><</if>>
<<else>>
<<SetBackground "Media/Locations/Prison/warden_office.jpg">>
<<set $prison.paroleDecision = null>>
/* The board only seats for an eligible file (half the term served, one hearing a
stint) - the hub button checks this, but the quest route ("The Board") lands
here directly, so the gate has to live on the passage itself. */
<<if not paroleReady()>>
<<if $prison.paroleHeard>><<run failPrisonQuestPath('pq_prog_board', 'board', 'The board has already heard this stint')>><</if>>
<<set $questRouteId = "">>
<<set $questRoutePath = "">>
<div class="centre-text">The Parole Board</div>
<<PrisonPortrait "warden">>
<<if $prison.paroleHeard>>
<div class="chat-container prison-prose"><p class="text">The clerk does not even open your file. <span class='dialogue-speech'>"You have been heard this stint. The board does not reconvene for the same bid. Do your time."</span></p></div>
<<else>>
<div class="chat-container prison-prose"><p class="text">The clerk checks the calendar against your file and shakes his head. <span class='dialogue-speech'>"You have not served enough of your bid for the board to seat. Come back when at least half of it is behind you - and bring a file worth reading."</span></p></div>
<</if>>
<div class="btn padding-top"><<button "Back to the block" "Prison_Block">><</button>></div>
<<else>>
<<set _v = scoreParole($prison)>>
<div class="centre-text">The Parole Board</div>
<<PrisonPortrait "warden">>
<div class="chat-container prison-prose"><p class="text">Three of them behind a long table, your file open in front of the one in the middle. Nobody offers you a chair. They read your record back to you like a verdict already reached, and maybe it is.</p></div>
<fieldset>
<legend>Your file</legend>
<div class="prison-roster">
<<if _v.factors.length is 0>>
<div class="centre-text" style="font-size:14px;">The file is thin. Nothing in it for them to reward, and a board does not grant on nothing.</div>
<<else>>
<<for _f range _v.factors>>
<<capture _f>>
<<set _ds = (_f.delta > 0 ? "+" : "") + _f.delta>>
<div class="centre-text" style="font-size:14px;"><<= _f.label>>: <<= _ds>></div>
<</capture>>
<</for>>
<</if>>
<div class="centre-text" style="font-size:15px;padding-top:6px;">Their read of you: <<= _v.score>> out of 100. A prisoner walks early at <<= PAROLE_GRANT_THRESHOLD>>.</div>
</div>
</fieldset>
<div class="btn-container">
<div class="btn"><<button "Stand for their decision">>
<<set $prison.paroleHeard = true>>
<<set _res = scoreParole($prison)>>
<<set $prison.paroleDecision = { questId: $questRouteId, path: $questRoutePath, stintDay: getPrisonStintDay(), granted: _res.granted }>>
<<if _res.granted>>
<<goto "Prison_Paroled">>
<<else>>
<<goto "Prison_ParoleDenied">>
<</if>>
<</button>></div>
<div class="btn"><<button "Waive it and keep building your file">><<set $prison.paroleDecision = null>><<set $questRouteId = "">><<set $questRoutePath = "">><<goto "Prison_Block">><</button>></div>
</div>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _paroleDecision = ($prison && $prison.inside) ? $prison.paroleDecision : null>>
<<set _paroleQuestRoute = (_paroleDecision and _paroleDecision.granted is true and _paroleDecision.questId is $questRouteId and _paroleDecision.path is $questRoutePath and _paroleDecision.stintDay is getPrisonStintDay() and $prison.paroleHeard is true and $prison.road isnot "con" and $questRouteId is "pq_prog_board" and $questRoutePath is "board" and prisonQuestState('pq_prog_board') is "active")>>
<<if not _paroleQuestRoute>>
<<if $prison>><<set $prison.paroleDecision = null>><</if>>
<<set $questRouteId = "">>
<<set $questRoutePath = "">>
<<if not $prison or not $prison.inside>><<goto "PoliceStation">><<elseif $prison.inPC>><<goto "Prison_Segregation">><<else>><<goto "Prison_Block">><</if>>
<<else>>
<<set _routePath = $questRoutePath ? $questRoutePath : "board">>
<<set _paroleOutcome = finalizePrisonQuestRoute($questRouteId, _routePath, "parole")>>
<<if not _paroleOutcome or not _paroleOutcome.completed>>
<<set $questRouteId = "">>
<<set $questRoutePath = "">>
<<goto "Prison_Block">>
<<else>>
<<set $questRouteId = "">>
<<set $questRoutePath = "">>
<<run releasePlayer('parole')>>
<<run $('#prison-sidebar-status').remove()>>
<<run unlockPrisonAchievement('paroled')>>
<<SetBackground "Media/Locations/Prison/warden_office.jpg">>
<div class="centre-text">Granted</div>
<div class="chat-container prison-prose"><p class="text">The one in the middle signs without looking up. <span class='dialogue-speech'>"Parole granted. Do not make us regret it."</span> A guard is already unlocking the side door, and just like that the wall lets go of you early. You walk out owing them your good behavior for a while yet - but you walk out.</p></div>
<<set _rc = $prison.recap>>
<<if _rc>>
<fieldset>
<legend>The stint</legend>
<div class="centre-text" style="font-size:14px;">You leave Cellblock <<= _rc.block>> on parole with a name worth <<= _rc.rep>> out of 100.</div>
<div class="centre-text" style="font-size:14px;">Your sheet carries <<= $prison.priors>> <<if $prison.priors is 1>>prior<<else>>priors<</if>> now - the next fall will run longer for it.</div>
<<if _rc.business and (_rc.business.completed gt 0 or _rc.business.failed gt 0)>><div class="centre-text" style="font-size:13px;">The tier remembers your work: <<= _rc.business.completed>> jobs carried clean, <<= _rc.business.failed>> failed or bent. You leave known as <<= prisonBusinessCredLabel(_rc.business.cred).toLowerCase()>>.</div><</if>>
</fieldset>
<</if>>
<div class="btn padding-top"><<button "Step outside" "PoliceStation">><</button>></div>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _paroleDecision = ($prison && $prison.inside) ? $prison.paroleDecision : null>>
<<set _paroleQuestRoute = (_paroleDecision and _paroleDecision.granted is false and _paroleDecision.questId is $questRouteId and _paroleDecision.path is $questRoutePath and _paroleDecision.stintDay is getPrisonStintDay() and $prison.paroleHeard is true and $prison.road isnot "con" and $questRouteId is "pq_prog_board" and $questRoutePath is "board" and prisonQuestState('pq_prog_board') is "active")>>
<<if not _paroleQuestRoute>>
<<if $prison>><<set $prison.paroleDecision = null>><</if>>
<<set $questRouteId = "">>
<<set $questRoutePath = "">>
<<if not $prison or not $prison.inside>><<goto "PoliceStation">><<elseif $prison.inPC>><<goto "Prison_Segregation">><<else>><<goto "Prison_Block">><</if>>
<<else>>
<<set $prison.paroleDecision = null>>
<<set _routePath = $questRoutePath ? $questRoutePath : "board">>
<<if $questRouteId and isPrisonQuestActive($questRouteId)>><<run failPrisonQuestPath($questRouteId, _routePath, "Parole denied")>><</if>>
<<set $questRouteId = "">>
<<set $questRoutePath = "">>
<<SetBackground "Media/Locations/Prison/warden_office.jpg">>
<div class="centre-text">Denied</div>
<div class="chat-container prison-prose"><p class="text">The gavel comes down before you finish. <span class='dialogue-speech'>"Parole denied. Serve your time."</span> Whatever they saw in that file, they do not trust you on the street yet. You will be walking out the long way, on the state's clock, not your own.</p></div>
<div class="btn padding-top"><<button "Back to the block" "Prison_Block">><</button>></div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _releaseCrossVisit = ($prison && $prison.inside) ? getActiveCrossBlockVisit($prison, { day: getCurrentAbsoluteDay(), hour: $dateTime.hours, minute: $dateTime.minutes }) : null>>
<<if _releaseCrossVisit>>
<<goto "Prison_OtherBlock">>
<<elseif $prison && $prison.inside && canRelease()>>
<<run releasePlayer('served')>>
<<run $('#prison-sidebar-status').remove()>>
<<run unlockPrisonAchievement('served')>>
<<SetBackground "Media/Locations/Prison/perimeter.jpg">>
<div class="centre-text">Released</div>
<div class="chat-container prison-prose">
<p class="text">The last gate rolls back and the noise of the block falls away behind you. They hand back the bag with your things and point you at the street. Whatever the time in there made of you, it is yours to carry out.</p>
</div>
<<set _rc = $prison.recap>>
<<if _rc>>
<fieldset>
<legend>The stint</legend>
<div class="centre-text" style="font-size:14px;">You leave Cellblock <<= _rc.block>> with a name worth <<= _rc.rep>> out of 100<<if $prison.gang>>, and <<= gangLabel($prison.gang)>> at your back<</if>>.</div>
<div class="centre-text" style="font-size:14px;">Your sheet carries <<= $prison.priors>> <<if $prison.priors is 1>>prior<<else>>priors<</if>> now - the next fall will run longer for it.</div>
<<if _rc.business and (_rc.business.completed gt 0 or _rc.business.failed gt 0)>><div class="centre-text" style="font-size:13px;">The tier remembers your work: <<= _rc.business.completed>> jobs carried clean, <<= _rc.business.failed>> failed or bent. You leave known as <<= prisonBusinessCredLabel(_rc.business.cred).toLowerCase()>>.</div><</if>>
<<if getNotoriety($police) gte 50>><div class="centre-text" style="font-size:13px;color:#b9a7cf;">The heat you walked in with is off you for now, but the street still remembers you: <<= notorietyTier(getNotoriety($police)).label.toLowerCase()>>. Your name goes back out there ahead of you.</div><</if>>
</fieldset>
<</if>>
<div class="btn padding-top"><<button "Step outside" "PoliceStation">><</button>></div>
<<else>>
<<if not $prison or not $prison.inside>><<goto "PoliceStation">><<elseif $prison.inPC>><<goto "Prison_Segregation">><<else>><<goto "Prison_Block">><</if>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _retaliationAgg = ($prison and $prison.inside) ? getInmate($prisonRoster, $prison.nightAggressorId) : null>>
<<set _retaliationAuthority = ($prison and $prison.sceneAuthority and $prison.sceneAuthority.scene is "nightRetaliation" and $prison.sceneAuthority.stintDay is getPrisonStintDay() and $prison.sceneAuthority.targetId is $prison.nightAggressorId)>>
<<set _retaliationResultAuthority = ($prison and $prison.sceneAuthority and $prison.sceneAuthority.scene is "nightRetaliationResult" and $prison.sceneAuthority.stintDay is getPrisonStintDay() and $prison.sceneAuthority.targetId is $prison.nightAggressorId)>>
<<set _retaliationResultReady = (_retaliationResultAuthority and _retaliationAgg and $nightRetaliationMsg and $nightRetaliationMsg isnot "")>>
<<if not $prison or not $prison.inside>>
<<set $nightRetaliationMsg = "">>
<<if $prison>><<set $prison.sceneAuthority = null>><<set $prison.nightAggressorId = null>><</if>>
<<goto "PoliceStation">>
<<elseif _retaliationResultReady>>
<<if $prison.block is "F">><<SetBackground "Media/Locations/Prison/block_f_dayroom.jpg">><<else>><<SetBackground "Media/Locations/Prison/block_m_dayroom.jpg">><</if>>
<div class="centre-text">Morning</div>
<<PrisonProse $nightRetaliationMsg>>
<div class="btn padding-top"><<button "Face the day">>
<<set $prison.sceneAuthority = null>>
<<set $nightRetaliationMsg = "">>
<<set $prison.nightAggressorId = null>>
<<goto "Prison_Block">>
<</button>></div>
<<elseif $nightRetaliationMsg and $nightRetaliationMsg isnot "">>
<<set $prison.sceneAuthority = null>>
<<set $nightRetaliationMsg = "">>
<<set $prison.nightAggressorId = null>>
<<if $prison.inPC>><<goto "Prison_Segregation">><<elseif canRelease()>><<goto "Prison_Block">><<else>><<PrisonNormalNightEvent>><</if>>
<<else>>
<<set _agg = _retaliationAgg>>
<<set _rat = hasJacketMark("rat")>>
<<set _retaliationValid = (_retaliationAuthority and _agg and not _agg.loverOfPlayer and not _agg.allyOfPlayer and _agg.claimedBy isnot -1 and (_agg.enemyOfPlayer === true or _rat) and not canRelease() and not $prison.protected and not $prison.inPC and not $prison.shotCaller)>>
<<if not _retaliationValid>>
<<set $prison.sceneAuthority = null>>
<<set $nightRetaliationMsg = "">>
<<set $prison.nightAggressorId = null>>
<<if $prison.inPC>><<goto "Prison_Segregation">><<elseif canRelease()>><<goto "Prison_Block">><<else>><<PrisonNormalNightEvent>><</if>>
<<else>>
<<if $prison.block is "F">><<SetBackground "Media/Locations/Prison/cell_f.jpg">><<else>><<SetBackground "Media/Locations/Prison/cell_m.jpg">><</if>>
<<set _enemy = (_agg.enemyOfPlayer === true)>>
<<set _aggCap = (_agg.gender isnot "Male") ? "She" : "He">>
<<set _reason = _enemy ? (_agg.name + " has not forgotten that you sold " + ((_agg.gender isnot "Male") ? "her" : "him") + " out when your own standing was on the line.") : ("The rat mark on your jacket has given " + _agg.name + " a reason to collect for the tier.")>>
<div class="centre-text">The Tier Remembers</div>
<div class="chat-container prison-prose"><p class="text"><<= _reason>> At lights-out <<= _agg.name>> blocks the cell door and names the debt plainly. <span class='dialogue-speech'>"No hiding behind staff now. You settle this with me."</span></p></div>
<div class="btn-container">
<div class="btn"><<button "Stand your ground">>
<<set $prison.sceneAuthority = { scene: "nightRetaliationResult", stintDay: getPrisonStintDay(), targetId: $prison.nightAggressorId }>>
<<set _str = $player.attributes.strength.value>>
<<set _backup = ($prison.cellmateAlly ? 12 : 0) + (($prison.gang and hasGangBackup($prisonRoster, $prison.gang)) ? 10 : 0)>>
<<set _fightChance = Math.min(90, Math.max(10, 32 + (_str * 7) + _backup - ((Number(_agg.dominance) || 5) * 4)))>>
<<SpendTime 30>>
<<SpendEnergy $player 15>>
<<if random(1, 100) lte _fightChance>>
<<set _agg.enemyOfPlayer = false>>
<<set $prison.rep = Math.min(100, ($prison.rep || 0) + 5)>>
<<set $nightRetaliationMsg = "You meet " + _agg.name + " in the narrow space between bunk and bars and refuse to fold. The noise brings boots before either side can finish it, but the tier saw enough: this personal score is closed on equal terms." + (_rat ? " The rat mark itself is still on your jacket, and the rest of the block has not forgotten it." : "")>>
<<else>>
<<set $prison.rep = Math.max(0, ($prison.rep || 0) - 4)>>
<<set $prison.heat = Math.min(100, ($prison.heat || 0) + 5)>>
<<set $nightRetaliationMsg = _agg.name + " wins the short, ugly fight before the COs reach the bars. You keep your feet, but the block reads the result and the personal grudge remains open.">>
<</if>>
<<goto "Prison_NightRetaliation">>
<</button>></div>
<<if ($prison.scrip || 0) gte 20>>
<div class="btn"><<button "Make it right (20 scrip)">>
<<if ($prison.scrip || 0) gte 20>>
<<set $prison.sceneAuthority = { scene: "nightRetaliationResult", stintDay: getPrisonStintDay(), targetId: $prison.nightAggressorId }>>
<<SpendTime 15>>
<<set $prison.scrip = ($prison.scrip || 0) - 20>>
<<set _agg.enemyOfPlayer = false>>
<<set $prison.rep = Math.max(0, ($prison.rep || 0) - 1)>>
<<set $nightRetaliationMsg = "You put twenty scrip on the bunk and let " + _agg.name + " count it. " + _aggCap + " takes payment instead of blood, and that personal score is closed." + (_rat ? " Paying one person does not erase the rat mark; the tier can still send somebody else tomorrow." : "")>>
<<goto "Prison_NightRetaliation">>
<<else>>
<<goto "Prison_NightRetaliation">>
<</if>>
<</button>></div>
<</if>>
<div class="btn"><<button "Own it and talk">>
<<set $prison.sceneAuthority = { scene: "nightRetaliationResult", stintDay: getPrisonStintDay(), targetId: $prison.nightAggressorId }>>
<<set _speech = ($player.attributes.speech ? $player.attributes.speech.value : 3)>>
<<set _talkChance = Math.min(90, Math.max(10, 30 + (_speech * 8) - ((Number(_agg.dominance) || 5) * 4)))>>
<<SpendTime 20>>
<<if random(1, 100) lte _talkChance>>
<<set _agg.enemyOfPlayer = false>>
<<set $prison.rep = Math.min(100, ($prison.rep || 0) + 1)>>
<<set $nightRetaliationMsg = "You do not deny what happened. You name the pressure, the choice, and what you owe without begging. " + _agg.name + " listens, lets the silence sit, and finally steps away. The personal grudge is finished." + (_rat ? " The wider rat jacket is not; one honest conversation cannot clear the whole tier." : "")>>
<<else>>
<<set $prison.rep = Math.max(0, ($prison.rep || 0) - 2)>>
<<set $prison.heat = Math.min(100, ($prison.heat || 0) + 3)>>
<<set $nightRetaliationMsg = _agg.name + " hears an excuse where you meant an answer. The argument draws a CO to the bars and adds heat to your sheet, but it does not close the grudge.">>
<</if>>
<<goto "Prison_NightRetaliation">>
<</button>></div>
</div>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _agg = ($prison && $prison.inside) ? getInmate($prisonRoster, $prison.nightAggressorId) : null>>
<<set _nightThreatAuthority = ($prison and $prison.sceneAuthority and $prison.sceneAuthority.scene is "nightThreat" and $prison.sceneAuthority.stintDay is getPrisonStintDay() and $prison.sceneAuthority.targetId is $prison.nightAggressorId)>>
<<if not $prison or not $prison.inside>>
<<if $prison>><<set $prison.nightAggressorId = null>><</if>>
<<goto "PoliceStation">>
<<elseif not _agg>>
<<set $prison.nightAggressorId = null>>
<<PrisonNormalNightEvent>>
<<elseif _nightThreatAuthority and (not $nightThreatMsg or $nightThreatMsg is "") and not canRelease() and not $prison.protected and not $prison.inPC and not $prison.shotCaller and $gameSettings.contentFilter.nonConsent === true and $gameSettings.contentFilter.PlayerFeminization == true and CheckContentFilter(_agg.gender, $player)>>
<<if $prison.block is "F">>
<<SetBackground "Media/Locations/Prison/cell_f.jpg">>
<<else>>
<<SetBackground "Media/Locations/Prison/cell_m.jpg">>
<</if>>
<div class="centre-text">Lights Out</div>
<<set _aggPoss = (_agg.gender isnot "Male") ? "her" : "his">>
<<set _aggCap = (_agg.gender isnot "Male") ? "She" : "He">>
<<set _aggSub = (_agg.gender isnot "Male") ? "she" : "he">>
<<set _aggObj = (_agg.gender isnot "Male") ? "her" : "him">>
<div class="chat-container prison-prose"><p class="text"><<= _agg.name>> and two of <<= _aggPoss>> people are between you and the bars, and the guard just walked the other way. <span class='dialogue-speech'>"We are going to find out what you are, new boot. One way or the other."</span></p></div>
<div class="btn-container">
<div class="btn"><<button "Fight them off">>
<<set $prison.sceneAuthority = { scene: "nightThreatResult", stintDay: getPrisonStintDay(), targetId: $prison.nightAggressorId }>>
<<set _str = $player.attributes.strength.value>>
<<set _usedSap = (not $prison.hasShiv and $prison.hasSoapSock)>>
<<set _edge = ($prison.hasShiv) ? 25 : (_usedSap ? 12 : 0)>>
<<set _celly = ($prison.cellmateAlly and $prison.nightAggressorId isnot $prison.cellmateId)>>
<<set _gangUp = ($prison.gang and hasGangBackup($prisonRoster, $prison.gang))>>
<<if _celly>><<set _edge = _edge + 20>><</if>>
<<if _gangUp>><<set _edge = _edge + 15>><</if>>
<<if random(1, 100) lte (18 + _str * 6 + _edge)>>
<<if $prison.hasShiv>><<set $prison.heat = Math.min(100, ($prison.heat || 0) + 8)>><</if>>
<<SetCharProgression $player "dominance" 3 true>>
<<set $prison.rep = Math.min(100, ($prison.rep || 0) + 8)>>
<<set $nightThreatVideo = "">>
<<if _celly>>
<<set $nightThreatMsg = "Your cellmate is off the bunk the second it kicks off. You put the first attacker down; your celly folds the second into the bars. The third backs through the open door. By morning, nobody crowds either of you at the sink.">>
<<elseif _gangUp>>
<<set $nightThreatMsg = "Word reached your car. When it starts, two of your own peel off the wall and wade in beside you. The three attackers expected to find you alone, not backed by a set. They scatter before the guards turn the corner.">>
<<else>>
<<set $nightThreatMsg = "You put the first one on the concrete before the swing is seen coming, and the other two decide it is not worth it. The tier sees that you are not a mark, and it cost you nothing but knuckles.">>
<</if>>
<<else>>
<<if $gameSettings.contentFilter.PlayerFeminization == true>>
<<set _domG = _agg.gender>>
<<set _subG = $player.gender()>>
<<SetAnalPick _domG _subG>>
<<set $nightThreatVideo = _pick>>
<<PrisonCoerceBody>>
<<else>>
<<set $nightThreatVideo = "">>
<</if>>
<<set $prison.rep = Math.max(0, ($prison.rep || 0) - 10)>>
<<run unlockPrisonAchievement('toppedByBlock')>>
/* The clip is _agg alone with the player, so the last bubble is _agg's turn. */
<<if _agg.gender is "Female">>
<<set $nightThreatMsg = [
"There are too many of them and they are not gentle. Two of them go stand the door and the third has the cell to herself with you, and then they trade places, one after another. You cum somewhere in the middle of it, and someone at the rail laughs.",
"You land two punches before their weight buries you. They send two out to the rail and leave one in with you, and she takes her time because nobody is waiting on her shoulder. When she is done she swaps out for the second.",
"Fists are not enough against three. They do it in shifts, one in the cell and two on the walkway, so the tier only ever sees a closed door and a queue."
].random() + "\n\nThen " + _agg.name + " takes her own turn. She straps on, pins you face down on the concrete and fucks your ass until she cums against the base and you cum under her. She leaves you there, reaching for your blues.">>
<<else>>
<<set $nightThreatMsg = [
"There are too many of them and they are not gentle. Two of them go stand the door while the third has the cell alone with you, and then they trade places, one after another. Someone at the rail laughs.",
"You land two punches before their weight buries you. They send two out to the rail and leave one in with you at a time, so nobody is ever waiting on anybody's shoulder.",
"Fists are not enough against three. They do it in shifts, one in the cell and two on the walkway, so the tier only ever sees a closed door and a queue."
].random() + "\n\nThen " + _agg.name + " takes " + _aggPoss + " own turn. " + _aggCap + " pins you face down on the concrete, shoves " + _aggPoss + " cock into your ass and rides it hard until " + _aggSub + " cums deep in you, then leaves you on the cell floor reaching for your blues.">>
<</if>>
<</if>>
<<if _usedSap>><<set $prison.hasSoapSock = false>><<set $nightThreatMsg += " The soap-sock came apart in your hand somewhere in it - one good swing was all it ever had.">><</if>>
<<goto "Prison_NightThreatResult">>
<</button>></div>
<<if ($prison.scrip || 0) gte 10>>
<div class="btn"><<button "Buy them off (10 scrip)">>
<<if ($prison.scrip || 0) gte 10>>
<<set $prison.sceneAuthority = { scene: "nightThreatResult", stintDay: getPrisonStintDay(), targetId: $prison.nightAggressorId }>>
<<set $prison.scrip = ($prison.scrip || 0) - 10>>
<<set $nightThreatVideo = "">>
<<set $nightThreatMsg = "You press ten scrip into " + _aggPoss + " hand. " + _aggCap + " counts it slow, grunts, and they melt back into the dark. Bought, not settled - and they will come again.">>
<<goto "Prison_NightThreatResult">>
<<else>>
<<goto "Prison_NightThreat">>
<</if>>
<</button>></div>
<</if>>
<div class="btn"><<button "Stop fighting and let them fuck you">>
<<set $prison.sceneAuthority = { scene: "nightThreatResult", stintDay: getPrisonStintDay(), targetId: $prison.nightAggressorId }>>
<<if $gameSettings.contentFilter.PlayerFeminization == true>>
<<set _domG = _agg.gender>>
<<set _subG = $player.gender()>>
<<SetAnalPick _domG _subG>>
<<set $nightThreatVideo = _pick>>
<<PrisonCoerceBody>>
<<else>>
<<set $nightThreatVideo = "">>
<</if>>
<<set $prison.rep = Math.max(0, ($prison.rep || 0) - 12)>>
<<run unlockPrisonAchievement('toppedByBlock')>>
/* The clip is _agg alone with the player, so the last bubble is _agg's turn. */
<<if _agg.gender is "Female">>
<<set $nightThreatMsg = [
"You stop fighting. They sort out an order between themselves on the walkway, and then the first one comes in alone and pulls the door to. When she is done she sends the next in on her way out, with the door shut and the gallery only guessing.",
"You lower your hands and bend over before they put you down. They keep it to one woman in the cell at a time, and each of them takes a full turn with the strap before handing the cell over instead of the harness.",
"You give them no fight. One at a time, with the others smoking on the rail, each woman has you over the bunk with the same wet strap. Somebody down the gallery whistles every time the door opens."
].random() + "\n\nThen " + _agg.name + " comes in for her turn and pulls the door to. She bends you over the bunk, straps on and fucks your ass until she cums against the base, and you cum for her before she walks out.">>
<<else>>
<<set $nightThreatMsg = [
"You stop fighting. They sort out an order between themselves on the walkway, and then the first one comes in alone and pulls the door to. Each one sends the next in on the way out; the gallery only ever sees a closed door and somebody waiting a turn.",
"You lower your hands and bend over before they put you down. They keep it to one of them in the cell at a time, and each takes a full turn before handing the cell over.",
"You give them no fight. One at a time, with the others waiting on the rail, each of them uses your ass and cums in you before giving up the cell. Your new place in the pecking order is already set."
].random() + "\n\nThen " + _agg.name + " comes in for " + _aggPoss + " turn and pulls the door to. " + _aggCap + " bends you over the bunk, takes your ass slow because there is nobody rushing " + _aggObj + ", and cums deep in you before walking out.">>
<</if>>
<<goto "Prison_NightThreatResult">>
<</button>></div>
</div>
<<else>>
<<set $prison.sceneAuthority = null>>
<<set $nightThreatMsg = "">>
<<set $nightThreatVideo = "">>
<<set $prison.nightAggressorId = null>>
<<if $prison.inPC>><<goto "Prison_Segregation">><<elseif canRelease()>><<goto "Prison_Block">><<else>><<PrisonNormalNightEvent>><</if>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _nightResultAgg = ($prison && $prison.inside) ? getInmate($prisonRoster, $prison.nightAggressorId) : null>>
<<set _nightResultAuthority = ($prison and $prison.sceneAuthority and $prison.sceneAuthority.scene is "nightThreatResult" and $prison.sceneAuthority.stintDay is getPrisonStintDay() and $prison.sceneAuthority.targetId is $prison.nightAggressorId)>>
<<set _nightResultAllowed = ($prison and $prison.inside and _nightResultAgg and _nightResultAuthority and $nightThreatMsg and $nightThreatMsg isnot "" and not $prison.protected and not $prison.inPC and not $prison.shotCaller and $gameSettings.contentFilter.nonConsent === true and $gameSettings.contentFilter.PlayerFeminization == true and CheckContentFilter(_nightResultAgg.gender, $player))>>
<<if not _nightResultAllowed>>
<<if $prison>><<set $prison.sceneAuthority = null>><</if>>
<<set $nightThreatMsg = "">>
<<set $nightThreatVideo = "">>
<<if $prison>><<set $prison.nightAggressorId = null>><</if>>
<<if not $prison or not $prison.inside>><<goto "PoliceStation">><<elseif $prison.inPC>><<goto "Prison_Segregation">><<else>><<goto "Prison_Block">><</if>>
<<else>>
<<set $prison.sceneAuthority = null>>
<<if $prison.block is "F">>
<<SetBackground "Media/Locations/Prison/block_f_dayroom.jpg">>
<<else>>
<<SetBackground "Media/Locations/Prison/block_m_dayroom.jpg">>
<</if>>
<div class="centre-text">Morning</div>
<<PrisonMediaProse $nightThreatMsg $nightThreatVideo>>
<<if $nightThreatVideo and $nightThreatVideo isnot "">><<Video $nightThreatVideo>><<set $nightThreatVideo = "">><</if>>
<div class="btn padding-top"><<button "Face the day">>
<<set $nightThreatMsg = "">>
<<set $prison.nightAggressorId = null>>
<<goto "Prison_Block">>
<</button>></div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _bailCrossVisit = ($prison && $prison.inside) ? getActiveCrossBlockVisit($prison, { day: getCurrentAbsoluteDay(), hour: $dateTime.hours, minute: $dateTime.minutes }) : null>>
<<if _bailCrossVisit>>
<<goto "Prison_OtherBlock">>
<<elseif $prison && $prison.inside && ($prison.heldMoney || 0) gte 200>>
<<set $prison.heldMoney = 0>>
<<run releasePlayer('bail')>>
<<run $('#prison-sidebar-status').remove()>>
<<SetBackground "Media/Locations/Prison/warden_office.jpg">>
<div class="centre-text">Bailed Out</div>
<div class="chat-container prison-prose"><p class="text">Money changes hands in the warden's office and the paperwork moves fast. You walk out light in the pocket but light in the step - the rest of the bid is somebody else's problem now.</p></div>
<div class="btn padding-top"><<button "Step outside" "PoliceStation">><</button>></div>
<<else>>
<<if not $prison or not $prison.inside>><<goto "PoliceStation">><<elseif $prison.inPC>><<goto "Prison_Segregation">><<else>><<goto "Prison_Block">><</if>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<PrisonPendingMediaGuard "guardMsg" "guardVideo">>
<<SaveLocation>>
<<SetBackground "Media/Locations/Prison/guard_station.jpg">>
<<set _guardGoodTimeRoom = applyGoodTime(0).remaining>>
<div class="centre-text">Guard Station</div>
<<set _cog = ($prison.block is "F") ? "Female" : "Male">>
<<if $guardVideo and $guardVideo isnot "" and not CheckContentFilter(_cog, $player)>><<set $guardMsg = "">><<set $guardVideo = "">><</if>>
<<PrisonPortrait "co" _cog>>
<div class="centre-text" style="font-size:14px;">A bored CO behind reinforced glass. Everything in here has a price, if you know how to ask for it - and some of them take payment in more than scrip.</div>
<<if $guardMsg and $guardMsg isnot "">>
<<PrisonMediaProse $guardMsg $guardVideo>>
<<if $guardVideo and $guardVideo isnot "">><<Video $guardVideo>><<set $guardVideo = "">><</if>>
<<set $guardMsg = "">>
<</if>>
<fieldset>
<legend>The CO</legend>
<div class="btn-container">
<div class="btn"><<button "Talk to Sergeant Boyd">>
<<set $prisonStaffRole = "boyd">>
<<set $prisonStaffTopic = "">>
<<set $prisonStaffPlayerLine = "">>
<<set $prisonStaffLine = "">>
<<set $prisonStaffFollowupPlayerLine = "">>
<<set $prisonStaffFollowupTopic = "">>
<<set $prisonStaffReplyLine = "">>
<<goto "Prison_StaffConversation">>
<</button>></div>
<<if not $prison.bribedGuardToday>>
<<if ($prison.scrip || 0) gte 8>>
<div class="btn"><<button "Grease the CO to lose your heat (8 scrip)">>
<<if not $prison.bribedGuardToday and ($prison.scrip || 0) gte 8>>
<<set $prison.bribedGuardToday = true>>
<<set _out = copBribe({ corrupt: 50, greed: 60, lust: 20 }, "money", ($prison.heat || 0))>>
<<if _out is "accept">>
<<set $prison.scrip = ($prison.scrip || 0) - 8>>
<<set $prison.heat = Math.max(0, ($prison.heat || 0) - 25)>>
<<set $guardMsg = "The CO palms the scrip without looking down, and somewhere your name comes off a list. You breathe easier on the tier.">>
<<elseif _out is "betray">>
<<set $prison.scrip = ($prison.scrip || 0) - 8>>
<<set $prison.heat = Math.min(100, ($prison.heat || 0) + 10)>>
<<set $prison.sceneAuthority = { scene: "solitary", stintDay: getPrisonStintDay() }>>
<<goto "Prison_Solitary">>
<<else>>
<<set $prison.heat = Math.min(100, ($prison.heat || 0) + 5)>>
<<set $guardMsg = "The CO does not take it. Just looks at you until your hand goes back in your pocket, and now you are being watched.">>
<</if>>
<<if _out isnot "betray">><<goto "Prison_GuardStation">><</if>>
<<else>>
<<goto "Prison_GuardStation">>
<</if>>
<</button>></div>
<</if>>
<<if ($prison.scrip || 0) gte 15 and _guardGoodTimeRoom gte 2>>
<div class="btn"><<button "Pay for a good word at review (15 scrip)">>
<<if not $prison.bribedGuardToday and ($prison.scrip || 0) gte 15 and applyGoodTime(0).remaining gte 2>>
<<set $prison.bribedGuardToday = true>>
<<set _out = copBribe({ corrupt: 45, greed: 65, lust: 20 }, "money", ($prison.heat || 0))>>
<<if _out is "accept">>
<<set $prison.scrip = ($prison.scrip || 0) - 15>>
<<set _guardGoodTime = applyGoodTime(2)>>
<<set $guardMsg = "The CO pockets your scrip and falsifies a favorable work review under your number. The time office applies it, removing " + _guardGoodTime.applied + (_guardGoodTime.applied is 1 ? " day" : " days") + " from your bid.">>
<<elseif _out is "betray">>
<<set $prison.scrip = ($prison.scrip || 0) - 15>>
<<set $prison.heat = Math.min(100, ($prison.heat || 0) + 12)>>
<<set $prison.sceneAuthority = { scene: "solitary", stintDay: getPrisonStintDay() }>>
<<goto "Prison_Solitary">>
<<else>>
<<set $guardMsg = "The CO pushes your scrip back across the desk. \"I am not falsifying a review for fifteen packs. Move before I write up the offer.\"">>
<</if>>
<<if _out isnot "betray">><<goto "Prison_GuardStation">><</if>>
<<else>>
<<goto "Prison_GuardStation">>
<</if>>
<</button>></div>
<</if>>
<div class="btn"><<button "Snitch on the block">>
<<if not $prison.bribedGuardToday>>
<<set $prison.bribedGuardToday = true>>
<<set $prison.heat = Math.max(0, ($prison.heat || 0) - 15)>>
<<set $prison.scrip = ($prison.scrip || 0) + 4>>
<<set $prison.rep = Math.max(0, ($prison.rep || 0) - 8)>>
<<set $guardMsg = "You give the CO a name and a where, and a few packs slide back to you for it. It buys you room with the guards - and a shank in the kidney if the tier ever learns who talked.">>
<<goto "Prison_GuardStation">>
<<else>>
<<goto "Prison_GuardStation">>
<</if>>
<</button>></div>
<<set _coG = ($prison.block is "F") ? "Female" : "Male">>
<<set _coWord = ($prison.block is "F") ? "matron" : "screw">>
<<if CheckContentFilter(_coG, $player) and _guardGoodTimeRoom gte 1>>
<div class="btn"><<button "Trade oral sex with the CO for days off your bid">>
<<if not $prison.bribedGuardToday and CheckContentFilter(_coG, $player) and applyGoodTime(0).remaining gte 1>>
<<set $prison.bribedGuardToday = true>>
<<set _coG = ($prison.block is "F") ? "Female" : "Male">>
<<set _coWord = ($prison.block is "F") ? "matron" : "screw">>
<<set _gctx = { speech: ($player.attributes.speech ? $player.attributes.speech.value : 3), corruption: ($player.attributes.corruption ? $player.attributes.corruption.value : 0), heat: ($prison.heat || 0) }>>
<<set _gd = resolveGuardDeal("goodTime", _gctx)>>
<<if _gd.result is "betray">>
<<set $guardMsg = "">>
<<set $prison.sceneAuthority = { scene: "solitary", stintDay: getPrisonStintDay() }>>
<<goto "Prison_Solitary">>
<<elseif _gd.result is "accept">>
<<SpendTime 20>>
<<set _guardGoodTime = applyGoodTime(_gd.goodTime)>>
<<if _gd.scrip>><<set $prison.scrip = ($prison.scrip || 0) + _gd.scrip>><</if>>
<<SetCharProgression $player "corruption" 1 true>>
<<run unlockPrisonAchievement('guardFavor')>>
<<PrisonGuardVideo _coG "oral">>
<<if _coG is "Female">>
<<set $guardMsg = "She waves you through the side door into the dead-end corridor the cameras do not reach and has you on your knees before the latch clicks. You lick the matron's cunt until she cums against your mouth, and she signs " + _guardGoodTime.applied + (_guardGoodTime.applied is 1 ? " day" : " days") + " off your bid while she catches her breath.">>
<<else>>
<<set $guardMsg = "He walks you into the blind corner by the mop closet and unbuckles without a word. You suck the screw's cock on your knees until he cums in your mouth, and he signs " + _guardGoodTime.applied + (_guardGoodTime.applied is 1 ? " day" : " days") + " off your bid while zipping up. Cheaper than years, you tell yourself.">>
<</if>>
<<else>>
<<set $guardMsg = "The " + _coWord + " looks you over and points back toward the tier. \"I am not trading good time for your mouth. Get out before somebody hears the offer.\"">>
<</if>>
<<if _gd.result isnot "betray">><<goto "Prison_GuardStation">><</if>>
<<else>>
<<goto "Prison_GuardStation">>
<</if>>
<</button>></div>
<</if>>
<<if ($prison.heat || 0) gte 15 and CheckContentFilter(_coG, $player)>>
<div class="btn"><<button "Trade sex with the CO to lose your heat">>
<<if not $prison.bribedGuardToday and ($prison.heat || 0) gte 15 and CheckContentFilter(_coG, $player)>>
<<set $prison.bribedGuardToday = true>>
<<set _coG = ($prison.block is "F") ? "Female" : "Male">>
<<set _coWord = ($prison.block is "F") ? "matron" : "screw">>
<<set _gctx = { speech: ($player.attributes.speech ? $player.attributes.speech.value : 3), corruption: ($player.attributes.corruption ? $player.attributes.corruption.value : 0), heat: ($prison.heat || 0) }>>
<<set _gd = resolveGuardDeal("heat", _gctx)>>
<<if _gd.result is "betray">>
<<set $guardMsg = "">>
<<set $prison.sceneAuthority = { scene: "solitary", stintDay: getPrisonStintDay() }>>
<<goto "Prison_Solitary">>
<<elseif _gd.result is "accept">>
<<SpendTime 20>>
<<set $prison.heat = Math.max(0, ($prison.heat || 0) + _gd.heat)>>
<<if _gd.scrip>><<set $prison.scrip = ($prison.scrip || 0) + _gd.scrip>><</if>>
<<SetCharProgression $player "corruption" 1 true>>
<<run unlockPrisonAchievement('guardFavor')>>
<<PrisonGuardVideo _coG "anal">>
<<if _coG is "Female">>
<<set $guardMsg = "She pulls you into the supply room, bends you over the folding table, and fucks your ass with the strap she keeps in her kit. You cum against the steel. She holds the rubber cock in you and grinds herself off on the harness with her fist in your collar, then feeds your write-ups into the shredder one page at a time.">>
<<else>>
<<set $guardMsg = "He takes you into the back, bends you over the desk, and fucks you until he cums in your ass. Then he feeds a fistful of write-ups with your name on them into the shredder and sends you back to the tier with a cleaner sheet.">>
<</if>>
<<else>>
<<set $guardMsg = "The " + _coWord + " looks you over and shakes their head. \"I am not fucking you for a cleaner sheet. Take the offer somewhere else.\"">>
<</if>>
<<if _gd.result isnot "betray">><<goto "Prison_GuardStation">><</if>>
<<else>>
<<goto "Prison_GuardStation">>
<</if>>
<</button>></div>
<</if>>
<<if $gameSettings.contentFilter.nonConsent === true and not $prison.shotCaller and not $prison.guardCoercionToday and CheckContentFilter(_coG, $player)>>
<div class="btn"><<button "Face the CO's sexual ultimatum in the guard blind">>
<<if not $prison.bribedGuardToday and $gameSettings.contentFilter.nonConsent === true and not $prison.shotCaller and not $prison.guardCoercionToday and CheckContentFilter(_coG, $player)>>
<<set $prison.bribedGuardToday = true>>
<<set $prison.sceneAuthority = { scene: "guardCoercion", stintDay: getPrisonStintDay(), block: $prison.block }>>
<<goto "Prison_GuardCoercion">>
<<else>>
<<goto "Prison_GuardStation">>
<</if>>
<</button>></div>
<</if>>
<<else>>
<div class="chat-container prison-prose"><p class="text">The CO has had their dealings with you for one day, and does not so much as look up again until tomorrow.</p></div>
<</if>>
</div>
</fieldset>
<<PrisonNav>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/Prison/guard_station.jpg">>
<<set _coG = ($prison && $prison.block is "F") ? "Female" : "Male">>
<<set _coWord = ($prison && $prison.block is "F") ? "matron" : "screw">>
<<set _guardCoerceVisit = ($prison and $prison.inside) ? getActiveCrossBlockVisit($prison, { day: getCurrentAbsoluteDay(), hour: $dateTime.hours, minute: $dateTime.minutes }) : null>>
<<set _guardCoerceAuthority = ($prison and $prison.sceneAuthority and $prison.sceneAuthority.scene is "guardCoercion" and $prison.sceneAuthority.stintDay is getPrisonStintDay() and $prison.sceneAuthority.block is $prison.block)>>
<<if $prison && $prison.inside && not $prison.inPC and not _guardCoerceVisit and $gameSettings.contentFilter.nonConsent === true and not $prison.shotCaller and CheckContentFilter(_coG, $player)>>
<div class="centre-text">No Cameras Here</div>
<<PrisonPortrait "co" _coG>>
<<if $guardCoerceMsg and $guardCoerceMsg isnot "">>
<<set $prison.sceneAuthority = null>>
<<PrisonMediaProse $guardCoerceMsg $guardVideo>>
<<if $guardVideo and $guardVideo isnot "">><<Video $guardVideo>><<set $guardVideo = "">><</if>>
<div class="btn padding-top"><<button "Face the tier">>
<<set $prison.sceneAuthority = null>>
<<set $guardCoerceMsg = "">>
<<goto "Prison_Block">>
<</button>></div>
<<elseif not $prison.guardCoercionToday and _guardCoerceAuthority>>
<<if _coG is "Female">>
<div class="chat-container prison-prose"><p class="text">The matron waves the other CO off the tier and walks you into the dead-end corridor herself, one hand already at the small of your back. <span class='dialogue-speech'>"You let me fuck your ass with my strap-on in this blind and I clear the heat from your sheet. Refuse, and I put you in segregation for two days. Pick."</span></p></div>
<<else>>
<div class="chat-container prison-prose"><p class="text">The screw pulls you out of the line and into the blind spot behind the sally port, close enough that you can smell the coffee on him. <span class='dialogue-speech'>"You bend over and let me fuck you here, quiet, and the heat on your sheet disappears. Refuse, and I put you in the hole for two days. Your call, inmate."</span></p></div>
<</if>>
<div class="btn-container">
<div class="btn"><<button "Let the CO fuck you to avoid segregation">>
<<set $prison.sceneAuthority = null>>
<<set $prison.guardCoercionToday = true>>
<<SpendTime 20>>
<<set _coG = ($prison.block is "F") ? "Female" : "Male">>
<<set _cf = guardCoercionFallout()>>
<<set $prison.heat = Math.max(0, Math.min(100, ($prison.heat || 0) + _cf.heat))>>
<<set $prison.rep = Math.max(0, ($prison.rep || 0) + _cf.rep)>>
<<PrisonGuardVideo _coG "anal">>
<<PrisonCoerceBody>>
<<if _coG is "Female">>
<<set $guardCoerceMsg = "You do what the matron says because your number is already on the seg list. She pins you against the cold cinderblock by your hair, pushes her strap into your ass, and fucks you until you cum against the wall. She pulls the harness tight and rubs herself to orgasm against the base, then straightens her belt and crosses your number off the paper.">>
<<else>>
<<set $guardCoerceMsg = "You do what the screw says because your number is already on the seg list. He bends you over the cold steel, gets a forearm across your neck and works his cock into your ass until he cums in you. He zips up, crosses your number off the list, and checks the dead camera before opening the door.">>
<</if>>
<<goto "Prison_GuardCoercion">>
<</button>></div>
<div class="btn"><<button "Tell the CO to go to hell">>
<<set $prison.guardCoercionToday = true>>
<<set $prison.rep = Math.min(100, ($prison.rep || 0) + 4)>>
<<set $guardCoerceMsg = "">>
<<set $prison.sceneAuthority = { scene: "solitary", stintDay: getPrisonStintDay() }>>
<<goto "Prison_Solitary">>
<</button>></div>
</div>
<<else>>
<<goto "Prison_GuardStation">>
<</if>>
<<else>>
<<if $prison>><<set $prison.sceneAuthority = null>><</if>>
<<set $guardCoerceMsg = "">><<set $guardVideo = "">>
<<if $prison && $prison.inside and $prison.inPC>><<goto "Prison_Segregation">><<elseif _guardCoerceVisit>><<goto "Prison_OtherBlock">><<elseif $prison && $prison.inside>><<goto "Prison_GuardStation">><<else>><<goto "PoliceStation">><</if>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _staffValid = $prison and $prison.inside and ["boyd", "chaplain", "medical"].includes($prisonStaffRole)>>
<<if not _staffValid>>
<<set $prisonStaffRole = "">>
<<if not $prison or not $prison.inside>><<goto "PoliceStation">><<else>><<goto "Prison_Block">><</if>>
<<else>>
<<if not $prison.staffDialogue or typeof $prison.staffDialogue isnot "object">><<set $prison.staffDialogue = {}>><</if>>
<<if not $prison.staffDialogue[$prisonStaffRole] or typeof $prison.staffDialogue[$prisonStaffRole] isnot "object">>
<<set $prison.staffDialogue[$prisonStaffRole] = { heard: [] }>>
<</if>>
<<set _staffMemory = $prison.staffDialogue[$prisonStaffRole]>>
<<if not Array.isArray(_staffMemory.heard)>><<set _staffMemory.heard = []>><</if>>
<<if $prisonStaffRole is "boyd">>
<<set _staffName = "Sergeant Boyd">>
<<set _staffTitle = "Unit sergeant · order, reports and leverage">>
<<set _staffBack = "Prison_GuardStation">>
<<SetBackground "Media/Locations/Prison/guard_station.jpg">>
<<elseif $prisonStaffRole is "chaplain">>
<<set _staffName = "The Chaplain">>
<<set _staffTitle = "Counselor · quiet, truth and the gate">>
<<set _staffBack = "Prison_Chapel">>
<<SetBackground "Media/Locations/Prison/chapel.jpg">>
<<else>>
<<set _staffName = "Medical Staff">>
<<set _staffTitle = "Infirmary staff · bodies, charts and damage">>
<<set _staffBack = "Prison_Infirmary">>
<<SetBackground "Media/Locations/Prison/infirmary.jpg">>
<</if>>
<div class="centre-text">A Word With <<= _staffName>></div>
<<if $prisonStaffRole is "boyd">><<PrisonPortrait "sergeant">><<elseif $prisonStaffRole is "medical">><<PrisonPortrait "nurse">><</if>>
<div class="prison-conversation-card">
<div class="prison-conversation-card__copy">
<strong><<= _staffName>></strong>
<span><<= _staffTitle>></span>
</div>
</div>
<<if $prisonStaffPlayerLine and $prisonStaffPlayerLine isnot "">>
<div class="prison-conversation-turn prison-conversation-turn--player">
<span class="prison-conversation-turn__speaker">You</span>
<p>"<<= $prisonStaffPlayerLine>>"</p>
</div>
<</if>>
<<if $prisonStaffLine and $prisonStaffLine isnot "">>
<div class="prison-conversation-turn prison-conversation-turn--staff">
<span class="prison-conversation-turn__speaker"><<= _staffName>></span>
<p>"<<= $prisonStaffLine>>"</p>
</div>
<</if>>
<<if $prisonStaffFollowupPlayerLine and $prisonStaffFollowupPlayerLine isnot "" and $prisonStaffFollowupTopic is $prisonStaffTopic>>
<div class="prison-conversation-turn prison-conversation-turn--player">
<span class="prison-conversation-turn__speaker">You</span>
<p>"<<= $prisonStaffFollowupPlayerLine>>"</p>
</div>
<</if>>
<<if $prisonStaffReplyLine and $prisonStaffReplyLine isnot "">>
<div class="prison-conversation-turn prison-conversation-turn--staff">
<span class="prison-conversation-turn__speaker"><<= _staffName>></span>
<p>"<<= $prisonStaffReplyLine>>"</p>
</div>
<</if>>
<<if $prisonStaffTopic and $prisonStaffTopic isnot "" and (not $prisonStaffReplyLine or $prisonStaffReplyLine is "")>>
<fieldset>
<legend>Your answer</legend>
<div class="btn-container">
<div class="btn"><<button "Ask for the part they left out">>
<<if $prisonStaffTopic and (not $prisonStaffReplyLine or $prisonStaffReplyLine is "")>>
<<SpendTime 10>>
<<set $prisonStaffFollowupTopic = $prisonStaffTopic>>
<<if $prisonStaffRole is "boyd">>
<<set $prisonStaffFollowupPlayerLine = "That is the official answer. What did you leave out?">>
<<set $prisonStaffReplyLine = "The part I leave out is that order still hurts people. My job is deciding whether the hurt stops at a tossed cell or grows into blood on the stairs. The report only records what I chose.">>
<<elseif $prisonStaffRole is "chaplain">>
<<set $prisonStaffFollowupPlayerLine = "What is the part nobody says in the circle?">>
<<set $prisonStaffReplyLine = "That some harm cannot be repaired by feeling sorry, and some gates open before a person is ready. Remorse is not a key. It is the weight you choose to carry without handing it to somebody else.">>
<<else>>
<<set $prisonStaffFollowupPlayerLine = "What does the chart leave out?">>
<<set $prisonStaffReplyLine = "Fear, mostly. Men call panic chest pain and women call bruises a fall. The chart gets symptoms because telling the truth in this building can make the next night worse.">>
<</if>>
<</if>>
<<goto "Prison_StaffConversation">>
<</button>></div>
<div class="btn"><<button "Push back">>
<<if $prisonStaffTopic and (not $prisonStaffReplyLine or $prisonStaffReplyLine is "")>>
<<SpendTime 10>>
<<set $prisonStaffFollowupTopic = $prisonStaffTopic>>
<<if $prisonStaffRole is "boyd">>
<<set $prisonStaffFollowupPlayerLine = "You make the cage sound reasonable. It is still a cage.">>
<<set $prisonStaffReplyLine = "Good. Keep that spine. Just learn the difference between standing up and giving a tired officer an easy line for the incident report. The block eats people who confuse the two.">>
<<elseif $prisonStaffRole is "chaplain">>
<<set $prisonStaffFollowupPlayerLine = "That sounds clean from this side of the locked door.">>
<<set $prisonStaffReplyLine = "Then argue with me. Anger spoken in this room is cheaper than anger swung on the tier. I do not need you agreeable. I need you honest enough to know what the anger is asking you to do.">>
<<else>>
<<set $prisonStaffFollowupPlayerLine = "You patch us and send us back to what broke us.">>
<<set $prisonStaffReplyLine = "Yes. I hate that sentence because it is true. I can document, treat and sometimes keep somebody overnight. I cannot prescribe a different prison.">>
<</if>>
<</if>>
<<goto "Prison_StaffConversation">>
<</button>></div>
<div class="btn"><<button "Let the answer stand">>
<<if $prisonStaffTopic and (not $prisonStaffReplyLine or $prisonStaffReplyLine is "")>>
<<SpendTime 10>>
<<set $prisonStaffFollowupTopic = $prisonStaffTopic>>
<<set $prisonStaffFollowupPlayerLine = "All right. I hear you.">>
<<if $prisonStaffRole is "boyd">>
<<set $prisonStaffReplyLine = "Then remember it when the tier offers you a fast answer. Fast answers make thick jackets. Quiet choices are the ones that get a number through the gate.">>
<<elseif $prisonStaffRole is "chaplain">>
<<set $prisonStaffReplyLine = "You do not have to solve it in this chair. Carry the question clean for a while. That is still movement.">>
<<else>>
<<set $prisonStaffReplyLine = "Good. Drink water, sleep when the block lets you and come here before an injury turns proud and permanent.">>
<</if>>
<</if>>
<<goto "Prison_StaffConversation">>
<</button>></div>
</div>
</fieldset>
<<else>>
<fieldset>
<legend>Choose the next subject</legend>
<div class="prison-conversation-topics">
<<if $prisonStaffRole is "boyd">>
<div class="btn"><<button "Ask what staff really wants">>
<<SpendTime 10>>
<<set $prisonStaffTopic = "order">>
<<set $prisonStaffReplyLine = "">>
<<set $prisonStaffPlayerLine = "What do staff want from somebody doing time?">>
<<if _staffMemory.heard.includes("order")>>
<<set $prisonStaffLine = "Same answer as before: make count, keep your hands where the cameras can see them and do not turn a small problem into paperwork that follows you to the board.">>
<<else>>
<<set $prisonStaffLine = "Order first. Paper second. I want count to clear, nobody bleeding on the stairs and no surprise waiting behind a cell door. Give me that and I can make your file boring. Boring files walk.">>
<<run _staffMemory.heard.push("order")>>
<</if>>
<<goto "Prison_StaffConversation">>
<</button>></div>
<div class="btn"><<button "Ask how Boyd reads your file">>
<<SpendTime 10>>
<<set $prisonStaffTopic = "file">>
<<set $prisonStaffReplyLine = "">>
<<set $prisonStaffPlayerLine = "When you open my jacket, what do you see?">>
<<if _staffMemory.heard.includes("file")>>
<<set $prisonStaffLine = "The numbers moved, but the rule did not. Heat tells me what follows you. Programs tell the board what you followed. Neither one tells the whole truth.">>
<<else>>
<<set $prisonStaffLine = "I see " + ($prison.heat || 0) + " points of heat and " + ($prison.programming || 0) + " program marks. The first tells me how much trouble finds you. The second gives the board a reason to believe you can live by a schedule outside.">>
<<run _staffMemory.heard.push("file")>>
<</if>>
<<goto "Prison_StaffConversation">>
<</button>></div>
<div class="btn"><<button "Ask why Boyd works this block">>
<<SpendTime 10>>
<<set $prisonStaffTopic = "why">>
<<set $prisonStaffReplyLine = "">>
<<set $prisonStaffPlayerLine = "Why keep coming back to this block?">>
<<if _staffMemory.heard.includes("why")>>
<<set $prisonStaffLine = "Because somebody has to know the difference between a loud inmate and a dangerous one. Bad officers treat them the same and make both worse.">>
<<else>>
<<set $prisonStaffLine = "Because officers who enjoy the keys should not have them. I am good at spotting the ten seconds before a room goes bad. On the best days, that is enough to keep a con alive without anybody noticing.">>
<<run _staffMemory.heard.push("why")>>
<</if>>
<<goto "Prison_StaffConversation">>
<</button>></div>
<<elseif $prisonStaffRole is "chaplain">>
<div class="btn"><<button "Talk about guilt">>
<<SpendTime 10>>
<<set $prisonStaffTopic = "guilt">>
<<set $prisonStaffReplyLine = "">>
<<set $prisonStaffPlayerLine = "What am I supposed to do with the guilt?">>
<<if _staffMemory.heard.includes("guilt")>>
<<set $prisonStaffLine = "Do not use guilt as a mirror. Use it as a map. If it only shows you how terrible you feel, it is still pointing at you instead of the harm.">>
<<else>>
<<set $prisonStaffLine = "Name what you did without making yourself the victim of it. Then decide what repair is still yours to make. Guilt that never becomes responsibility is just another way to keep staring at yourself.">>
<<run _staffMemory.heard.push("guilt")>>
<</if>>
<<goto "Prison_StaffConversation">>
<</button>></div>
<div class="btn"><<button "Ask how to survive the bid">>
<<SpendTime 10>>
<<set $prisonStaffTopic = "survive">>
<<set $prisonStaffReplyLine = "">>
<<set $prisonStaffPlayerLine = "How do I do the time without becoming the time?">>
<<if _staffMemory.heard.includes("survive")>>
<<set $prisonStaffLine = "Keep one habit the block did not choose for you. A page, a prayer, a workout done for yourself. The institution takes ownership by inches. Keep reclaiming one.">>
<<else>>
<<set $prisonStaffLine = "Build a day the state does not completely own. Read something that is not a rulebook. Tell the truth in one room. Keep one promise nobody can reward. Small freedoms survive searches better than big declarations.">>
<<run _staffMemory.heard.push("survive")>>
<</if>>
<<goto "Prison_StaffConversation">>
<</button>></div>
<div class="btn"><<button "Ask about walking through the gate">>
<<SpendTime 10>>
<<set $prisonStaffTopic = "gate">>
<<set $prisonStaffReplyLine = "">>
<<set $prisonStaffPlayerLine = "What is the first thing people get wrong after the gate?">>
<<if _staffMemory.heard.includes("gate")>>
<<set $prisonStaffLine = "They plan the first hour and forget the first lonely night. Know who you can call when freedom stops feeling like celebration.">>
<<else>>
<<set $prisonStaffLine = "They think release is an ending. It is a room full of choices made with prison reflexes. Plan the first meal, the first bed and the first person you call before the gate puts noise back around you.">>
<<run _staffMemory.heard.push("gate")>>
<</if>>
<<goto "Prison_StaffConversation">>
<</button>></div>
<<else>>
<div class="btn"><<button "Ask what the block does to people">>
<<SpendTime 10>>
<<set $prisonStaffTopic = "damage">>
<<set $prisonStaffReplyLine = "">>
<<set $prisonStaffPlayerLine = "What does this place do to people that nobody sees?">>
<<if _staffMemory.heard.includes("damage")>>
<<set $prisonStaffLine = "Most people here sleep four hours and report eight. The alarms keep going in your head after the speakers stop.">>
<<else>>
<<set $prisonStaffLine = "It teaches the body that every sound is a warning. Jaws lock, stomachs burn, sleep breaks into ten-minute pieces. Then the chart says headache because headache is easier to admit than fear.">>
<<run _staffMemory.heard.push("damage")>>
<</if>>
<<goto "Prison_StaffConversation">>
<</button>></div>
<div class="btn"><<button "Ask what injuries get ignored">>
<<SpendTime 10>>
<<set $prisonStaffTopic = "ignored">>
<<set $prisonStaffReplyLine = "">>
<<set $prisonStaffPlayerLine = "What do inmates wait too long to bring here?">>
<<if _staffMemory.heard.includes("ignored")>>
<<set $prisonStaffLine = "Teeth, infections and head injuries. Pain that threatens a reputation gets hidden until it threatens a life.">>
<<else>>
<<set $prisonStaffLine = "Head injuries after fights. Infections after improvised sex and improvised surgery. Anything that requires saying who did it. Pride turns treatable damage into permanent damage every week.">>
<<run _staffMemory.heard.push("ignored")>>
<</if>>
<<goto "Prison_StaffConversation">>
<</button>></div>
<div class="btn"><<button "Ask what your chart says">>
<<SpendTime 10>>
<<set $prisonStaffTopic = "chart">>
<<set $prisonStaffReplyLine = "">>
<<set $prisonStaffPlayerLine = "What does my chart say when I am not looking?">>
<<if _staffMemory.heard.includes("chart")>>
<<set $prisonStaffLine = "It still says what your body can prove. If something changes, come before the block teaches you to call it normal.">>
<<else>>
<<set $prisonStaffLine = "It says health " + Math.round($player.status.health.value) + " out of 100, heat " + ($prison.heat || 0) + ", and a patient who wants the paper to explain more than paper can. I write injuries. I also notice patterns.">>
<<run _staffMemory.heard.push("chart")>>
<</if>>
<<goto "Prison_StaffConversation">>
<</button>></div>
<</if>>
</div>
</fieldset>
<</if>>
<div class="prison-actnote">Each answer takes ten minutes. Staff remember which subjects you have already raised during this bid.</div>
<div class="prison-imenu__foot"><div class="btn"><<button "End the conversation" _staffBack>>
<<set $prisonStaffTopic = "">>
<<set $prisonStaffPlayerLine = "">>
<<set $prisonStaffLine = "">>
<<set $prisonStaffFollowupPlayerLine = "">>
<<set $prisonStaffFollowupTopic = "">>
<<set $prisonStaffReplyLine = "">>
<</button>></div></div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if not $prison or not $prison.inside>>
<<goto "PoliceStation">>
<<else>>
<<run ensurePrisonSkills($prison)>>
<<run ensurePrisonDirector($prison)>>
<<set _skillBack = ($player.info.currentLocation and prisonPath($player.info.currentLocation, $player.info.currentLocation).length) ? $player.info.currentLocation : "Prison_Block">>
<<SetBackground "Media/Locations/Prison/block_m_dayroom.jpg">>
<div class="centre-text">Prison Skills</div>
<div class="centre-text" style="font-size:14px;">Time inside teaches techniques the street attributes do not. Earn points from work, training, games, programming and completed tier business.</div>
<<if $prisonSkillMsg and $prisonSkillMsg isnot "">>
<<PrisonProse $prisonSkillMsg>>
<<set $prisonSkillMsg = "">>
<</if>>
<fieldset>
<legend>Points: <<= $prison.skills.points>></legend>
<div class="prison-roster">
<<for _skill range PRISON_SKILLS>>
<<set _level = $prison.skills.levels[_skill]>>
<<set _cost = prisonSkillCost(_level)>>
<<capture _skill _level _cost>>
<div class="prison-business-choice">
<div class="prison-business-choice__copy">
<strong><<= prisonSkillLabel(_skill)>> <<= _level>>/10</strong>
<<if _skill is "stealth">><span>Safer corridor movement and cross-block checks.</span>
<<elseif _skill is "persuasion">><span>Better speech leverage in tier business.</span>
<<elseif _skill is "trade">><span>Lower commissary prices.</span>
<<elseif _skill is "crafting">><span>A chance to recover extra useful scrap.</span>
<<elseif _skill is "lockpick">><span>An additive bonus on prison stealth routes.</span>
<<else>><span>Lower energy costs for work and the weight pile.</span><</if>>
</div>
<<if _level gte 10>>
<div class="btn non-interacting"><<button "Mastered">><</button>></div>
<<elseif canBuyPrisonSkill($prison, _skill)>>
<<set _buyLabel = "Buy next level (" + _cost + " points)">>
<div class="btn"><<button _buyLabel>>
<<set _buy = buyPrisonSkill($prison, _skill)>>
<<if _buy.ok>><<set $prisonSkillMsg = prisonSkillLabel(_skill) + " rises to level " + _buy.level + ".">>
<<else>><<set $prisonSkillMsg = "The point balance changed before the purchase completed.">><</if>>
<<goto "Prison_Skills">>
<</button>></div>
<<else>>
<<set _needLabel = "Need " + _cost + " points">>
<div class="btn non-interacting"><<button _needLabel>><</button>></div>
<</if>>
</div>
<</capture>>
<</for>>
</div>
</fieldset>
<fieldset>
<legend>Stealth posture</legend>
<div class="centre-text" style="font-size:13px;"><<= $prison.skills.stealthActive ? "Active: you use slower blind routes. This lowers corridor incident risk and improves stealth crossings." : "Inactive: you move openly and keep your hands visible.">></div>
<<set _stealthLabel = $prison.skills.stealthActive ? "Drop stealth posture" : "Move in stealth posture">>
<div class="btn"><<button _stealthLabel>><<run togglePrisonStealth($prison)>><<goto "Prison_Skills">><</button>></div>
</fieldset>
<fieldset>
<legend>Pressure on the bid</legend>
<div class="centre-text" style="font-size:13px;">Director: <<= $prison.director.lastBand>> · pressure <<= Math.round($prison.director.pressure * 10) / 10>> · boredom <<= Math.round($prison.director.boredom)>>/100</div>
<<if $prison.director.reliefOffer>><div class="prison-actnote">An unclaimed internal odd job is waiting on the block. It may pay four scrip if another inmate does not beat you to the paid half.</div><</if>>
</fieldset>
<div class="btn padding-top"><<button "Back" _skillBack>><</button>></div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _travelPending = ($prison and $prison.travel) ? $prison.travel.pending : null>>
<<set _travelEvent = _travelPending ? getPrisonTravelEvent(_travelPending.eventKey) : null>>
<<if not $prison or not $prison.inside>>
<<goto "PoliceStation">>
<<elseif not _travelPending or not _travelEvent>>
<<set _travelFallback = clearPrisonTravelIncident($prison)>>
<<goto _travelFallback>>
<<else>>
<<if $prison.block is "F">><<SetBackground "Media/Locations/Prison/tier_f.jpg">><<else>><<SetBackground "Media/Locations/Prison/tier_m.jpg">><</if>>
<div class="centre-text"><<= _travelEvent.title>></div>
<<PrisonProse _travelEvent.text>>
<div class="btn-container">
<<for _travelChoice range _travelEvent.choices>>
<<capture _travelChoice>>
<div class="btn"><<button _travelChoice.label>>
<<set _travelResolution = resolvePrisonTravelChoice($prison, _travelChoice.key)>>
<<if _travelResolution.ok>>
<<set $prisonTravelResult = _travelResolution.text>>
<<set $prisonTravelDestination = _travelResolution.destination>>
<<run recordPrisonDirectorEvent($prison, "incident")>>
<<goto "Prison_TravelResult">>
<<else>>
<<goto "Prison_TravelIncident">>
<</if>>
<</button>></div>
<</capture>>
<</for>>
</div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _travelDestination = ($prisonTravelDestination and prisonPath($prisonTravelDestination, $prisonTravelDestination).length) ? $prisonTravelDestination : "Prison_Block">>
<<if not $prison or not $prison.inside>>
<<set $prisonTravelResult = "">><<set $prisonTravelDestination = "">>
<<goto "PoliceStation">>
<<else>>
<<if $prison.block is "F">><<SetBackground "Media/Locations/Prison/tier_f.jpg">><<else>><<SetBackground "Media/Locations/Prison/tier_m.jpg">><</if>>
<div class="centre-text">The Walk Continues</div>
<<if $prisonTravelResult and $prisonTravelResult isnot "">><<PrisonProse $prisonTravelResult>><</if>>
<div class="btn padding-top"><<button "Keep moving">>
<<set $prisonTravelResult = "">>
<<set $prisonTravelDestination = "">>
<<goto _travelDestination>>
<</button>></div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<SetBackground "Media/Locations/Prison/chapel.jpg">>
<div class="centre-text">The Chapel</div>
<div class="centre-text" style="font-size:14px;">A low room of folding chairs and a plain cross, and the one door on the block nobody has to watch their back through. The chaplain nods from the front and asks nothing of you.</div>
<<if $chapelMsg and $chapelMsg isnot "">>
<<PrisonProse $chapelMsg>>
<<set $chapelMsg = "">>
<</if>>
<fieldset>
<legend>The Chapel</legend>
<div class="btn-container">
<div class="btn"><<button "Talk with the chaplain">>
<<set $prisonStaffRole = "chaplain">>
<<set $prisonStaffTopic = "">>
<<set $prisonStaffPlayerLine = "">>
<<set $prisonStaffLine = "">>
<<set $prisonStaffFollowupPlayerLine = "">>
<<set $prisonStaffFollowupTopic = "">>
<<set $prisonStaffReplyLine = "">>
<<goto "Prison_StaffConversation">>
<</button>></div>
<div class="btn"><<button "Sit an hour in the quiet">>
<<SpendTime 60>>
<<set $prison.heat = Math.max(0, ($prison.heat || 0) - 6)>>
<<run $player.status.energy.increase(15)>>
<<set $chapelMsg = [
"You take a chair in the back. For one hour nobody asks what you owe or who you sit with at chow. When the bell sounds, your shoulders have dropped away from your ears.",
"You sit with your hands open on your knees and breathe. The block noise is a rumor through the wall. Whatever the day did to you, an hour in here files some of the edge off it.",
"Nobody bothers you here. Some weeks the quiet does more than the chaplain says.",
"You lose the minutes staring at the plain cross and the water stain behind it. When the bell sounds, you stand without having to force your shoulders down."
].random()>>
<<goto "Prison_Chapel">>
<</button>></div>
<div class="btn"><<button "Take the chaplain's counsel">>
<<SpendTime 30>>
<<run $player.status.energy.increase(8)>>
<<set $chapelMsg = [
"The chaplain pours coffee from a scorched pot and lets you talk until you run out. Then he asks what you will do first when the gate opens. You work through an answer, one careful piece at a time.",
"\"You angry, or you scared?\" he asks. When you say both, he nods. \"Good. Means we can stop pretending one is the other.\" The rest of the talk is less comfortable and more useful.",
"You tell him who you are carrying a grudge against. He does not tell you to forgive them. He asks what you plan to do when you see them on the yard and makes you say the answer twice.",
"\"The last stretch makes people stupid,\" he says. \"They smell the street and start gambling with the date. Keep your hands clean and make the gate.\""
].random()>>
<<goto "Prison_Chapel">>
<</button>></div>
<<if not $prison.chapelToday>>
<div class="btn"><<button "Sit in on the meeting">>
<<set $prison.chapelToday = true>>
<<SpendTime 60>>
<<set $prison.programming = ($prison.programming || 0) + 1>>
<<run awardPrisonSkillPoints($prison, "programming", "chapel")>>
<<run recordPrisonDirectorEvent($prison, "activity")>>
<<set $prison.heat = Math.max(0, ($prison.heat || 0) - 4)>>
<<set $chapelMsg = [
"You take a folding chair in the circle and mostly listen. Cons you have only ever seen throw hands in the yard talk low about the outside they lost and the one they are trying to keep. Nobody is a wolf in here. For an hour you are all just people counting days, and the counselor logs your name for the board.",
"The group runs the way these always do - somebody talking too long, somebody not talking at all, and the slow surprise of hearing your own week in another person's mouth. You say a little. The counselor marks you present, and that mark is worth something when the board reads your file.",
"You do not say much, but you show up and you sit the hour, and on a bid that counts for more than it should. The paperwork of your good behavior is quietly thicker for it.",
"An old head two chairs down says the thing you needed to hear without knowing it was aimed at you. You leave the circle steadier, and one more session heavier in the file the parole board will someday open."
].random()>>
<<goto "Prison_Chapel">>
<</button>></div>
<<else>>
<div class="centre-text" style="font-size:13px;">You have sat your hour with the group today. There is another circle tomorrow.</div>
<</if>>
</div>
</fieldset>
<<PrisonNav>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<PrisonPendingMediaGuard "infirmaryMsg" "infirmaryVideo" "infirmaryContent">>
<<SaveLocation>>
<<set _infirmaryVisit = ($prison and $prison.inside) ? getActiveCrossBlockVisit($prison, { day: getCurrentAbsoluteDay(), hour: $dateTime.hours, minute: $dateTime.minutes }) : null>>
<<if not $prison or not $prison.inside>>
<<set $infirmaryMsg = "">><<set $infirmaryVideo = "">><<set $infirmaryContent = null>>
<<goto "PoliceStation">>
<<elseif $prison.inPC>>
<<set $infirmaryMsg = "">><<set $infirmaryVideo = "">><<set $infirmaryContent = null>>
<<goto "Prison_Segregation">>
<<elseif _infirmaryVisit>>
<<set $infirmaryMsg = "">><<set $infirmaryVideo = "">><<set $infirmaryContent = null>>
<<goto "Prison_OtherBlock">>
<<else>>
<<SetBackground "Media/Locations/Prison/infirmary.jpg">>
<div class="centre-text">Infirmary</div>
<<PrisonPortrait "nurse">>
<div class="centre-text" style="font-size:14px;">Bleach and old blood, and a nurse who has seen every kind of damage this place makes.</div>
<<set _infirmaryPending = (($infirmaryMsg and $infirmaryMsg isnot "") or ($infirmaryVideo and $infirmaryVideo isnot ""))>>
<<set _infirmaryPendingAllowed = (not _infirmaryPending or ($infirmaryContent and (not $infirmaryContent.adult or (CheckContentFilter($infirmaryContent.partnerGender, $player) and (not $infirmaryContent.nonConsent or $gameSettings.contentFilter.nonConsent === true) and (not $infirmaryContent.playerFeminization or $gameSettings.contentFilter.PlayerFeminization == true)))))>>
<<if not _infirmaryPendingAllowed>>
<<set $infirmaryMsg = "">>
<<set $infirmaryVideo = "">>
<<set $infirmaryContent = null>>
<</if>>
<<if $infirmaryMsg and $infirmaryMsg isnot "">>
<<PrisonMediaProse $infirmaryMsg $infirmaryVideo>>
<<if $infirmaryVideo and $infirmaryVideo isnot "">><<Video $infirmaryVideo>><<set $infirmaryVideo = "">><</if>>
<<set $infirmaryMsg = "">>
<<set $infirmaryContent = null>>
<</if>>
<fieldset>
<legend>Medical</legend>
<div class="btn-container">
<div class="btn"><<button "Talk to medical staff">>
<<set $prisonStaffRole = "medical">>
<<set $prisonStaffTopic = "">>
<<set $prisonStaffPlayerLine = "">>
<<set $prisonStaffLine = "">>
<<set $prisonStaffFollowupPlayerLine = "">>
<<set $prisonStaffFollowupTopic = "">>
<<set $prisonStaffReplyLine = "">>
<<goto "Prison_StaffConversation">>
<</button>></div>
<div class="btn"><<button "Get patched up">>
<<run $player.status.health.increase(50)>>
<<SpendTime 60>>
<<set $infirmaryContent = { adult: false }>>
<<set $infirmaryMsg = "The nurse cleans and closes what needs it, hands you two aspirin, and tells you to stop getting into things. You feel almost human again.">>
<<goto "Prison_Infirmary">>
<</button>></div>
<<if CheckContentFilter("Female", $player) and not $prison.nurseFlirtToday and not prisonPlayerActiveSexBlocked($player, $playerlock)>>
<div class="btn"><<button "Get friendly with the nurse">>
<<if prisonPlayerActiveSexBlocked($player, $playerlock)>>
<<set $infirmaryContent = { adult: false }>>
<<set $infirmaryMsg = "Your locked cock rules out fucking her. You leave the curtain open and keep the visit medical.">>
<<goto "Prison_Infirmary">>
<<else>>
<<set $prison.nurseFlirtToday = true>>
<<SpendTime 45>>
<<set _sp = $player.attributes.speech ? $player.attributes.speech.value : 3>>
<<set _cor = $player.attributes.corruption ? $player.attributes.corruption.value : 0>>
<<if random(1, 100) lte (12 + _sp * 6 + _cor * 3)>>
<<SetVagPick $player.gender() "Female">>
<<set $infirmaryVideo = _pick>>
<<set $infirmaryContent = { adult: true, partnerGender: "Female" }>>
<<run $player.status.health.increase(25)>>
<<SetCharProgression $player "corruption" 1 true>>
<<if $player.gender() is "Female">>
<<set $infirmaryMsg = [
"She checks the door, pulls the curtain, and lets you back her onto the exam table. You buckle on a prison-made strap and fuck her cunt until she cums with her heels hooked behind you. You hold the rubber cock deep and grind your clit down on the harness until you cum too. She fixes her hair and tells you to come back if anything else starts to hurt.",
"A look holds too long and a hand does not pull away. She draws the curtain and gets on the table. You put your mouth on her cunt and stay there until she cums against it, then buckle on a prison-made strap and fuck her cunt through a second orgasm. You rub the base over your clit and cum biting the paper roll. She wipes the table before opening the curtain.",
"She locks the drug cabinet and hauls you behind the curtain. You push a prison-made strap into her cunt and fuck her over the exam table until she cums, then grind yourself to orgasm against the harness. She signs you fit for duty with a flushed face and a private smile."
].random()>>
<<else>>
<<set $infirmaryMsg = [
"She checks the door, pulls the curtain, and lets you back her onto the exam table. You push your cock into her cunt and fuck her until she cums with her heels hooked behind you, then cum inside her. She fixes her hair and tells you to come back if anything else starts to hurt.",
"A look holds too long and a hand does not pull away. She draws the curtain and gets on the table. You eat her out until her thighs clamp your head and she cums, then slide your cock into her cunt and fuck her until you cum inside her with her heels crossed over your back. Best medicine in the building.",
"She locks the drug cabinet and hauls you behind the curtain. You bend her over the exam table, bury yourself in her cunt and keep at it until she cums, then bottom out and empty into her. She signs you fit for duty with a flushed face and a private smile."
].random()>>
<</if>>
<<else>>
<<set $infirmaryVideo = "">>
<<set $infirmaryContent = { adult: false }>>
<<set $prison.heat = Math.min(100, ($prison.heat || 0) + 5)>>
<<set $infirmaryMsg = "She is not interested, and the look she gives you could curdle milk. She makes a note in your chart with a hard little line under it - the kind that follows you to the board. Best not to push it with the one person who stitches you up.">>
<</if>>
<<goto "Prison_Infirmary">>
<</if>>
<</button>></div>
<<elseif CheckContentFilter("Female", $player)>>
<div class="prison-actnote">The nurse has had enough of you for one shift. Come back tomorrow, and mind your manners about it.</div>
<</if>>
<<if CheckContentFilter("Female", $player) and not $prison.nurseFlirtToday and prisonPlayerActiveSexBlocked($player, $playerlock)>>
<div class="prison-actnote">You cannot use your cock with the nurse while it is caged. Keep the visit medical or approach the doctor for a passive encounter.</div>
<</if>>
<<if CheckContentFilter("Male", $player) and not $prison.nurseFlirtToday>>
<div class="btn"><<button "Get friendly with the doctor">>
<<set $prison.nurseFlirtToday = true>>
<<SpendTime 45>>
<<set _sp = $player.attributes.speech ? $player.attributes.speech.value : 3>>
<<set _cor = $player.attributes.corruption ? $player.attributes.corruption.value : 0>>
<<if random(1, 100) lte (12 + _sp * 6 + _cor * 3)>>
<<if $player.gender() is "Female">><<SetVagPick "Male" "Female">><<else>><<SetAnalPick "Male" $player.gender()>><</if>>
<<set $infirmaryVideo = _pick>>
<<set $infirmaryContent = { adult: true, partnerGender: "Male" }>>
<<run $player.status.health.increase(25)>>
<<SetCharProgression $player "corruption" 1 true>>
<<if $player.gender() is "Female">>
<<set $infirmaryMsg = [
"The doctor is new to the job and bored enough to risk it. He draws the curtain, gets you on the exam table, and takes his time with two fingers and then his cock. You cum with his hand over your mouth; he follows and cums inside you while a CO drones past the door.",
"You let him back you against the supply shelves and he gets your blues down, pushes his cock into your cunt, and fucks you fast and quiet until you cum. He cums inside you with the gauze and bottles rattling, then presses extra aspirin into your hand."
].random()>>
<<else>>
<<set $infirmaryMsg = [
"The doctor is new to the job and bored enough to risk it. He draws the curtain, bends you over the exam table, and fucks your ass slow and clinical while stroking your cock with one gloved hand. You cum onto the paper; he follows and cums inside you while a CO drones past the door.",
"You let him crowd you against the supply shelves and he gets his cock into your ass fast and quiet. You stroke yourself until you cum while the gauze rattles; he cums in you and presses extra aspirin into your hand afterward."
].random()>>
<</if>>
<<else>>
<<set $infirmaryVideo = "">>
<<set $infirmaryContent = { adult: false }>>
<<set $prison.heat = Math.min(100, ($prison.heat || 0) + 5)>>
<<set $infirmaryMsg = "He is all business today. You make the offer; he reaches for your chart and writes inappropriate conduct across the note. You leave before he calls an officer.">>
<</if>>
<<goto "Prison_Infirmary">>
<</button>></div>
<<elseif CheckContentFilter("Male", $player)>>
<div class="prison-actnote">The doctor has no more patience for you today. Try your luck tomorrow, if your nerve holds.</div>
<</if>>
<<set _infStaff = []>>
<<if CheckContentFilter("Female", $player)>><<run _infStaff.push("Female")>><</if>>
<<if CheckContentFilter("Male", $player)>><<run _infStaff.push("Male")>><</if>>
<<if not $prison.infirmaryFavorToday and _infStaff.length > 0>>
<div class="btn"><<button "Pay staff with sex for a clean chart and good medicine">>
<<set $prison.infirmaryFavorToday = true>>
<<SpendTime 40>>
<<set _stG = _infStaff.random()>>
<<set _infirmaryFeminizes = ($gameSettings.contentFilter.PlayerFeminization == true and $player.gender() isnot "Female")>>
<<set $infirmaryContent = { adult: true, playerFeminization: _infirmaryFeminizes, partnerGender: _stG }>>
/* Body read first: the whole scene below branches on _pg, and the step
applied afterwards must not decide which body the scene describes. */
<<set _pg = $player.gender()>>
<<if _pg is "Female">><<SetVagPick _stG "Female">><<else>><<SetAnalPick _stG _pg>><</if>>
<<set $infirmaryVideo = _pick>>
<<PrisonCoerceBody>>
<<run $player.status.health.increase(35)>>
<<set $prison.heat = Math.max(0, ($prison.heat || 0) - 6)>>
<<SetCharProgression $player "corruption" 1 true>>
<<set _gt = (random(1, 100) lte 45) ? 1 : 0>>
<<set _infirmaryGoodTime = _gt ? applyGoodTime(_gt) : null>>
<<run unlockPrisonAchievement('nurseFavor')>>
<<set _gtNote = "">>
<<if _infirmaryGoodTime>>
<<if _infirmaryGoodTime.applied gt 0>>
<<set _gtNote = " " + _infirmaryGoodTime.applied + (_infirmaryGoodTime.applied is 1 ? " medical-hold day comes" : " medical-hold days come") + " off your bid too, quietly signed.">>
<<else>>
<<set _gtNote = " The chart is clean, but today's good-time allowance is full; no additional days come off your bid.">>
<</if>>
<</if>>
<<if _stG is "Female" and _pg is "Female">>
<<set $infirmaryMsg = [
'"You know the drill. Up on the table, blues off." The nurse snaps the curtain shut, licks your clit, and curls two gloved fingers into your cunt until your heels drum the paper. Then she straps on and fucks your cunt while a CO passes the door. You cum around the strap. She keeps it buried and rolls her hips on the harness until she cums with a hand flat on your sternum. Afterward she patches you, tucks good painkillers into your waistband, and takes heat off your sheet.',
'"Table. Now. Keep it down." The nurse buries her face between your thighs until you cum biting your wrist, then straps on and fucks your cunt slow and deep. She pulls the harness tight and rubs herself to orgasm with the strap buried in you. "Fit for duty," she says, flushed, before signing the chart and pressing good pills into your hand.'
].random() + _gtNote>>
<<elseif _stG is "Female">>
<<set $infirmaryMsg = [
'"On the table, face down. You want the chart clean, this is what clean costs." The nurse works your ass open with slick fingers, feeds a prison-made strap into you, and fucks you while stroking your cock. You cum onto the paper. She keeps the strap in your ass and presses down on the harness until she cums standing over you. Afterward she patches you, tucks good painkillers into your waistband, and clears heat from your sheet.',
'The nurse jerks her chin at the table, strap already in hand. "Blues down. You bend, I sign." She fingers your ass open and fucks you with the strap while you fist the paper roll. You cum under her. She tightens the buckles and rides the base to her own orgasm, then patches you, gives you good pills, and takes heat off your chart.'
].random() + _gtNote>>
<<elseif _pg is "Female">>
<<set $infirmaryMsg = [
'"Up on the table. You want it off the books, we do it my way." The doctor fingers your cunt, pushes his cock in, and fucks you while a CO passes the door. You cum under him; he cums inside you and holds there before pulling out. Afterward he patches you, tucks good painkillers into your waistband, and clears heat from your chart.',
'The doctor closes the curtain. "Blues off. Fast and quiet and we are square." He pushes into your cunt and fucks you until you cum against the paper. He cums in you, straightens his coat, patches you, and quietly takes heat off your sheet.'
].random() + _gtNote>>
<<else>>
<<set $infirmaryMsg = [
'"Face down on the table. You came to me, remember that." The doctor draws the curtain and snaps on a glove, and you bend where he wants you. He greases you with two fingers and then pushes his cock into your ass slow, one gloved hand flat on your spine while a CO passes the door none the wiser. Your own cock hangs hard and useless beneath you, and he reaches under once to feel it, amused. "This place has a way with men like you." He fucks you unhurried until he cums in your ass, then pulls out and peels the glove off. After, he patches what needs it, tucks a bottle of the good painkillers into your waistband, and clears some of the heat from your chart.',
'The doctor jerks his chin at the table, curtain already moving. "Blues down. You want a clean chart, you bend over for it. Simple." You bend. He works a slick finger into your ass, then feeds his cock in slow and grips your hip. "Easy," he says when you tense, pushing deeper. You go slack and take it while your own cock drips untouched on the floor. He cums in you with a grunt and stays buried while his breathing settles. Afterward he patches what needs it, tucks good painkillers into your waistband and takes heat off your sheet.'
].random() + _gtNote>>
<</if>>
<<goto "Prison_Infirmary">>
<</button>></div>
<</if>>
<<if $gameSettings.contentFilter.nonConsent === true and $gameSettings.contentFilter.PlayerFeminization == true and not $prison.infirmaryFavorToday and CheckContentFilter("Male", $player)>>
<div class="btn"><<button "The doctor says you need a full examination">>
<<set $prison.infirmaryFavorToday = true>>
<<SpendTime 40>>
<<set _pgBefore = $player.gender()>>
<<if _pgBefore is "Female">><<SetVagPick "Male" "Female">><<else>><<SetAnalPick "Male" _pgBefore>><</if>>
<<set $infirmaryVideo = _pick>>
<<set $infirmaryContent = { adult: true, nonConsent: true, playerFeminization: true, partnerGender: "Male" }>>
<<PrisonCoerceBody>>
<<run $player.status.health.increase(10)>>
<<set $prison.heat = Math.max(0, ($prison.heat || 0) - 8)>>
<<if _pgBefore is "Female">>
<<set $infirmaryMsg = "He locks the exam-room door, draws the curtain, and tells you to get on the table. A CO outside owes him, so shouting will only bring another man in. He spreads your knees and fucks your cunt at his own pace, one gloved hand over your mouth when the table starts knocking the wall. After he cums in you, he cleans you with exam paper, patches the injury you came in with, and removes your name from the incident list.">>
<<else>>
<<set $infirmaryMsg = "He locks the exam-room door, draws the curtain, and tells you to bend over the table. A CO outside owes him, so shouting will only bring another man in. He slicks two gloved fingers into your ass, then fucks you until he cums in you while you grip the paper-covered table. Afterward he patches the injury you came in with and removes your name from the incident list.">>
<</if>>
<<goto "Prison_Infirmary">>
<</button>></div>
<</if>>
</div>
</fieldset>
<<PrisonNav>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<PrisonPendingMediaGuard "salonMsg" "salonVideo">>
<<SaveLocation>>
<<if $prison.block isnot "F">>
<<goto "Prison_Block">>
<<else>>
<<SetBackground "Media/Locations/Prison/salon_f.jpg">>
<div class="centre-text">The Salon</div>
<div class="centre-text" style="font-size:14px;">A corner of the day room the women made their own - a cracked mirror, a chair, contraband bobby pins and smuggled polish. The one place on the block where hands on you are gentle, and the talk runs deeper than the yard ever lets it.</div>
<<if $salonMsg and $salonMsg isnot "">>
<<PrisonMediaProse $salonMsg $salonVideo>>
<<if $salonVideo and $salonVideo isnot "">><<Video $salonVideo>><<set $salonVideo = "">><</if>>
<<set $salonMsg = "">>
<</if>>
<fieldset>
<legend>The Salon</legend>
<div class="btn-container">
<<if not $prison.salonToday>>
<div class="btn"><<button "Get done up">>
<<set $prison.salonToday = true>>
<<SpendTime 45>>
<<run $player.status.energy.increase(12)>>
<<SetCharProgression $player "corruption" 1 true>>
<<set $salonMsg = [
"You take the chair while one woman works your hair and another paints your nails with smuggled polish. Forty-five minutes later the braid is tight, the color is dry, and you walk back onto the tier standing straighter.",
"Somebody's smuggled polish, somebody else's steady hand, and a running commentary that never once turns cruel. You come out of the chair feeling like a person a man might have looked twice at once, and in here that is not nothing.",
"She braids your hair slow and careful, fingers warm against your scalp, and tells you to close your eyes and just have the minutes. You do. When you open them the day room is still a cage, but you are readier to do the time in it.",
"The chair, the cracked mirror, and forty-five minutes of low talk about hair, court dates, and useless men. When you stand, the braid is tight, the polish is dry, and you look less like intake dressed you."
].random()>>
<<goto "Prison_Salon">>
<</button>></div>
<<else>>
<div class="prison-actnote">The chair has already done what it can for you today. Come back after the next count.</div>
<</if>>
<div class="btn"><<button "Trade the salon talk">>
<<SpendTime 15>>
<<set $salonMsg = [
"The chair is where the whole block's business gets aired. Word today is the salon queen has decided who the new fish belongs to before the newcomer has even unpacked her bedroll.",
"Two of the women are one wrong word from tearing each other apart over a man neither of them will ever see again, and the whole salon is quietly picking a side.",
"There is a CO on the women's tier taking more than scrip to look the other way, and the women trade his name the way you would trade a warning about weather.",
"Somebody's people are bringing contraband in where the visit-day pat-down does not reach. Half the polish in this room came through on a body.",
"A woman three cells down cried through the whole count last night. Her people stopped answering the phone, and the salon has quietly decided to keep an eye on her.",
"The med line is the real store on this block, the women say. The nurse trades more than aspirin, if you know how to ask and have got the scrip to ask it.",
"Word is the shot-caller of the women's block did more time than the warden has worked here, and every woman in the chair drops her voice when she comes up.",
"Two women who came in enemies from the same block outside have started doing each other's hair. In here that is as close to a peace treaty as it gets.",
"The parole board came for the women's tier this week. The one who worked her detail and sat the meetings walked. The one with a jacket full of write-ups is still in the chair, bitter about it.",
"There is a batch of hooch working somewhere on the tier, sweet-rotten, and the salon can smell it same as the men's block can. Somebody is one shakedown from the hole.",
"A new inmate came off the bus rattled and terrified, and the whole salon has quietly agreed she is not to be left alone in the showers. The block looks after its own, sometimes.",
"The women say the men's block and the women's are one bad week from a lockdown that shuts the whole complex, and everybody with contraband is moving it now while they still can."
].random()>>
<<goto "Prison_Salon">>
<</button>></div>
<<if $gameSettings.contentFilter.femaleXfemale == true and CheckContentFilter("Female", $player) and not $prison.salonTrystToday>>
<div class="btn"><<button "Slip into the back with one of the women">>
<<set $prison.salonTrystToday = true>>
<<SpendTime 40>>
<<SetCharProgression $player "corruption" 1 true>>
<<SetOralPick "Female" "Female">>
<<set $salonVideo = _pick>>
<<set $salonMsg = [
"One of them catches your eye in the cracked mirror and tips her head at the blind corner behind the hanging sheets, and you go. She gets your blues open and her mouth on your cunt with the whole salon humming cover for you, and you have to bite your own wrist when you cum against her tongue. She grins up at you and says next time is her turn.",
"It starts as her fixing your collar and ends with her fingers deep in you behind the sheets, her thumb rubbing your clit while she kisses the sounds out of your mouth. You finger her cunt in return, the two of you rocking together quiet and greedy until you both cum. The block never sees a thing.",
"She pulls you behind the hanging sheets, gets two fingers into your cunt, and grinds her thigh between your legs while you finger her back. You both cum with your faces buried in each other's necks, then fix your blues before the women out front run out of cover talk."
].random()>>
<<goto "Prison_Salon">>
<</button>></div>
<<elseif $gameSettings.contentFilter.femaleXfemale == true and CheckContentFilter("Female", $player)>>
<div class="prison-actnote">You have slipped into the back once today. The salon keeps its rhythms, and the women stay careful about the blind corner.</div>
<</if>>
</div>
</fieldset>
/* The salon is the women's block's political floor, not only its mirror: who
sits in the chair, who is refused it, and what moves through it. */
<<set _salonWomen = prisonFilterCompatible(inmatesAtLocation($prisonRoster, "Prison_Block"), $player)>>
<fieldset>
<legend>The Chair Is Politics</legend>
<div class="btn-container">
<<if _salonWomen.length gt 0>>
<<set _salonPick = _salonWomen[getPrisonStintDay() % _salonWomen.length]>>
<<capture _salonPick>>
<<if not $prison.salonWorkToday>>
<<set _doHerLabel = "Do " + _salonPick.name + "'s hair yourself">>
<div class="btn"><<button _doHerLabel>>
<<set _salonLive = getInmate($prisonRoster, _salonPick.id)>>
<<if _salonLive and not $prison.salonWorkToday>>
<<set $prison.salonWorkToday = true>>
<<SpendTime 40>>
<<set _salonOut = resolvePrisonSalonAction("do_hair", _salonLive, ($prison.rep || 0))>>
<<set $prison.rep = Math.max(0, Math.min(100, ($prison.rep || 0) + _salonOut.rep))>>
<<set $salonMsg = _salonOut.line>>
<</if>>
<<goto "Prison_Salon">>
<</button>></div>
<<set _denyLabel = "Refuse " + _salonPick.name + " the chair">>
<div class="btn"><<button _denyLabel>>
<<set _salonLive = getInmate($prisonRoster, _salonPick.id)>>
<<if _salonLive and not $prison.salonWorkToday>>
<<set $prison.salonWorkToday = true>>
<<SpendTime 15>>
<<set _salonOut = resolvePrisonSalonAction("refuse_chair", _salonLive, ($prison.rep || 0))>>
<<set $prison.rep = Math.max(0, Math.min(100, ($prison.rep || 0) + _salonOut.rep))>>
<<set $salonMsg = _salonOut.line>>
<</if>>
<<goto "Prison_Salon">>
<</button>></div>
<<else>>
<div class="prison-actnote">You have spent your standing at the chair today. Tomorrow the queue re-forms and the politics start over.</div>
<</if>>
<</capture>>
<</if>>
<<if not $prison.salonRunToday>>
<div class="btn"><<button "Move something through the salon">>
<<if not $prison.salonRunToday>>
<<set $prison.salonRunToday = true>>
<<SpendTime 35>>
<<set _salonRun = resolvePrisonSalonSmuggle(($prison.rep || 0), ($prison.heat || 0), $player.attributes.dexterity.value)>>
<<set $prison.scrip = ($prison.scrip || 0) + _salonRun.scrip>>
<<set $prison.heat = Math.max(0, Math.min(100, ($prison.heat || 0) + _salonRun.heat))>>
<<set $salonMsg = _salonRun.line>>
<</if>>
<<goto "Prison_Salon">>
<</button>></div>
<<else>>
<div class="prison-actnote">Whatever was going to move through the polish bottles today has already moved.</div>
<</if>>
</div>
</fieldset>
<<PrisonNav>>
<<PrisonPeople>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<SetBackground "Media/Locations/Prison/law_library.png">>
<div class="centre-text">The Law Library</div>
<div class="centre-text" style="font-size:14px;">Two shelves of battered code books, a typewriter missing half its keys, and cons copying citations onto legal pads. Arguments stay low here because nobody wants a torn motion or a confiscated case file.</div>
<<if $lawMsg and $lawMsg isnot "">>
<<PrisonProse $lawMsg>>
<<set $lawMsg = "">>
<</if>>
<div class="centre-text" style="font-size:15px;">Programming on your file: <<= ($prison.programming || 0)>></div>
<fieldset>
<legend>The Law Library</legend>
<div class="btn-container">
<<if not $prison.lawLibToday>>
<div class="btn"><<button "Study the case law">>
<<set $prison.lawLibToday = true>>
<<SpendTime 60>>
<<set $prison.programming = ($prison.programming || 0) + 1>>
<<run awardPrisonSkillPoints($prison, "programming", "law-library")>>
<<run recordPrisonDirectorEvent($prison, "activity")>>
<<run $player.status.energy.increase(6)>>
<<SetCharProgression $player 'intelligence' 3 true>>
<<set $lawMsg = [
"You work through a statute a paragraph at a time, copy the two lines that touch your case, and find the form number in the back. The writ writer circles the filing date and makes you copy it again.",
"An old writ writer two tables down points you at the right book without looking up, and you read until the print swims. You come out understanding a little more of the machine that holds you - and the board reads every hour of it when your date comes.",
"You fill a legal pad in cramped careful hand, chasing a precedent through three cross-references to the one that fits. It steadies something in you that the yard never does. Programming logged, and a mind kept sharp behind the wall."
].random()>>
<<goto "Prison_LawLibrary">>
<</button>></div>
<<else>>
<div class="centre-text" style="font-size:13px;">You have put your hour in the books today. The code does not change overnight, and neither does the board.</div>
<</if>>
<<if not $prison.appealToday>>
<div class="btn"><<button "Work your own appeal">>
<<set $prison.appealToday = true>>
<<SpendTime 90>>
<<set _int = ($player.attributes.intelligence ? $player.attributes.intelligence.value : 3)>>
<<set _prog = ($prison.programming || 0)>>
<<set _chance = Math.min(85, 10 + _int * 5 + _prog * 3)>>
<<if random(1, 100) lte _chance>>
<<set _days = 1>>
<<if _prog gte 6>><<set _days = 2>><</if>>
<<set _appealGoodTime = applyGoodTime(_days)>>
<<run unlockPrisonAchievement('jailhouseLawyer')>>
<<if _appealGoodTime.applied is 1>>
<<set $lawMsg = "You spread your file across the table and build the motion clean - the right statute, the right precedent, the programming record to back it. The clerk stamps it accepted, and one day comes off your bid. Paper beats tears in here, every single time.">>
<<elseif _appealGoodTime.applied gt 1>>
<<set $lawMsg = "You have read enough now to build the motion like somebody who went to school for it - statute, precedent, a fat programming record the board cannot wave off. It lands hard, and " + _appealGoodTime.applied + " days come off your bid for it. Paper beats tears in here, every single time.">>
<<else>>
<<set $lawMsg = "You build the motion clean and get it signed, but today's good-time allowance is already full. The filing lands without taking another day off your bid.">>
<</if>>
<<else>>
<<set $lawMsg = "You draft it and file it, and it comes back stamped and dead - wrong statute, or the wrong judge, or just the wrong week. You gather the pages up and start reading for the hole in it. The board reads paper, so you will bring them better paper. Study more, then come back at it.">>
<</if>>
<<goto "Prison_LawLibrary">>
<</button>></div>
<<else>>
<div class="centre-text" style="font-size:13px;">You have filed your paper for the day. Motions move on the court's clock, not yours.</div>
<</if>>
<<if not $prison.draftedPaperToday>>
<div class="btn"><<button "Draft paper for another con">>
<<set $prison.draftedPaperToday = true>>
<<SpendTime 45>>
<<SpendEnergy $player 20>>
<<set _int = ($player.attributes.intelligence ? $player.attributes.intelligence.value : 3)>>
<<set _earn = random(3, 6) + Math.floor(_int / 2)>>
<<set $prison.scrip = ($prison.scrip || 0) + _earn>>
<<set $prison.rep = Math.min(100, ($prison.rep || 0) + 1)>>
<<set $lawMsg = "A con down the tier slides you a mess of paperwork and a fold of scrip, and you turn the case into a motion that at least says something the court has to read. They walk off lighter, you walk off " + _earn + " scrip heavier, and the tier files you as somebody worth knowing. A jailhouse lawyer never wants for customers.">>
<<goto "Prison_LawLibrary">>
<</button>></div>
<<else>>
<div class="centre-text" style="font-size:13px;">You have done your paperwork for the day. The tier's cases will keep until tomorrow.</div>
<</if>>
</div>
</fieldset>
<<PrisonNav>>
<<PrisonPeople>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<set _takeVisit = ($prison and $prison.inside) ? getActiveCrossBlockVisit($prison, { day: getCurrentAbsoluteDay(), hour: $dateTime.hours, minute: $dateTime.minutes }) : null>>
<<set _takeQuestRoute = ($prison and $prison.inside and not $prison.inPC and not _takeVisit and $prison.road is "con" and $questRouteId is "pq_yard_take" and $questRoutePath is "move" and prisonQuestState('pq_yard_take') is "active")>>
<<if not _takeQuestRoute>>
<<if $prison>><<set $prison.takeoverDecision = null>><</if>>
<<set $questRouteId = "">>
<<set $questRoutePath = "">>
<<if not $prison or not $prison.inside>><<goto "PoliceStation">><<elseif $prison.inPC>><<goto "Prison_Segregation">><<elseif _takeVisit>><<goto "Prison_OtherBlock">><<else>><<goto "Prison_Block">><</if>>
<<else>>
<<SetBackground "Media/Locations/Prison/yard.jpg">>
<<set $prison.takeoverDecision = null>>
<<set _boss = getCastInmate('shotcaller')>>
<<if not _boss or $prison.shotCaller>>
<<set $prison.takeoverDecision = null>>
<<set $questRouteId = "">>
<<set $questRoutePath = "">>
<<goto "Prison_Block">>
<<else>>
<<set _bhim = (_boss.gender isnot "Male") ? "her" : "him">>
<<set _scv = (_boss.gender isnot "Male") ? "F" : "M">>
<div class="centre-text">Make Your Move</div>
<<PrisonPortrait "shotcaller" _scv "prison-portrait--lg">>
<div class="chat-container prison-prose"><p class="text"><<= _boss.name>> ran this tier before you stepped off the bus. Every table still waits for <<= _bhim>> before making a move. The chair will not change hands because you asked. Pick your approach carefully; if you miss, you will wear it for the rest of the bid.</p></div>
<<set _str = $player.attributes.strength.value>>
<<set _dom = ($player.attributes.dominance ? $player.attributes.dominance.value : 5)>>
<<set _int = ($player.attributes.intelligence ? $player.attributes.intelligence.value : 3)>>
<<set _backup = ($prison.gang and hasGangBackup($prisonRoster, $prison.gang)) ? true : false>>
<<set _bstand = (_boss.stats ? _boss.stats.standing : 50)>>
<<set _bhis = (_boss.gender isnot "Male") ? "her" : "his">>
<<set _bsub = (_boss.gender isnot "Male") ? "she" : "he">>
<<set _bsubCap = (_boss.gender isnot "Male") ? "She" : "He">>
<<set _callLbl = "Call " + _bhim + " out in the open (strength and nerve)">>
<<set _shankLbl = "Catch " + _bhim + " slipping in the dark (your shank)">>
<<set _politicLbl = "Turn " + _bhis + " own car against " + _bhim + " (standing and a cool head)">>
<div class="btn-container">
<div class="btn"><<button _callLbl>>
<<set _ctx = { method: "fight", rep: ($prison.rep || 0), strength: _str, dominance: _dom, intelligence: _int, bossStanding: _bstand, hasShiv: $prison.hasShiv, gangBackup: _backup }>>
<<set _res = resolveTakeover(_ctx)>>
<<set $takeWon = _res.success>>
<<set $takeMethod = "fight">>
<<set $prison.takeoverDecision = { questId: $questRouteId, path: $questRoutePath, stintDay: getPrisonStintDay(), won: _res.success, method: "fight", bossId: _boss.id }>>
<<goto "Prison_TookBlock">>
<</button>></div>
<<if $prison.hasShiv>>
<div class="btn"><<button _shankLbl>>
<<set _ctx = { method: "shank", rep: ($prison.rep || 0), strength: _str, dominance: _dom, intelligence: _int, bossStanding: _bstand, hasShiv: true, gangBackup: _backup }>>
<<set _res = resolveTakeover(_ctx)>>
<<set $takeWon = _res.success>>
<<set $takeMethod = "shank">>
<<set $prison.takeoverDecision = { questId: $questRouteId, path: $questRoutePath, stintDay: getPrisonStintDay(), won: _res.success, method: "shank", bossId: _boss.id }>>
<<goto "Prison_TookBlock">>
<</button>></div>
<</if>>
<<if $prison.gang>>
<div class="btn"><<button _politicLbl>>
<<set _ctx = { method: "politic", rep: ($prison.rep || 0), strength: _str, dominance: _dom, intelligence: _int, bossStanding: _bstand, hasShiv: $prison.hasShiv, gangBackup: _backup }>>
<<set _res = resolveTakeover(_ctx)>>
<<set $takeWon = _res.success>>
<<set $takeMethod = "politic">>
<<set $prison.takeoverDecision = { questId: $questRouteId, path: $questRoutePath, stintDay: getPrisonStintDay(), won: _res.success, method: "politic", bossId: _boss.id }>>
<<goto "Prison_TookBlock">>
<</button>></div>
<</if>>
<div class="btn"><<button "Not yet - you are not ready">><<set $prison.takeoverDecision = null>><<set $questRouteId = "">><<set $questRoutePath = "">><<goto "Prison_Block">><</button>></div>
</div>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _boss = ($prison && $prison.inside) ? getCastInmate('shotcaller') : null>>
<<set _takeDecision = ($prison && $prison.inside) ? $prison.takeoverDecision : null>>
<<set _takeQuestRoute = (_boss and _takeDecision and _takeDecision.questId is $questRouteId and _takeDecision.path is $questRoutePath and _takeDecision.stintDay is getPrisonStintDay() and _takeDecision.won is $takeWon and _takeDecision.method is $takeMethod and _takeDecision.bossId is _boss.id and $prison.road is "con" and $questRouteId is "pq_yard_take" and $questRoutePath is "move" and prisonQuestState('pq_yard_take') is "active")>>
<<if not _takeQuestRoute>>
<<if $prison>><<set $prison.takeoverDecision = null>><</if>>
<<set $questRouteId = "">>
<<set $questRoutePath = "">>
<<set $takeWon = null>>
<<set $takeMethod = "">>
<<if not $prison or not $prison.inside>><<goto "PoliceStation">><<elseif $prison.inPC>><<goto "Prison_Segregation">><<else>><<goto "Prison_Block">><</if>>
<<else>>
<<SetBackground "Media/Locations/Prison/yard.jpg">>
/* Re-derive the boss pronouns - temp vars from Prison_TakeBlock do not survive the goto. */
<<set _bhim = (_boss and _boss.gender isnot "Male") ? "her" : "him">>
<<set _bhis = (_boss and _boss.gender isnot "Male") ? "her" : "his">>
<<set _bsub = (_boss and _boss.gender isnot "Male") ? "she" : "he">>
<<set _bsubCap = (_boss and _boss.gender isnot "Male") ? "She" : "He">>
<<if $takeWon>>
<<set _routePath = $questRoutePath ? $questRoutePath : "move">>
<<set _takeOutcome = finalizePrisonQuestRoute($questRouteId, _routePath, "takeover")>>
<<if not _takeOutcome or not _takeOutcome.completed>>
<<set $questRouteId = "">>
<<set $questRoutePath = "">>
<<set $takeWon = null>>
<<set $takeMethod = "">>
<<goto "Prison_Block">>
<<else>>
<<set $prison.shotCaller = true>>
<<set $prison.rep = Math.min(100, ($prison.rep || 0) + 15)>>
<<if _boss and _boss.stats>><<set _boss.stats.standing = Math.max(0, _boss.stats.standing - 45)>><</if>>
<<if _boss>><<set _boss.dominance = Math.max(0, _boss.dominance - 4)>><</if>>
<<SetCharProgression $player "dominance" 5 true>>
<<run unlockPrisonAchievement('ranBlock')>>
<<set $questRouteId = "">>
<<set $questRoutePath = "">>
<div class="centre-text">The Block Is Yours</div>
<<if $takeMethod is "shank">>
<<set _wintext = "You take " + _bhim + " in the blind spot by the stairs with the count still ringing, quick and low and final, and " + _bsub + " folds around your steel before understanding what is happening. The cons who ran with " + _bhim + " do the math in a heartbeat and decide they always liked you better.">>
<<elseif $takeMethod is "politic">>
<<set _wintext = "You never lay a hand on " + _bhim + ". You call three people from " + _bhis + " own car to the tables, name the debts the boss has not paid, and offer each of them a better place under you. When " + _bsub + " looks around for support, every familiar face is studying the floor. " + _bsubCap + " gives up the chair rather than fight alone.">>
<<else>>
<<set _wintext = "You call " + _bhim + " out in the middle of the yard and put " + _bhim + " down where every car can see. Your hands are empty. When you step over the old boss, nobody reaches down to help.">>
<</if>>
<div class="chat-container prison-prose"><p class="text"><<= _wintext>> Someone drags the good chair away from the table and sets it behind you. Nobody asks permission. The block answers to you now.</p></div>
<div class="btn padding-top"><<button "Take the chair" "Prison_RunBlock">><<set $takeWon = null>><<set $takeMethod = "">><</button>></div>
<</if>>
<<else>>
<<set $prison.takeoverDecision = null>>
<<set $prison.rep = Math.max(0, ($prison.rep || 0) - 15)>>
<<set $prison.heat = Math.min(100, ($prison.heat || 0) + 10)>>
<<run $player.status.health.decrease(30)>>
<<set _routePath = $questRoutePath ? $questRoutePath : "move">>
<<if $questRouteId and isPrisonQuestActive($questRouteId)>><<run failPrisonQuestPath($questRouteId, _routePath, "The move on the chair failed")>><</if>>
<<set $questRouteId = "">>
<<set $questRoutePath = "">>
<div class="centre-text">Put Down</div>
<<if $takeMethod is "shank">>
<<set _lostext = "The steel goes in but not deep enough, and " + _bsub + " is harder and faster than anyone has any right to be. It turns into a brawl the whole tier hears, and the COs wade in swinging. They find the blade, and it is yours. You bought yourself a beating and the hole both, and the chair is still " + _bhis + ".">>
<<set $prison.hasShiv = false>>
<<elseif $takeMethod is "politic">>
<<set _lostext = "You lean on the wrong people, or the right people with too much to lose, and word of the play gets back to " + _bhim + " before it ever ripens. " + _bsubCap + " lets you feel like it is working right up until it is not, and then you are the fool who reached for the chair and came away with an empty hand and a target on your back.">>
<<else>>
<<set _lostext = "You call " + _bhim + " out and " + _bsub + " answers. " + _bsubCap + " catches your first rush, puts you down in front of the yard, and plants a shoe on your wrist until the whistle. When you reach the gate, the men who opened it for you on the way out leave it shut.">>
<</if>>
<div class="chat-container prison-prose"><p class="text"><<= _lostext>></p></div>
<<if $takeMethod is "shank">>
<div class="btn padding-top"><<button "They drag you off the tier">><<set $takeWon = null>><<set $takeMethod = "">><<set $prison.sceneAuthority = { scene: "solitary", stintDay: getPrisonStintDay() }>><<goto "Prison_Solitary">><</button>></div>
<<else>>
<div class="btn padding-top"><<button "Pick yourself up off the concrete" "Prison_Block">><<set $takeWon = null>><<set $takeMethod = "">><</button>></div>
<</if>>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<PrisonPendingMediaGuard "runBlockMsg" "runBlockVideo" "runBlockContent">>
<<SaveLocation>>
<<if $prison.block is "F">>
<<SetBackground "Media/Locations/Prison/block_f_dayroom.jpg">>
<<else>>
<<SetBackground "Media/Locations/Prison/block_m_dayroom.jpg">>
<</if>>
<<if not $prison.shotCaller>>
<<goto "Prison_Block">>
<<else>>
<div class="centre-text">You Run the Tier</div>
<div class="centre-text" style="font-size:14px;">The chair by the good window is yours. Cons bring you their problems and their tribute without being asked, and nobody with sense moves on you in the dark now that you run the block.</div>
<<set _runBlockPending = (($runBlockMsg and $runBlockMsg isnot "") or ($runBlockVideo and $runBlockVideo isnot ""))>>
<<set _runBlockPendingAllowed = (not _runBlockPending or ($runBlockContent and (not $runBlockContent.adult or (CheckContentFilter($runBlockContent.partnerGender, $player) and (not $runBlockContent.nonConsent or $gameSettings.contentFilter.nonConsent === true)))))>>
<<if not _runBlockPendingAllowed>><<set $runBlockMsg = "">><<set $runBlockVideo = "">><<set $runBlockContent = null>><</if>>
<<if $runBlockMsg and $runBlockMsg isnot "">>
<<PrisonMediaProse $runBlockMsg $runBlockVideo>>
<<if $runBlockVideo and $runBlockVideo isnot "">><<Video $runBlockVideo>><<set $runBlockVideo = "">><</if>>
<<set $runBlockMsg = "">>
<<set $runBlockContent = null>>
<</if>>
<fieldset>
<legend>The Chair</legend>
<div class="btn-container">
<<if not $prison.tributeToday>>
<div class="btn"><<button "Collect the tier's tribute">>
<<set $prison.tributeToday = true>>
<<set $runBlockContent = { adult: false }>>
<<set _earn = random(10, 20)>>
<<set $prison.scrip = ($prison.scrip || 0) + _earn>>
<<set $runBlockMsg = "The tier pays up the way it always has, only now it pays you: packs of smokes, folds of scrip, a debt marked square. Nobody argues the number, because you are the one who sets it. Plus " + _earn + " scrip, and the standing to take it.">>
<<goto "Prison_RunBlock">>
<</button>></div>
<<else>>
<div class="centre-text" style="font-size:13px;">The tier has paid its tribute today. It will pay again tomorrow. It always does.</div>
<</if>>
<div class="btn"><<button "Hold court on the tier">>
<<set $runBlockContent = { adult: false }>>
<<SpendTime 30>>
<<set $prison.heat = Math.max(0, ($prison.heat || 0) - 4)>>
<<set $runBlockMsg = ["You sit in the good chair while the block brings you three beefs: an unpaid debt, an insult at chow, and a fish refusing to pay rent. You settle all three before a CO has reason to step onto the tier.", "You spend half an hour calling people to the table, checking stories, and setting amounts. The wolves leave with orders instead of reaching for shanks, which keeps the officers outside the gate."].random()>>
<<goto "Prison_RunBlock">>
<</button>></div>
</div>
</fieldset>
<<set _string = prisonFilterCompatible(claimedByPlayer($prisonRoster), $player)>>
<fieldset>
<legend>The Boss's String</legend>
<<if _string.length > 0>>
<div class="centre-text" style="font-size:13px;">Yours on the block: <<= _string.length>> <<if _string.length is 1>>head<<else>>heads<</if>>.</div>
<</if>>
<div class="btn-container">
<<if $gameSettings.contentFilter.nonConsent === true and _string.length > 0 and not $prison.usedStringToday and not prisonPlayerActiveSexBlocked($player, $playerlock)>>
<div class="btn"><<button "Send for one of your string to fuck">>
<<if prisonPlayerActiveSexBlocked($player, $playerlock)>>
<<set $runBlockContent = { adult: false }>>
<<set $runBlockMsg = "You leave your string alone because your cock is locked, then keep the chair.">>
<<goto "Prison_RunBlock">>
<<else>>
<<set _string2 = prisonFilterCompatible(claimedByPlayer($prisonRoster), $player)>>
<<set _t = _string2.random()>>
<<if _t>>
<<SpendTime 20>>
<<set $runBlockContent = { adult: true, nonConsent: true, partnerGender: _t.gender }>>
<<set $prison.usedStringToday = true>>
<<run useClaimedPunk(_t)>>
<<SetCharProgression $player "dominance" 2 true>>
<<set _domG = $player.gender()>>
<<set _subG = _t.gender>>
<<SetAnalPick _domG _subG>>
<<set $runBlockVideo = _pick>>
<<set _runTool = ($player.gender() is "Female") ? "prison-made strap" : "cock">>
<<set _runCumHer = ($player.gender() is "Female") ? "You rub yourself raw against the harness and cum with the strap still in her ass." : "You cum in her ass without taking your eyes off the watching tier.">>
<<set _runCumHim = ($player.gender() is "Female") ? "You rub yourself raw against the harness and cum with the strap still in his ass." : "You cum in his ass without taking your eyes off the watching tier.">>
<<if _t.stats>><<set _t.stats.shame = Math.min(100, (_t.stats.shame || 0) + 3)>><</if>>
<<if _t.gender is "Female">>
<<set $runBlockMsg = _t.name + " is brought to your chair the moment you send the word, because you do not fetch your own. She bends over the bunk by the good window. You push your " + _runTool + " into her ass and fuck her in the open until she cums. " + _runCumHer + " The tier keeps its eyes on the floor; being yours is the safest thing she has.">>
<<elseif _t.gender is "Shemale">>
<<set $runBlockMsg = _t.name + " is walked to your chair the moment you crook a finger. She bends over the bunk where the whole tier can see. You push your " + _runTool + " into her ass, stroke her cock, and fuck her until she cums. " + _runCumHer + " You hand her back to the tier marked as yours.">>
<<else>>
<<set $runBlockMsg = _t.name + " is walked to your chair the moment you crook a finger, because you do not go looking. He bends over the bunk by the good window. You push your " + _runTool + " into his ass, stroke his cock, and fuck him until he cums. " + _runCumHim + " Not one man lifts his eyes when you send him back marked as yours.">>
<</if>>
<</if>>
<<goto "Prison_RunBlock">>
<</if>>
<</button>></div>
<<elseif $gameSettings.contentFilter.nonConsent === true and _string.length > 0>>
<div class="centre-text" style="font-size:13px;">You have called on your string once today. You use the string and let the tier see it - once. More than that makes you look unable to sit still on the chair.</div>
<</if>>
<<set _freshPool = prisonFilterCompatible(unclaimedInmates(inmatesAtLocation($prisonRoster, "Prison_Block", $dateTime.hours, getPrisonStintDay())), $player)>>
<<if _freshPool.length is 0>><<set _freshPool = prisonFilterCompatible(unclaimedInmates($prisonRoster), $player)>><</if>>
<<if $gameSettings.contentFilter.nonConsent === true and _freshPool.length > 0 and not $prison.stableToday and not prisonPlayerActiveSexBlocked($player, $playerlock)>>
<div class="btn"><<button "Claim and fuck the fresh fish the tier brings you">>
<<if prisonPlayerActiveSexBlocked($player, $playerlock)>>
<<set $runBlockContent = { adult: false }>>
<<set $runBlockMsg = "You cannot fuck the tribute with your cock caged. You refuse it and keep the chair.">>
<<goto "Prison_RunBlock">>
<<else>>
<<set $prison.stableToday = true>>
<<set _pool = prisonFilterCompatible(unclaimedInmates(inmatesAtLocation($prisonRoster, "Prison_Block", $dateTime.hours, getPrisonStintDay())), $player)>>
<<if _pool.length is 0>><<set _pool = prisonFilterCompatible(unclaimedInmates($prisonRoster), $player)>><</if>>
<<set _t = _pool.random()>>
<<if not _t>>
<<set $runBlockVideo = "">>
<<set $runBlockContent = { adult: false }>>
<<set $runBlockMsg = "You put out the word for a fresh one, but the tier has nobody loose to bring you today. Everyone worth claiming is already spoken for. You will have your pick tomorrow.">>
<<else>>
<<SpendTime 30>>
<<set $runBlockContent = { adult: true, nonConsent: true, partnerGender: _t.gender }>>
<<run resolveMakeMove(_t, 99)>>
<<run unlockPrisonAchievement('stable')>>
<<set $prison.rep = Math.min(100, ($prison.rep || 0) + 3)>>
<<set _domG = $player.gender()>>
<<set _subG = _t.gender>>
<<SetAnalPick _domG _subG>>
<<set $runBlockVideo = _pick>>
<<set _freshTool = ($player.gender() is "Female") ? "prison-made strap" : "cock">>
<<set _freshCumHer = ($player.gender() is "Female") ? "The strap stays buried in her ass while you grind your cunt against the harness and cum." : "You hold her down and cum in her ass before the block.">>
<<set _freshCumHim = ($player.gender() is "Female") ? "The strap stays buried in his ass while you grind your cunt against the harness and cum." : "You hold him down and cum in his ass before the block.">>
<<if _t.gender is "Female">>
<<set $runBlockMsg = "The tier brings " + _t.name + " to your chair as tribute. She is shaking when you bend her over the bunk and push your " + _freshTool + " into her ass. You fuck her until she cums in front of the block. " + _freshCumHer + " Then you add her name to your string and send her away.">>
<<elseif _t.gender is "Shemale">>
<<set $runBlockMsg = "The tier hands you " + _t.name + " like a gift they know better than to withhold. You push your " + _freshTool + " into her ass and fuck her slowly over the bunk while stroking her cock until she cums. " + _freshCumHer + " When someone at the rail asks, she says she belongs to you. She waits beside the bunk for permission to leave.">>
<<else>>
<<set $runBlockMsg = "The tier walks " + _t.name + " to your chair as tribute. You bend him over the bunk, push your " + _freshTool + " into his ass, and fuck him where every man can see until he cums. " + _freshCumHim + " Then you claim him as another head on your string. Nobody questions you.">>
<</if>>
<</if>>
<<goto "Prison_RunBlock">>
<</if>>
<</button>></div>
<<elseif $gameSettings.contentFilter.nonConsent === true and _freshPool.length > 0>>
<div class="centre-text" style="font-size:13px;">You have taken your tribute of the flesh today. The tier will have another for you tomorrow. It always does.</div>
<</if>>
<<if prisonPlayerActiveSexBlocked($player, $playerlock) and ((_string.length > 0 and not $prison.usedStringToday) or (_freshPool.length > 0 and not $prison.stableToday))>>
<div class="prison-actnote">The cage blocks every active sexual use of the boss's string. You can hold court, collect tribute, or leave without sex.</div>
<</if>>
</div>
</fieldset>
<<PrisonNav>>
<<PrisonPeople>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if not $prison or not $prison.inside>>
<<goto "PoliceStation">>
<<elseif not playerAwaitsWomensBlockTransfer()>>
<<goto "Prison_Block">>
<<else>>
<<SetBackground "Media/Locations/Prison/segregation.jpg">>
<div class="centre-text">Reclassified</div>
<<set _transferLead = prisonPlayerWomensTransferLine()>>
<<set _transferArrival = prisonPlayerWomensArrivalLine()>>
<<PrisonProse _transferLead>>
<<PrisonProse _transferArrival>>
<div class="btn padding-top"><<button "Carry your box across">>
<<if playerAwaitsWomensBlockTransfer()>>
<<run transferPlayerToWomensBlock()>>
<<SpendTime 180>>
<</if>>
<<set $prisonIncidentMsg = "Cellblock F takes you off the corridor without ceremony. A CO hands you bedding, points at a bunk, and the women in the dayroom look up long enough to decide you are nobody yet.">>
<<goto "Prison_Block">>
<</button>></div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<PrisonRestoreBackground>>
<<set _inm = Array.isArray($prisonRoster) ? getInmate($prisonRoster, $activeInmateId) : null>>
<<set _selectLocation = ($player and $player.info) ? $player.info.currentLocation : "">>
<<set _selectAuthority = ($prison and $prison.sceneAuthority and $prison.sceneAuthority.scene is "prisonSexSelect" and $prison.sceneAuthority.stintDay is getPrisonStintDay() and $prison.sceneAuthority.targetId is $activeInmateId and $prison.sceneAuthority.block is _selectLocation)>>
<<set _selectPresent = ($prison and _inm and prisonInmatePresentAt(_inm, _selectLocation, $dateTime.hours, getPrisonStintDay(), $prison.cellmateId))>>
<<set _contentAllowed = (_inm and isAdultPrisonInmate(_inm) and CheckContentFilter(prisonSexGender(_inm), $player))>>
<<if not $prison or $prison.inside isnot true or not _selectAuthority or not _selectPresent or not _contentAllowed>>
<<if $prison>><<set $prison.sceneAuthority = null>><</if>>
<<if not _inm or not _selectPresent>><<set $activeInmateId = null>><</if>>
<<if _selectLocation and _selectLocation.indexOf("Prison_") is 0>><<goto _selectLocation>><<else>><<goto "Prison_Block">><</if>>
<<else>>
<<set _blurb = prisonInmateBlurb(_inm)>>
<<set _face = npcFacePath(_blurb.stage, _inm.id, _inm.gender)>>
<<set _trust = Math.max(0, Math.min(100, Math.floor((_inm.stats ? _inm.stats.trust : 0) || 0)))>>
<<set _socialDom = $player.attributes.dominance ? $player.attributes.dominance.value : $player.attributes.dexterity.value>>
<<set _socialCtx = { playerRep: ($prison.rep || 0), playerScrip: ($prison.scrip || 0), playerGender: $player.gender(), playerDominance: _socialDom, playerActiveSexBlocked: prisonPlayerActiveSexBlocked($player, $playerlock) }>>
<<set _activeSexChance = prisonActiveSexChance(_inm, _socialCtx)>>
<section class="prison-sex-picker">
<header class="prison-sex-picker__hero">
<div class="prison-sex-picker__portrait"><img @src="_face" @alt="_inm.name"></div>
<div class="prison-sex-picker__intro">
<span class="prison-sex-picker__eyebrow">A few unguarded minutes with <<= _inm.name>></span>
<h2>How do you approach them?</h2>
<p>Choose what you want and who makes the first move. Once the clothes come off, you can change position or pace, but the noise and the next guard sweep still matter.</p>
</div>
<dl class="prison-sex-picker__stats">
<div><dt>Trust</dt><dd><<= _trust>>/100</dd></div>
<div><dt>Tier rep</dt><dd><<= Math.max(0, Math.min(100, ($prison.rep || 0)))>>/100</dd></div>
<div><dt>Dominance</dt><dd><<= _socialDom>></dd></div>
<div><dt>Chance they yield</dt><dd><<if _activeSexChance gt 0>><<= _activeSexChance>>%<<else>>Not yet<</if>></dd></div>
</dl>
</header>
<div class="prison-sex-picker__legend" aria-label="Role guide">
<span data-role="passive">Let them lead · willing once trust is there</span>
<span data-role="active">Take the lead · they may still say no</span>
</div>
<<set _roles = [
{ key: "passive", eyebrow: "Their pace", title: "Let them lead", description: "If they trust you enough to start, they will take it from here." },
{ key: "active", eyebrow: "Your pace", title: "Take the lead", description: "They read your trust, reputation and nerve before deciding." }
]>>
<div class="prison-sex-role-grid">
<<for _role range _roles>>
<<capture _role>>
<section class="prison-sex-role" @data-role="_role.key">
<header class="prison-sex-role__header">
<span class="prison-sex-role__eyebrow"><<= _role.eyebrow>></span>
<h3><<= _role.title>></h3>
<p><<= _role.description>></p>
</header>
<<set _roleKinds = []>>
<<set _openingPoses = ["Anal", "Oral", "Vag"]>>
<div class="prison-sex-role__choices">
<<for _openingPose range _openingPoses>>
<<for _socialIndex, _social range PRISON_COMPANION_ACTIONS>>
<<capture _social _socialIndex _role _openingPose>>
<<if _social.adult and _social.sexualRole is _role.key>>
<<set _socialAvailability = prisonCompanionActionAvailability(_social.key, _inm, _socialCtx)>>
<<set _socialMediaAllowed = false>>
<<set _startMedia = null>>
<<if isPrisonPhasedSexAction(_social.key)>>
<<set _startMedia = prisonSexStartMediaRequest(_social.key, _inm, $player, _openingPose)>>
<<set _socialMediaAllowed = (_startMedia and HasSexPickByTable(_startMedia.category, _startMedia.domGender, _startMedia.subGender))>>
<</if>>
<<if _socialMediaAllowed>>
<<set _openingKind = (_openingPose is "Anal") ? "anal" : ((_openingPose is "Oral") ? "oral" : "vaginal")>>
<<if not _roleKinds.includes(_openingKind)>>
<<run _roleKinds.push(_openingKind)>>
<<set _openingLabel = (_openingKind is "anal") ? "Anal" : ((_openingKind is "oral") ? "Oral" : "Vaginal")>>
<<set _openingDescription = (_openingKind is "anal") ? "Start with anal; settle on a position once you are alone." : ((_openingKind is "oral") ? "Start with oral; settle on a position once you are alone." : "Start with vaginal sex; your bodies make this approach possible.")>>
<<set _socialEnabled = _socialAvailability.available>>
<<set _socialMeta = (_role.key is "passive") ? "Willing" : ((_activeSexChance gt 0) ? (_activeSexChance + "% chance") : "Not yet")>>
<<set _choiceMarkup = '<span class="prison-sex-choice__body"><span class="prison-sex-choice__top"><span class="prison-sex-choice__title">' + _openingLabel + '</span><span class="prison-sex-choice__badge">' + _socialMeta + '</span></span><span class="prison-sex-choice__description">' + _openingDescription + '</span><span class="prison-sex-choice__meta">Make the move</span></span>'>>
<<if _socialEnabled>>
<div class="btn prison-sex-choice" @data-role="_role.key" @data-kind="_openingKind" data-state="available"><<button _choiceMarkup>>
<<set _e = getInmate($prisonRoster, $activeInmateId)>>
<<set _liveLocation = ($player and $player.info) ? $player.info.currentLocation : "">>
<<set _liveInside = ($prison and $prison.inside is true)>>
<<set _liveAuthority = ($prison and $prison.sceneAuthority and $prison.sceneAuthority.scene is "prisonSexSelect" and $prison.sceneAuthority.stintDay is getPrisonStintDay() and $prison.sceneAuthority.targetId is (_e ? _e.id : null) and $prison.sceneAuthority.block is _liveLocation)>>
<<set _livePresent = (_e and prisonInmatePresentAt(_e, _liveLocation, $dateTime.hours, getPrisonStintDay(), $prison.cellmateId))>>
<<set _liveDom = $player.attributes.dominance ? $player.attributes.dominance.value : $player.attributes.dexterity.value>>
<<set _ctx = { playerRep: ($prison.rep || 0), playerScrip: ($prison.scrip || 0), playerGender: $player.gender(), playerDominance: _liveDom, playerActiveSexBlocked: prisonPlayerActiveSexBlocked($player, $playerlock) }>>
<<set _liveAvailability = prisonCompanionActionAvailability(_social.key, _e, _ctx)>>
<<set _socialLiveGender = _e ? prisonSexGender(_e) : "Male">>
<<set _socialLiveAdult = (_e and isAdultPrisonInmate(_e) and CheckContentFilter(_socialLiveGender, $player))>>
<<set _socialLiveMedia = false>>
<<if _e and isPrisonPhasedSexAction(_social.key)>>
<<set _liveStartMedia = prisonSexStartMediaRequest(_social.key, _e, $player, _openingPose)>>
<<set _socialLiveMedia = (_liveStartMedia and _liveStartMedia.category is _openingPose and HasSexPickByTable(_liveStartMedia.category, _liveStartMedia.domGender, _liveStartMedia.subGender))>>
<</if>>
<<set _socialLive = (_liveInside and _liveAuthority and _livePresent and _liveAvailability.available and _socialLiveAdult and _socialLiveMedia)>>
<<if _socialLive>>
<<if isPrisonPhasedSexAction(_social.key)>>
<<set _phaseCtx = {
inside: ($prison.inside === true), stintDay: getPrisonStintDay(), location: _liveLocation,
stintSerial: ($prison.priors || 0),
heat: ($prison.heat || 0), playerRep: ($prison.rep || 0), playerScrip: ($prison.scrip || 0),
playerGender: $player.gender(), playerDominance: _liveDom,
playerActiveSexBlocked: prisonPlayerActiveSexBlocked($player, $playerlock),
openingPose: _openingPose
}>>
<<set _start = beginPrisonSexSession(_social.key, _e, $player, _phaseCtx)>>
<<if _start.valid>>
<<set $prison.rep = Math.max(0, Math.min(100, ($prison.rep || 0) + _start.repDelta))>>
<<if _start.energyCost gt 0>><<SpendEnergy $player _start.energyCost>><</if>>
<<if _start.minutes gt 0>><<SpendTime _start.minutes>><</if>>
<<if _start.success>>
<<SetCharProgression $player "corruption" 1 true>>
<<set $prisonSexSession = _start.session>>
<<set $prisonSexPartner = _start.partner>>
<<set $prisonSexLine = _start.line>>
<<set $prison.sceneAuthority = { scene: "prisonSex", stintDay: getPrisonStintDay(), targetId: _e.id, block: _liveLocation }>>
<<goto "Prison_Sex">>
<<else>>
<<set $inmateLine = _start.line>>
<<set $prison.sceneAuthority = { scene: "inmate", stintDay: getPrisonStintDay(), targetId: _e.id, block: _liveLocation }>>
<<goto "Prison_Inmate">>
<</if>>
<<else>>
<<set $inmateLine = _start.line>>
<<set $prison.sceneAuthority = { scene: "inmate", stintDay: getPrisonStintDay(), targetId: _e.id, block: _liveLocation }>>
<<goto "Prison_Inmate">>
<</if>>
<<else>>
<<goto "Prison_SexSelect">>
<</if>>
<<else>>
<<goto "Prison_SexSelect">>
<</if>>
<</button>></div>
<<else>>
<<set _socialLockReasons = _socialAvailability.reasons.slice()>>
<<if _socialLockReasons.length is 0>><<run _socialLockReasons.push("This interaction is not available right now.")>><</if>>
<<set _socialTooltip = _openingDescription + " Unavailable: " + _socialLockReasons.join(" ")>>
<<set _socialTooltipId = "prison-sex-choice-" + _inm.id + "-" + _role.key + "-" + _openingKind>>
<<set _socialAria = _openingLabel + ". " + _socialLockReasons.join(" ")>>
<div @id="_socialTooltipId" class="btn prison-sex-choice prison-sex-option--locked" @data-role="_role.key" @data-kind="_openingKind" data-state="locked" tabindex="0" @aria-label="_socialAria"><button type="button" disabled><span class="prison-sex-choice__body"><span class="prison-sex-choice__top"><span class="prison-sex-choice__title"><<= _openingLabel>></span><span class="prison-sex-choice__badge">Locked</span></span><span class="prison-sex-choice__description"><<= _openingDescription>></span><span class="prison-sex-choice__meta">Hover for requirements</span></span></button></div>
<<run addHoverTooltip(_socialTooltipId, _socialTooltip)>>
<</if>>
<</if>>
<</if>>
<</if>>
<</capture>>
<</for>>
<</for>>
</div>
</section>
<</capture>>
<</for>>
</div>
</section>
<<set _backLabel = "Back to " + _inm.name>>
<div class="btn prison-sex-select__back"><<button _backLabel>>
<<set $prison.sceneAuthority = { scene: "inmate", stintDay: getPrisonStintDay(), targetId: _inm.id, block: _selectLocation }>>
<<goto "Prison_Inmate">>
<</button>></div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<PrisonRestoreBackground>>
<<set _session = $prisonSexSession>>
<<set _inm = (_session and Array.isArray($prisonRoster)) ? getInmate($prisonRoster, _session.inmateId) : null>>
<<set _sexCtx = {
inside: ($prison and $prison.inside === true),
stintDay: getPrisonStintDay(),
stintSerial: ($prison ? ($prison.priors || 0) : 0),
location: ($player and $player.info ? $player.info.currentLocation : ""),
heat: ($prison ? ($prison.heat || 0) : 0),
playerRep: ($prison ? ($prison.rep || 0) : 0),
playerScrip: ($prison ? ($prison.scrip || 0) : 0),
playerGender: ($player ? $player.gender() : "Male"),
playerDominance: ($player and $player.attributes.dominance ? $player.attributes.dominance.value : 0),
playerActiveSexBlocked: prisonPlayerActiveSexBlocked($player, $playerlock)
}>>
<<set _authority = ($prison and $prison.sceneAuthority and $prison.sceneAuthority.scene is "prisonSex" and $prison.sceneAuthority.stintDay is _sexCtx.stintDay and $prison.sceneAuthority.targetId is (_session ? _session.inmateId : null) and $prison.sceneAuthority.block is _sexCtx.location)>>
<<set _contentAllowed = (_inm and isAdultPrisonInmate(_inm) and CheckContentFilter(prisonSexGender(_inm), $player))>>
<<set _validation = validatePrisonSexSession(_session, _inm, $prisonSexPartner, $player, _sexCtx)>>
<<if not _authority or not _contentAllowed or not _validation.valid or _session.status isnot "active">>
<<HideLeftPanel false>>
<<run UIBar.unstow()>>
<<if _session and _inm and $prisonSexPartner and $player>><<run leavePrisonSexSession(_session, _inm, $prisonSexPartner, $player)>><</if>>
<<unset $prisonSexSession $prisonSexPartner $prisonSexAction $prisonSexLastApply>>
<<set $prisonSexLine = "">>
<<if $prison>><<set $prison.sceneAuthority = null>><</if>>
<<if _sexCtx.location and _sexCtx.location.indexOf("Prison_") is 0>><<goto _sexCtx.location>><<else>><<goto "Prison_Block">><</if>>
<<else>>
<<HideLeftPanel true>>
<<run UIBar.stow()>>
<<set _state = _session.state>>
<<set _dom = _state.playerDom ? $player : $prisonSexPartner>>
<<set _sub = _state.playerDom ? $prisonSexPartner : $player>>
<<set _inmatePortrait = npcFacePath(prisonInmateBlurb(_inm).stage, _inm.id, _inm.gender)>>
<<set _media = prisonSexMediaRequest(_session, $prisonSexPartner, $player)>>
<<set _pick = SetSexPickByTable(_media.category, _media.domGender, _media.subGender)>>
<<set _transitions = { paceChanged: ($prisonSexLastPace != undefined and $prisonSexLastPace isnot _state.pace) }>>
<<set _risk = prisonSexRisk(_session, _sexCtx.heat, _sexCtx.location)>>
<<set _actions = getAvailablePrisonSexActions(_inm, $prisonSexPartner, $player, _session, _sexCtx)>>
<section class="prison-sex-scene" aria-label="Prison intimacy scene">
<header class="prison-sex-scene__top">
<<= getInteractiveSceneHeaderHtml(_state, $prisonSexPartner, _transitions)>>
<<unset $prisonSexLastPace>>
<section class="prison-sex-board" @data-risk="prisonSexRiskLabel(_risk)" aria-label="Scene risk">
<div class="prison-sex-board__identity">
<span class="prison-sex-board__eyebrow">Stolen time with <<= _inm.name>></span>
<strong class="prison-sex-board__role"><<= _state.playerDom ? "You have the lead" : (_inm.name + " has the lead")>></strong>
</div>
<dl class="prison-sex-board__metrics">
<div><dt>Noise</dt><dd><<= prisonSexNoiseLabel(_session.noise)>> · <<= _session.noise>>/100</dd></div>
<div><dt>Next sweep</dt><dd><<= _risk>>% · <<= prisonSexRiskLabel(_risk)>></dd></div>
<div><dt>Your arousal</dt><dd><<= _session.playerArousal || 0>>/100</dd></div>
<div><dt><<= _inm.name>>'s arousal</dt><dd><<= _session.npcArousal || 0>>/100</dd></div>
<div><dt>Turns</dt><dd><<= _session.turns>></dd></div>
<div><dt>Familiarity</dt><dd><<= (_inm.sexProfile ? _inm.sexProfile.completed : 0)>> completed</dd></div>
</dl>
</section>
</header>
<div class="prison-sex-scene__workspace">
<div class="prison-sex-scene__media" aria-label="Scene video">
<<if _pick and _pick isnot "">><<Video _pick>><<PrisonMediaProse "" _pick _state.playerDom>><</if>>
</div>
<aside class="prison-sex-scene__controls" aria-label="Sex actions">
<fieldset class="prison-sex-actions">
<legend>Shape the moment</legend>
<div class="prison-sex-scene-action-grid">
<<for _actionIndex, _action range _actions>>
<<capture _action _actionIndex>>
<<set _mediaAllowed = true>>
<<if _action.media>>
<<set _mediaAllowed = HasSexPickByTable(_action.media.category, _action.media.domGender, _action.media.subGender)>>
<</if>>
<<if _mediaAllowed>>
<<set _actionKind = (_action.prisonAction is "listen") ? "safety" : ((_action.id is "changePosition") ? "position" : ((_action.id is "changePace") ? "pace" : ((_action.id is "finish") ? "finish" : ((_action.id is "advance") ? "continue" : "touch"))))>>
<<set _actionMeta = (_action.prisonAction is "listen") ? "Lower guard risk" : ((_action.id is "changePosition") ? "Change position" : ((_action.id is "changePace") ? "Change pace" : ((_action.id is "finish") ? "Climax" : ((_action.id is "advance") ? "Continue the phase" : "Scene action"))))>>
<<if _action.reluctant and _action.reason>><<set _actionMeta = _action.reason>><</if>>
<<set _actionMarkup = '<span class="prison-sex-scene-action__body"><span class="prison-sex-scene-action__title">' + _action.label + '</span><span class="prison-sex-scene-action__meta">' + _actionMeta + '</span></span><span class="prison-sex-scene-action__badge">' + _actionKind + '</span>'>>
<<set _btnTitle = (_action.reason ? _action.reason : _action.label)>>
<<if _action.blocked>>
<<set _actionTooltipId = "prison-sex-scene-action-" + _session.inmateId + "-" + _actionIndex>>
<<set _actionAria = _action.label + ". " + (_action.reason || "This move is unavailable.")>>
<div @id="_actionTooltipId" class="btn prison-sex-scene-action prison-sex-option--locked" @data-kind="_actionKind" data-state="locked" tabindex="0" @aria-label="_actionAria"><button type="button" disabled><span class="prison-sex-scene-action__body"><span class="prison-sex-scene-action__title"><<= _action.label>></span><span class="prison-sex-scene-action__meta"><<= _action.reason || "This move is unavailable.">></span></span><span class="prison-sex-scene-action__badge">Locked</span></button></div>
<<run addHoverTooltip(_actionTooltipId, _action.reason)>>
<<else>>
<div class="btn prison-sex-scene-action" @data-kind="_actionKind" @data-state="_action.reluctant ? 'warning' : 'available'" @title="_btnTitle">
<<button _actionMarkup>>
<<set $prisonSexAction = clone(_action)>>
<<goto "Prison_SexApply">>
<</button>>
</div>
<</if>>
<</if>>
<</capture>>
<</for>>
</div>
</fieldset>
<div class="btn prison-sex-scene__stop" data-prison-action="return"><<button "Stop before count">><<goto "Prison_SexLeave">><</button>></div>
</aside>
</div>
<section class="prison-sex-scene__dialogue" aria-label="Scene dialogue" aria-live="polite">
<<if $prisonSexLine and $prisonSexLine isnot "">>
<<PrisonProse $prisonSexLine>>
<<set $prisonSexLine = "">>
<</if>>
<<if $prisonSexLastApply>>
<<set _last = $prisonSexLastApply>>
<<if _last.phaseChanged>>
<div class="scene-transition scene-transition--phase">
Stage: <strong><<= _last.newStage>></strong>
<<if _last.advanceLine>><br><span><<= _last.advanceLine>></span><</if>>
</div>
<</if>>
<<if _last.poseChanged and _last.poseLine>><div class="scene-transition scene-transition--pose"><<= _last.poseLine>></div><</if>>
<<if _last.paceChanged and _last.paceLine>><div class="scene-transition scene-transition--pace"><<= _last.paceLine>></div><</if>>
<<if Array.isArray(_last.discoveries)>>
<<for _kink range _last.discoveries>><div class="scene-transition scene-transition--discovery"><<= getDiscoveryLine($prisonSexPartner, _kink)>></div><</for>>
<</if>>
<<if _last.playerLine>><<ChatMessage _last.playerLine>><<elseif _last.effectMessage>><<ChatMessage _last.effectMessage>><</if>>
<<if _last.npcReply>><<ChatWithoutNPC _inm.name _inmatePortrait _last.npcReply>><</if>>
<<unset $prisonSexLastApply>>
<</if>>
<<set _poseLine = getPoseNarrativeLine(_state, _dom, _sub)>>
<<if _poseLine>><<ChatMessage _poseLine>><</if>>
<<if _state.pose is "Vag" or _state.pose is "Anal" or _state.pose is "Oral" or _state.pose is "Oral(Strap-on)">>
<<set _dialogPose = (_state.pose is "Oral(Strap-on)") ? "Oral" : _state.pose>>
<<set _dialogExtra = (_state.cuni ? "Lick" : ((_state.pose is "Oral(Strap-on)") ? "Oral(Strap-on)" : ""))>>
<<set _dialog = getPersonalizedSexDialog($prisonSexPartner, (_dom.info.isPlayer == false), _dialogPose, "Like", _dialogExtra)>>
<<if _dialog>><<ChatWithoutNPC _inm.name _inmatePortrait _dialog>><</if>>
<</if>>
</section>
</section>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<PrisonRestoreBackground>>
<<set _session = $prisonSexSession>>
<<set _inm = (_session and Array.isArray($prisonRoster)) ? getInmate($prisonRoster, _session.inmateId) : null>>
<<set _sexCtx = {
inside: ($prison and $prison.inside === true), stintDay: getPrisonStintDay(),
stintSerial: ($prison ? ($prison.priors || 0) : 0),
location: ($player and $player.info ? $player.info.currentLocation : ""), heat: ($prison ? ($prison.heat || 0) : 0),
playerRep: ($prison ? ($prison.rep || 0) : 0), playerScrip: ($prison ? ($prison.scrip || 0) : 0),
playerGender: ($player ? $player.gender() : "Male"),
playerDominance: ($player and $player.attributes.dominance ? $player.attributes.dominance.value : 0),
playerActiveSexBlocked: prisonPlayerActiveSexBlocked($player, $playerlock)
}>>
<<set _authority = ($prison and $prison.sceneAuthority and $prison.sceneAuthority.scene is "prisonSex" and $prison.sceneAuthority.stintDay is _sexCtx.stintDay and $prison.sceneAuthority.targetId is (_session ? _session.inmateId : null) and $prison.sceneAuthority.block is _sexCtx.location)>>
<<set _valid = (_authority and _inm and $prisonSexPartner and $prisonSexAction and CheckContentFilter(prisonSexGender(_inm), $player) and validatePrisonSexSession(_session, _inm, $prisonSexPartner, $player, _sexCtx).valid)>>
<<if not _valid>>
<<HideLeftPanel false>>
<<run UIBar.unstow()>>
<<if _session and _inm and $prisonSexPartner>><<run leavePrisonSexSession(_session, _inm, $prisonSexPartner, $player)>><</if>>
<<unset $prisonSexSession $prisonSexPartner $prisonSexAction $prisonSexLastApply>>
<<if $prison>><<set $prison.sceneAuthority = null>><</if>>
<<goto "Prison_Block">>
<<else>>
<<set _prev = { phase: _session.state.currentPhase, pose: _session.state.pose, pace: _session.state.pace, playerDom: _session.state.playerDom, history: _session.state.history.length }>>
<<set _step = applyPrisonSexAction(_session, $prisonSexAction, _inm, $prisonSexPartner, $player, _sexCtx)>>
<<set $prisonSexSession = _step.session>>
<<set _state = $prisonSexSession.state>>
<<set _executed = (_state.history.length gt _prev.history)>>
<<if _state.pace isnot _prev.pace>><<set $prisonSexLastPace = _prev.pace>><</if>>
<<set _flavor = _executed ? getPhaseActionFlavor($prisonSexPartner, $player, $prisonSexAction.id, _state) : { playerLine: "", npcReply: "" }>>
<<set $prisonSexLastApply = {
phaseChanged: _state.currentPhase isnot _prev.phase,
newStage: "", advanceLine: "",
poseChanged: _state.pose isnot _prev.pose or _state.playerDom isnot _prev.playerDom,
poseLine: "",
paceChanged: _state.pace isnot _prev.pace,
paceLine: "",
discoveries: (Array.isArray(_step.discoveries) ? _step.discoveries : []),
effectMessage: (_step.line || _step.effect.message || ""),
playerLine: (_step.caught ? "" : _flavor.playerLine),
npcReply: (_step.caught ? "" : _flavor.npcReply)
}>>
<<if $prisonSexLastApply.phaseChanged>>
<<set _stage = getInteractiveStage(_state)>>
<<set $prisonSexLastApply.newStage = _stage.stage>>
<<set $prisonSexLastApply.advanceLine = getAdvanceLine(_state, $prisonSexPartner)>>
<</if>>
<<if $prisonSexLastApply.poseChanged>><<set $prisonSexLastApply.poseLine = getPoseTransitionLine(_prev.pose, _state.pose, $prisonSexPartner, _state)>><</if>>
<<if $prisonSexLastApply.paceChanged>><<set $prisonSexLastApply.paceLine = getPaceChangeLine(_prev.pace, _state.pace, _state, $prisonSexPartner)>><</if>>
<<set _dom = _state.playerDom ? $player : $prisonSexPartner>>
<<set _sub = _state.playerDom ? $prisonSexPartner : $player>>
<<if _step.effect.hornyGain.sub gt 0>><<run safeIncreaseHorny(_sub.status.horny, _step.effect.hornyGain.sub)>><</if>>
<<if _step.effect.hornyGain.dom gt 0>><<run safeIncreaseHorny(_dom.status.horny, _step.effect.hornyGain.dom)>><</if>>
<<if _step.effect.lustGain isnot 0>><<SetCharProgression $player "lust" _step.effect.lustGain true>><</if>>
<<for _gain range _step.effect.skillGains>><<run gainSexExp($player, _gain.skill, _gain.amount)>><</for>>
<<if _step.energyCost gt 0>><<SpendEnergy $player _step.energyCost>><</if>>
<<if _step.minutes gt 0>><<SpendTime _step.minutes>><</if>>
<<set $prison.heat = Math.max(0, Math.min(100, ($prison.heat || 0) + _step.heatDelta))>>
<<set $prison.rep = Math.max(0, Math.min(100, ($prison.rep || 0) + _step.repDelta))>>
<<unset $prisonSexAction>>
<<if not _step.valid>>
<<goto "Prison_SexLeave">>
<<elseif _step.caught or $prisonSexSession.status is "interrupted">>
<<set $prisonSexLine = _step.line>>
<<goto "Prison_SexInterrupted">>
<<elseif $prisonSexSession.status is "climax">>
<<unset $prisonSexClimaxChoice $prisonSexClimaxPlacement>>
<<goto "Prison_SexClimax">>
<<else>>
<<goto "Prison_Sex">>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<PrisonRestoreBackground>>
<<set _session = $prisonSexSession>>
<<set _inm = (_session and Array.isArray($prisonRoster)) ? getInmate($prisonRoster, _session.inmateId) : null>>
<<set _sexCtx = {
inside: ($prison and $prison.inside === true), stintDay: getPrisonStintDay(),
stintSerial: ($prison ? ($prison.priors || 0) : 0),
location: ($player and $player.info ? $player.info.currentLocation : ""), heat: ($prison ? ($prison.heat || 0) : 0),
playerRep: ($prison ? ($prison.rep || 0) : 0), playerScrip: ($prison ? ($prison.scrip || 0) : 0),
playerGender: ($player ? $player.gender() : "Male"),
playerDominance: ($player and $player.attributes.dominance ? $player.attributes.dominance.value : 0),
playerActiveSexBlocked: prisonPlayerActiveSexBlocked($player, $playerlock)
}>>
<<set _authority = ($prison and $prison.sceneAuthority and $prison.sceneAuthority.scene is "prisonSex" and $prison.sceneAuthority.stintDay is _sexCtx.stintDay and $prison.sceneAuthority.targetId is (_session ? _session.inmateId : null) and $prison.sceneAuthority.block is _sexCtx.location)>>
<<set _valid = (_authority and _inm and $prisonSexPartner and CheckContentFilter(prisonSexGender(_inm), $player) and validatePrisonSexSession(_session, _inm, $prisonSexPartner, $player, _sexCtx).valid and _session.status is "climax")>>
<<if not _valid>>
<<goto "Prison_SexLeave">>
<<else>>
<<set _climaxChoiceReady = ($prisonSexClimaxChoice is "partner" or $prisonSexClimaxChoice is "player")>>
<<set _placementOptions = _climaxChoiceReady ? prisonSexClimaxPlacementOptions(_session, $prisonSexPartner, $player, $prisonSexClimaxChoice) : []>>
<<set _insideAvailable = _placementOptions.includes("inside")>>
<<set _outsideAvailable = _placementOptions.includes("outside")>>
<<if _climaxChoiceReady and _placementOptions.length lt 2>>
<<set $prisonSexClimaxPlacement = (_placementOptions.length is 1) ? _placementOptions[0] : null>>
<<goto "Prison_SexResolve">>
<<else>>
<<HideLeftPanel true>>
<<run UIBar.stow()>>
<<set _media = prisonSexMediaRequest(_session, $prisonSexPartner, $player)>>
<<set _pick = SetSexPickByTable(_media.category, _media.domGender, _media.subGender)>>
<<set _risk = prisonSexRisk(_session, _sexCtx.heat, _sexCtx.location)>>
<section class="prison-sex-scene prison-sex-scene--climax" aria-label="Prison intimacy climax">
<header class="prison-sex-scene__top">
<<= getInteractiveSceneHeaderHtml(_session.state, $prisonSexPartner)>>
<section class="prison-sex-board" @data-risk="prisonSexRiskLabel(_risk)" aria-label="Scene risk">
<div class="prison-sex-board__identity"><span class="prison-sex-board__eyebrow">The count window is closing</span><strong class="prison-sex-board__role"><<if _climaxChoiceReady>>Choose where the cum lands<<else>>Choose who cums<</if>></strong></div>
<dl class="prison-sex-board__metrics">
<div><dt>Current noise</dt><dd><<= prisonSexNoiseLabel(_session.noise)>></dd></div>
<div><dt>Base sweep risk</dt><dd><<= _risk>>%</dd></div>
<div><dt>Your arousal</dt><dd><<= _session.playerArousal || 0>>/100</dd></div>
<div><dt><<= _inm.name>>'s arousal</dt><dd><<= _session.npcArousal || 0>>/100</dd></div>
</dl>
</section>
</header>
<div class="prison-sex-scene__workspace">
<div class="prison-sex-scene__media" aria-label="Scene video">
<<if _pick>><<Video _pick>><<PrisonMediaProse "" _pick _session.state.playerDom>><</if>>
</div>
<aside class="prison-sex-scene__controls" aria-label="Climax choices">
<<if _climaxChoiceReady>>
<fieldset class="prison-sex-actions prison-sex-placement">
<legend>Where to cum</legend>
<p class="prison-sex-placement__copy">Choose before the count window closes.</p>
<div class="prison-sex-climax-grid prison-sex-climax-grid--placement">
<<if _insideAvailable>><div class="btn" data-prison-action="intimate" data-placement="inside"><<button "Cum inside">><<set $prisonSexClimaxPlacement = "inside">><<goto "Prison_SexResolve">><</button>></div><</if>>
<<if _outsideAvailable>><div class="btn" data-prison-action="return" data-placement="outside"><<button "Pull out and cum outside">><<set $prisonSexClimaxPlacement = "outside">><<goto "Prison_SexResolve">><</button>></div><</if>>
</div>
</fieldset>
<div class="btn prison-sex-scene__stop" data-prison-action="return"><<button "Back to climax choices">><<unset $prisonSexClimaxChoice $prisonSexClimaxPlacement>><<goto "Prison_SexClimax">><</button>></div>
<<else>>
<fieldset class="prison-sex-actions">
<legend>Orgasm</legend>
<div class="prison-sex-climax-grid">
<div class="btn" data-prison-action="intimate"><<button "Make them cum first">><<set $prisonSexClimaxChoice = "partner">><<set $prisonSexClimaxPlacement = null>><<goto "Prison_SexClimax">><</button>></div>
<div class="btn" data-prison-action="intimate"><<button "Let yourself cum">><<set $prisonSexClimaxChoice = "player">><<set $prisonSexClimaxPlacement = null>><<goto "Prison_SexClimax">><</button>></div>
</div>
</fieldset>
<div class="btn prison-sex-scene__stop" data-prison-action="return"><<button "Pull apart before either of you cums">><<goto "Prison_SexLeave">><</button>></div>
<</if>>
</aside>
</div>
<section class="prison-sex-scene__dialogue" aria-label="Scene dialogue" aria-live="polite">
<<if $prisonSexLastApply and $prisonSexLastApply.effectMessage>><<ChatMessage $prisonSexLastApply.effectMessage>><</if>>
<<unset $prisonSexLastApply>>
</section>
</section>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<PrisonRestoreBackground>>
<<set _session = $prisonSexSession>>
<<set _inm = (_session and Array.isArray($prisonRoster)) ? getInmate($prisonRoster, _session.inmateId) : null>>
<<set _sexCtx = {
inside: ($prison and $prison.inside === true), stintDay: getPrisonStintDay(),
stintSerial: ($prison ? ($prison.priors || 0) : 0),
location: ($player and $player.info ? $player.info.currentLocation : ""), heat: ($prison ? ($prison.heat || 0) : 0),
playerRep: ($prison ? ($prison.rep || 0) : 0), playerScrip: ($prison ? ($prison.scrip || 0) : 0),
playerGender: ($player ? $player.gender() : "Male"),
playerDominance: ($player and $player.attributes.dominance ? $player.attributes.dominance.value : 0),
playerActiveSexBlocked: prisonPlayerActiveSexBlocked($player, $playerlock)
}>>
<<set _authority = ($prison and $prison.sceneAuthority and $prison.sceneAuthority.scene is "prisonSex" and $prison.sceneAuthority.stintDay is _sexCtx.stintDay and $prison.sceneAuthority.targetId is (_session ? _session.inmateId : null) and $prison.sceneAuthority.block is _sexCtx.location)>>
<<set _validation = validatePrisonSexSession(_session, _inm, $prisonSexPartner, $player, _sexCtx)>>
<<set _choiceValid = ($prisonSexClimaxChoice is "partner" or $prisonSexClimaxChoice is "player")>>
<<set _placementOptions = (_choiceValid and _session and $prisonSexPartner) ? prisonSexClimaxPlacementOptions(_session, $prisonSexPartner, $player, $prisonSexClimaxChoice) : []>>
<<set _placementValid = (_placementOptions.length is 0) ? (not $prisonSexClimaxPlacement) : _placementOptions.includes($prisonSexClimaxPlacement)>>
<<set _valid = (_authority and _inm and $prisonSexPartner and _choiceValid and _placementValid and CheckContentFilter(prisonSexGender(_inm), $player) and _validation.valid and _session.status is "climax")>>
<<if not _valid>>
<<goto "Prison_SexLeave">>
<<else>>
<<set _finish = finishPrisonSexSession(_session, $prisonSexClimaxChoice, _inm, $prisonSexPartner, $player, _sexCtx, Math.random, ($prisonSexClimaxPlacement || undefined))>>
<<if _finish.valid>>
<<set $prison.heat = Math.max(0, Math.min(100, ($prison.heat || 0) + _finish.heatDelta))>>
<<set $prison.rep = Math.max(0, Math.min(100, ($prison.rep || 0) + _finish.repDelta))>>
<<if _finish.energyCost gt 0>><<SpendEnergy $player _finish.energyCost>><</if>>
<<if _finish.minutes gt 0>><<SpendTime _finish.minutes>><</if>>
<<set _clip = SetSexPickByTable(_finish.media.category, _finish.media.domGender, _finish.media.subGender)>>
<<if not _clip>><<set _baseMedia = prisonSexMediaRequest(_session, $prisonSexPartner, $player)>><<set _clip = SetSexPickByTable(_baseMedia.category, _baseMedia.domGender, _baseMedia.subGender)>><</if>>
<<set $moveVideo = _clip>>
<<set $inmateLine = _finish.line>>
<<switch _session.state.pose>>
<<case "Anal">><<run gainSexExp($player, "analSkill", Random(3,5))>>
<<case "Oral">><<run gainSexExp($player, "oralSkill", Random(3,5))>>
<<case "Oral(Strap-on)">><<run gainSexExp($player, "oralSkill", Random(3,5))>>
<<case "Facefuck">><<run gainSexExp($player, "oralSkill", Random(3,5))>>
<<case "Vag">><<run gainSexExp($player, "vaginalSkill", Random(3,5))>>
<<case "Titfuck">><<run gainSexExp($player, "handSkill", Random(3,5))>>
<</switch>>
<<run gainSexExp($player, "disinhibition", Random(1,2))>>
<<SetCharProgression $player "lust" `Random(10,25)` true>>
<<if _session.state.playerDom>><<SetCharProgression $player "dominance" `Random(3,8)` true>><<else>><<SetCharProgression $player "submission" `Random(3,8)` true>><</if>>
<<if $prisonSexClimaxChoice is "player">>
<<run $player.status.horny.value = $player.status.horny.min>>
<<run $player.status.potency.decrease(1)>>
<</if>>
<<run $player.dailyEvents.registerEvent($player.info.id, "SexualActivityToday", 1)>>
<</if>>
<<set $prison.sceneAuthority = { scene: "inmate", stintDay: getPrisonStintDay(), targetId: _inm.id, block: _sexCtx.location }>>
<<unset $prisonSexSession $prisonSexPartner $prisonSexAction $prisonSexLastApply $prisonSexLastPace $prisonSexClimaxChoice $prisonSexClimaxPlacement>>
<<set $prisonSexLine = "">>
<<HideLeftPanel false>>
<<run UIBar.unstow()>>
<<goto "Prison_Inmate">>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<PrisonRestoreBackground>>
<<HideLeftPanel false>>
<<run UIBar.unstow()>>
<<set _session = $prisonSexSession>>
<<set _inm = (_session and Array.isArray($prisonRoster)) ? getInmate($prisonRoster, _session.inmateId) : null>>
<div class="centre-text">The flashlight finds you</div>
<<if $prisonSexLine>><<PrisonProse $prisonSexLine>><<else>><<PrisonProse "The stolen window closes under keys and a flashlight. You separate under an officer's stare.">><</if>>
<div class="prison-actnote">Guard heat has risen. The encounter counts as interrupted, not completed.</div>
<div class="btn padding-top" data-prison-action="return"><<button "Straighten your blues and go">>
<<if _inm and $prison>><<set $prison.sceneAuthority = { scene: "inmate", stintDay: getPrisonStintDay(), targetId: _inm.id, block: $player.info.currentLocation }>><<elseif $prison>><<set $prison.sceneAuthority = null>><</if>>
<<set $inmateLine = $prisonSexLine>>
<<unset $prisonSexSession $prisonSexPartner $prisonSexAction $prisonSexLastApply $prisonSexLastPace $prisonSexClimaxChoice $prisonSexClimaxPlacement>>
<<set $prisonSexLine = "">>
<<if _inm>><<goto "Prison_Inmate">><<else>><<goto "Prison_Block">><</if>>
<</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<PrisonRestoreBackground>>
<<HideLeftPanel false>>
<<run UIBar.unstow()>>
<<set _session = $prisonSexSession>>
<<set _inm = (_session and Array.isArray($prisonRoster)) ? getInmate($prisonRoster, _session.inmateId) : null>>
<<if _session and _inm and $prisonSexPartner>>
<<set $inmateLine = leavePrisonSexSession(_session, _inm, $prisonSexPartner, $player)>>
<<set $prison.sceneAuthority = { scene: "inmate", stintDay: getPrisonStintDay(), targetId: _inm.id, block: $player.info.currentLocation }>>
<<else>>
<<if $prison>><<set $prison.sceneAuthority = null>><</if>>
<</if>>
<<unset $prisonSexSession $prisonSexPartner $prisonSexAction $prisonSexLastApply $prisonSexLastPace $prisonSexClimaxChoice $prisonSexClimaxPlacement>>
<<set $prisonSexLine = "">>
<<if _inm>><<goto "Prison_Inmate">><<else>><<goto "Prison_Block">><</if>>
<</nobr>>/* The inmates present at the calling passage's location (doc 06.6). Forks the
cruise deck cards (ShipPeople): each con is a full city-style .location-npc-card
- portrait (npcFacePath off their feminization stage), status badges, archetype
eyebrow, name + stance pill, a Trust meter, then a prison footer (their goal,
their tie on the tier, and a wants/threat line). The whole card is the label of
an Approach <<button>> into Prison_Inmate; <<capture>> snapshots the loop var so
the deferred handler opens the right con. */
<<widget "PrisonPeople">>
<<run ensurePrisonRosterSize()>>
<<set _here = inmatesAtLocation($prisonRoster, passage(), $dateTime.hours, getPrisonStintDay())>>
<<set _totalPopulation = Array.isArray($prisonRoster) ? $prisonRoster.length : 0>>
<div class="centre-text prison-people__population"><strong><<= _here.length>></strong> inmates here · <strong><<= _totalPopulation>></strong> on the block roster</div>
<<set _sissyScene = prisonSissyAmbientScene($prisonRoster, passage(), getPrisonStintDay())>>
<<if _sissyScene and $gameSettings.contentFilter.nonConsent === true and CheckContentFilter(_sissyScene.topGender, _sissyScene.bottomGender)>>
<<SetAnalPick _sissyScene.topGender _sissyScene.bottomGender>>
<section class="prison-sissy-ambient">
<div class="centre-text">An owner uses a prison toy</div>
<<if _pick>><<Video _pick>><</if>>
<<PrisonProse _sissyScene.line>>
</section>
<</if>>
<<if _here.length gt 0>>
<<set _pdom = $player.attributes.dexterity.value>>
<<if $player.attributes.dominance>><<set _pdom = $player.attributes.dominance.value>><</if>>
<div class="prison-people">
<<for _inm range _here>>
<<capture _inm>>
<<set _b = prisonInmateBlurb(_inm)>>
<<set _face = npcFacePath(_b.stage, _inm.id, _inm.gender)>>
<<set _trust = Math.max(0, Math.min(100, Math.floor((_inm.stats ? _inm.stats.trust : 0) || 0)))>>
<<set _affection = prisonInmateAffection(_inm)>>
<<set _rel = prisonCardRelation(_inm)>>
<<set _she = (_inm.gender isnot "Male")>>
<<set _liveGoal = prisonGoalLabel(_inm.currentGoal || _inm.goal)>>
<<set _card = '<article class="location-npc-card prison-card" data-relation="' + _rel.rel + '">'>>
<<set _card += '<div class="location-npc-card__header"><div class="location-npc-card__badges">'>>
<<if _inm.read>><<set _card += '<span class="location-npc-card__badge location-npc-card__badge--unknown">Sized up</span>'>><</if>>
<<if _inm.gang>><<set _card += '<span class="location-npc-card__badge prison-card__badge--gang">' + _b.gang + '</span>'>><</if>>
<<if _inm.archetype is "shotcaller">><<set _card += '<span class="location-npc-card__badge prison-card__badge--caller">Shot-caller</span>'>><</if>>
<<if isLoverOfPlayer(_inm)>><<set _card += '<span class="location-npc-card__badge prison-card__badge--lover">Lover</span>'>>
<<elseif isAllyOfPlayer(_inm)>><<set _card += '<span class="location-npc-card__badge location-npc-card__badge--follower">Rides with you</span>'>>
<<elseif isClaimedByPlayer(_inm)>><<set _card += '<span class="location-npc-card__badge location-npc-card__badge--follower">Yours</span>'>><</if>>
<<set _card += '</div><span class="location-npc-card__cta">Step to</span></div>'>>
<<set _card += '<div class="location-npc-card__main"><div class="location-npc-card__avatar-shell"><img class="location-npc-card__avatar" src="' + _face + '" alt=""></div><div class="location-npc-card__content">'>>
<<set _card += '<div class="location-npc-card__eyebrow">' + _b.role + (_inm.gang ? ' · ' + _b.gang : '') + '</div>'>>
<<set _card += '<div class="location-npc-card__name-row"><div class="location-npc-card__name">' + _inm.name + '</div><span class="location-npc-card__relation-pill">' + _rel.label + '</span></div>'>>
<<set _desc = _inm.gender + ' · age ' + _b.age + ' · in for ' + _inm.crime.toLowerCase()>>
<<if _b.stage gt 0>><<set _desc += ' · Femininity ' + _b.stage + '/6'>><</if>>
<<set _card += '<div class="location-npc-card__description">' + _desc + '</div>'>>
<<set _card += '<div class="location-npc-card__metric-row"><span class="location-npc-card__metric-label">Trust</span><div class="location-npc-card__metric-bar"><div class="location-npc-card__metric-fill' + (isLoverOfPlayer(_inm) ? ' location-npc-card__metric-fill--love' : '') + '" style="width: ' + _trust + '%"></div></div><span class="location-npc-card__metric-value">' + _trust + '</span></div>'>>
<<set _card += '<div class="location-npc-card__metric-row"><span class="location-npc-card__metric-label">Affection</span><div class="location-npc-card__metric-bar"><div class="location-npc-card__metric-fill location-npc-card__metric-fill--love" style="width: ' + _affection + '%"></div></div><span class="location-npc-card__metric-value">' + _affection + '</span></div>'>>
<<set _card += '</div></div>'>>
<<set _card += '<div class="prison-card__goal">' + _liveGoal + '</div>'>>
/* The con's strongest standing tie on the tier: who owns them, or who they run
with - so the block reads as a web of allegiances, not a row of strangers. */
<<set _tie = prisonStrongestTie(_inm, $prisonRoster)>>
<<if _tie>><<set _card += '<div class="prison-card__tie prison-card__tie--' + _tie.kind + '">› ' + (_tie.kind is "owner" ? "Owned by " + _tie.name + " on the tier" : "Runs with " + _tie.name) + '</div>'>><</if>>
/* The wants/threat line: one of the player's own reads warm; anyone else who is a
wolf and reading the player soft reads as a threat (the same size-up that feeds
the night aggressor), surfaced so the danger on the block is legible. */
<<if isLoverOfPlayer(_inm)>><<set _card += '<div class="prison-card__wants prison-card__wants--lover">› Yours by choosing - ' + (_she ? "she eases" : "he eases") + ' the moment you come by.</div>'>>
<<elseif isAllyOfPlayer(_inm)>><<set _card += '<div class="prison-card__wants prison-card__wants--ally">› Rides with you - ' + (_she ? "her" : "his") + ' back is yours and yours is ' + (_she ? "hers" : "his") + '.</div>'>>
<<elseif isClaimedByPlayer(_inm)>><<set _card += '<div class="prison-card__wants prison-card__wants--owned">› ' + (_she ? "She" : "He") + ' is yours on the block.</div>'>>
<<elseif inmateSizingUpPlayer(_inm, _pdom)>><<set _card += '<div class="prison-card__wants prison-card__wants--threat">› ' + (_she ? "She keeps" : "He keeps") + ' eyeing you - reading you for a mark.</div>'>><</if>>
<<set _card += '</article>'>>
<<button _card>>
<<set $activeInmateId = _inm.id>>
<<set $inmateLine = "">>
<<set $inmateRead = false>>
<<set $prison.sceneAuthority = { scene: "inmate", stintDay: getPrisonStintDay(), targetId: _inm.id, block: passage() }>>
<<goto "Prison_Inmate">>
<</button>>
<</capture>>
<</for>>
</div>
<<else>>
<div class="prison-people__empty">Nobody worth your time here right now.</div>
<</if>>
<</widget>>
/* A block prose card: renders a passage's narration/action line through
formatDialogue so quoted "speech" lifts light against the dark narration layer
(the game-wide speech-light / action-dark scheme, doc 06). _args[0] is the
string to render. formatDialogue is a no-op on quote-free narration, so this is
safe on any line. A blank line ("\n\n") starts a new bubble: group scenes put the
rest of the cast first and keep the last bubble, the one above the clip, to the
two people the clip shows. */
<<widget "PrisonProse">>
<<if _args[0]>><<for _prisonProsePart range String(_args[0]).split("\n\n")>><<if _prisonProsePart.trim()>><div class="chat-container prison-prose"><p class="text"><<= formatDialogue(_prisonProsePart.trim())>></p></div><</if>><</for>><</if>>
<</widget>>
/* Interaction/result passages do not have their own physical location. Restore
the last real prison room so opening a dossier, conversation, fight result, or
sex menu never drops the backdrop. */
<<widget "PrisonRestoreBackground">>
<<run ensurePrisonRosterSize()>>
/* SetBackground is itself a widget. Calling it from another widget loses its
nested argument on the live SugarCube stack, which cleared the image even
though the mapped file existed. Restore the exact physical-room cache through
the underlying renderer; this also covers rooms not present in a hand map. */
<<set _prisonBgPath = (typeof $backgroundCache is "string") ? $backgroundCache : "">>
<<if not _prisonBgPath>>
<<set _prisonBgLocation = ($player and $player.info and $player.info.currentLocation) ? $player.info.currentLocation : "Prison_Block">>
<<switch _prisonBgLocation>>
<<case "Prison_Cell">><<set _prisonBgPath = ($prison.block is "F" ? "Media/Locations/Prison/cell_f.jpg" : "Media/Locations/Prison/cell_m.jpg")>>
<<case "Prison_Yard" "Prison_Weights">><<set _prisonBgPath = "Media/Locations/Prison/yard.jpg">>
<<case "Prison_Chow">><<set _prisonBgPath = "Media/Locations/Prison/chow_hall.jpg">>
<<case "Prison_Showers">><<set _prisonBgPath = ($prison.block is "F" ? "Media/Locations/Prison/showers_f.jpg" : "Media/Locations/Prison/showers_m.jpg")>>
<<case "Prison_Laundry">><<set _prisonBgPath = ($prison.block is "F" ? "Media/Locations/Prison/workshop_f.jpg" : "Media/Locations/Prison/laundry_m.jpg")>>
<<case "Prison_Commissary">><<set _prisonBgPath = "Media/Locations/Prison/commissary.jpg">>
<<case "Prison_Segregation">><<set _prisonBgPath = "Media/Locations/Prison/segregation.jpg">>
<<case "Prison_GuardStation">><<set _prisonBgPath = "Media/Locations/Prison/guard_station.jpg">>
<<case "Prison_Chapel">><<set _prisonBgPath = "Media/Locations/Prison/chapel.jpg">>
<<case "Prison_Infirmary">><<set _prisonBgPath = "Media/Locations/Prison/infirmary.jpg">>
<<case "Prison_LawLibrary">><<set _prisonBgPath = "Media/Locations/Prison/law_library.png">>
<<case "Prison_OtherBlock">><<set _prisonBgPath = ($prison.visiting is "F" ? "Media/Locations/Prison/tier_f.jpg" : "Media/Locations/Prison/tier_m.jpg")>>
<<default>><<set _prisonBgPath = ($prison.block is "F" ? "Media/Locations/Prison/block_f_dayroom.jpg" : "Media/Locations/Prison/block_m_dayroom.jpg")>>
<</switch>>
<</if>>
<<if _prisonBgPath>>
<<run updateBackground(_prisonBgPath, false)>>
<<set $backgroundCache = _prisonBgPath>>
<</if>>
<</widget>>
/* Authored scene prose is the only dialogue window when it exists. A third
argument marks player participation (and may be false for the passive role),
so those clips never receive a detached third-person caption. Only neutral
NPC-only media without authored prose falls back to its generated caption. */
<<widget "PrisonMediaProse">>
<<if _args[0]>>
<<PrisonProse _args[0]>>
<<elseif _args.length < 3 and _args[1]>>
<<set _prisonMediaLine = prisonSexVideoDescription(_args[1])>>
<<if _prisonMediaLine>><<PrisonProse _prisonMediaLine>><</if>>
<</if>>
<</widget>>
/* One authority for checking into protective custody. Quest rewards (including
rep changes) stay with the quest resolver/caller; this only enforces the
custody invariant shared by quest and direct entry. */
<<widget "EnterProtectiveCustody">>
<<set _pcVisit = ($prison and $prison.inside) ? getActiveCrossBlockVisit($prison, { day: getCurrentAbsoluteDay(), hour: $dateTime.hours, minute: $dateTime.minutes }) : null>>
<<if not $prison or not $prison.inside>>
<<goto "PoliceStation">>
<<elseif $prison.inPC>>
<<goto "Prison_Segregation">>
<<elseif _pcVisit>>
<<goto "Prison_OtherBlock">>
<<else>>
<<set $prison.inPC = true>>
<<set $prison.gang = null>>
<<set $prison.protected = false>>
<<set $prison.protectorId = null>>
<<set $prison.gangJobDone = false>>
<<set $prison.carFleshToday = false>>
<<set $prison.servedProtectorToday = false>>
<<set $prison.sharedToday = false>>
<<set $prison.sceneAuthority = null>>
<<set $prison.escapeSuccess = null>>
<<set $prison.paroleDecision = null>>
<<set $prison.takeoverDecision = null>>
<<set $activeQuestId = "">>
<<set $questOutcome = "">>
<<set $questOutcomePath = "">>
<<set $questUnlockedTitle = "">>
<<set $questRouteId = "">>
<<set $questRoutePath = "">>
<<run unlockPrisonAchievement('checkedIn')>>
<<goto "Prison_Segregation">>
<</if>>
<</widget>>
/* Advance one or more complete prison sleep cycles. Each day lets the tier live,
applies player-facing fallout, records the morning report, then resets daily
gates. _args[1] omits the player's own people while they are absent in the hole. */
<<widget "AdvancePrisonDays">>
<<set _advanceDays = Math.max(0, Math.floor(Number(_args[0]) || 0))>>
<<set _playerAbsent = (_args[1] === true)>>
<<for _advanceIndex = 0; _advanceIndex < _advanceDays; _advanceIndex++>>
<<set _advanceReport = resolvePrisonSociety($prisonRoster, undefined, 3, $prison.gang)>>
<<if not _playerAbsent>><<set _advanceReport = _advanceReport.concat(playerPeopleReport($prisonRoster))>><</if>>
<<run applyGangWarFallout(_advanceReport)>>
<<set $prisonMorningReport = ($prisonMorningReport || []).concat(_advanceReport)>>
<<run newPrisonDay()>>
<</for>>
<<if _advanceDays gt 0>><<RestorePlayerFromSleep>><</if>>
<</widget>>
/* Inline art for a piece of contraband / a token / a table. _args[0] is the item
key (commissary key, craft product, 'scrip', 'dice'...); _args[1] is an
optional extra class (e.g. "prison-item-icon--table" for a big header plate).
Renders nothing when no icon is shipped for the key (the skip-the-image
contract), so it is safe to drop in anywhere. */
<<widget "PrisonItemIcon">>
<<if _args[0]>><<= prisonItemIconTag(_args[0], _args[1] ? _args[1] : "")>><</if>>
<</widget>>
/* Commit a pending Cee-lo round. Nothing is charged or rolled while the bones
are only spinning in the ready state; every live gate is checked again here,
at the actual throw. */
<<widget "PrisonResolveDiceRound">>
<<set _pendingDice = _args[0]>>
<<set $diceRoll = null>>
<<set $diceVideo = "">>
<<set $diceContent = null>>
<<set _diceOpp = _pendingDice ? getInmate($prisonRoster, _pendingDice.opponentId) : null>>
<<set _diceRoundLive = _pendingDice and _pendingDice.phase is "ready" and _pendingDice.stintDay is getPrisonStintDay() and _diceOpp and _diceOpp.block is $prison.block>>
<<if not _diceRoundLive>>
<<set $diceMsg = "The circle breaks before you can throw. Nobody takes your stake; you will have to start a fresh round.">>
<<elseif _pendingDice.kind is "scrip">>
<<set _diceStake = Math.max(1, Math.round(Number(_pendingDice.stake) || 0))>>
<<if ($prison.scrip || 0) lt _diceStake>>
<<set $diceMsg = "You reach for the stake and come up short. The shooter waves your rolling bones away; no scrip changes hands.">>
<<elseif $player.status.energy.value lt 8>>
<<set $diceMsg = "Your hands have gone too heavy to make a clean throw. You pull out of the round before any scrip changes hands.">>
<<else>>
<<SpendEnergy $player 8>>
<<set _diceLuck = ($player.attributes.luck ? $player.attributes.luck.value : 3) / 10>>
<<set _diceRes = resolveDiceGame(_diceLuck, _diceOpp, _diceStake)>>
<<set $prison.scrip = Math.max(0, ($prison.scrip || 0) + _diceRes.scripDelta)>>
<<set _diceMine = diceHandLabel(_diceRes.playerHand)>>
<<set _diceTheirs = diceHandLabel(_diceRes.npcHand)>>
<<set $diceRoll = {
playerDice: _diceRes.playerHand.dice.slice(),
npcDice: _diceRes.npcHand.dice.slice(),
playerLabel: _diceMine,
npcLabel: _diceTheirs,
outcome: _diceRes.outcome,
opponent: _diceOpp.name
}>>
<<if _diceRes.outcome is "win">>
<<run awardPrisonSkillPoints($prison, "game", "dice")>>
<<run recordPrisonDirectorEvent($prison, "activity")>>
<<if _diceStake gte 20>><<set $prison.rep = Math.min(100, ($prison.rep || 0) + 2)>><</if>>
<<set $diceMsg = "You cup the bones, breathe on them, and let them go: " + _diceMine + ". " + _diceOpp.name + " takes the bones next, throws " + _diceTheirs + ", and spits in the dust. You rake in " + _diceRes.scripDelta + " scrip and the ring grumbles.">>
<<elseif _diceRes.outcome is "lose">>
<<set $diceMsg = "You throw " + _diceMine + ". " + _diceOpp.name + " takes the next turn, answers with " + _diceTheirs + ", and reaches for your stake. There goes " + (0 - _diceRes.scripDelta) + " scrip.">>
<<else>>
<<set $diceMsg = "You throw " + _diceMine + ". " + _diceOpp.name + " follows with " + _diceTheirs + " and matches you dead even. The stake pushes - nobody's scrip moves.">>
<</if>>
<</if>>
<<elseif _pendingDice.kind is "body">>
<<set _diceBodyGender = prisonSexGender(_diceOpp)>>
<<if $prison.diceBodyToday or $prison.shotCaller or not CheckContentFilter(_diceBodyGender, $player) or prisonPlayerActiveSexBlocked($player, $playerlock)>>
<<set $diceMsg = prisonPlayerActiveSexBlocked($player, $playerlock) ? "The cage takes the body wager off the table before the throw. You pull out without owing anyone sex." : "The body wager is off before the throw. The circle gives you your place back and moves on.">>
<<else>>
<<set $prison.diceBodyToday = true>>
<<SpendTime 20>>
<<SetCharProgression $player "corruption" 1 true>>
<<set _diceBodyName = _diceOpp.name>>
<<set _dicePlayerLuck = ($player.attributes.luck ? $player.attributes.luck.value : 3)>>
<<set _diceBodyWin = Math.max(25, Math.min(75, 44 + _dicePlayerLuck * 3))>>
<<set _diceBodyResult = random(1, 100)>>
<<if _diceBodyResult lte (_diceBodyWin - 6)>>
<<set $diceRoll = {
playerDice: [4, 5, 6],
npcDice: [2, 2, 5],
playerLabel: "4-5-6, four-five-six",
npcLabel: "2-2-5, a point of 5",
outcome: "win",
opponent: _diceBodyName
}>>
<<SetCharProgression $player "dominance" 2 true>>
<<set $prison.rep = Math.min(100, ($prison.rep || 0) + 4)>>
<<if _diceOpp.stats>><<set _diceOpp.stats.shame = Math.min(100, (_diceOpp.stats.shame || 0) + 4)>><</if>>
<<SetAnalPick $player.gender() _diceBodyGender>>
<<set $diceVideo = _pick>>
<<set $diceContent = { adult: true, partnerGender: _diceBodyGender, nonConsent: false }>>
<<if _diceBodyGender is "Female">>
<<set $diceMsg = "You cup the bones and let them go, and they come up yours. " + _diceBodyName + " takes her turn and loses the body she staked against yours. You walk her behind the blanket, buckle on a prison-made strap, and fuck her ass while the ring settles its side bets. You press the base hard to your cunt and cum without pulling out. When she fixes her blues, the shooter is already rattling the next roll.">>
<<elseif _diceBodyGender is "Shemale">>
<<set $diceMsg = "Your dice land clean. " + _diceBodyName + " throws after you and loses, and the circle whoops. She put her body in the pot against yours and goes to the blind side of the blanket without argument, blues loosening, her own cock ignored while you bend her over, push into her ass, and fuck her until you cum inside her - the winnings the whole ring watched her wager.">>
<<else>>
<<set $diceMsg = "Your dice land clean. " + _diceBodyName + " throws after you and loses his body wager in front of the circle. You walk him behind the blanket, bend him over and fuck his ass until you cum inside him. On the other side, the ring laughs and settles its side bets.">>
<</if>>
<<elseif _diceBodyResult lte (_diceBodyWin + 6)>>
<<set $diceRoll = {
playerDice: [3, 3, 6],
npcDice: [3, 3, 6],
playerLabel: "3-3-6, a point of 6",
npcLabel: "3-3-6, a point of 6",
outcome: "draw",
opponent: _diceBodyName
}>>
<<set $diceMsg = "You throw first. " + _diceBodyName + " follows and the bones come up dead even, and the circle groans. The pot pushes - you keep your body and so does the one across the blanket. This time.">>
<<else>>
<<set $diceRoll = {
playerDice: [2, 2, 4],
npcDice: [4, 5, 6],
playerLabel: "2-2-4, a point of 4",
npcLabel: "4-5-6, four-five-six",
outcome: "lose",
opponent: _diceBodyName
}>>
<<set $prison.rep = Math.max(0, ($prison.rep || 0) - 4)>>
<<SetAnalPick _diceBodyGender $player.gender()>>
<<set $diceVideo = _pick>>
<<set $diceContent = { adult: true, partnerGender: _diceBodyGender, nonConsent: false }>>
<<PrisonCoerceBody>>
<<if _diceBodyGender is "Female">>
<<set $diceMsg = "You throw first and the bones go cold. " + _diceBodyName + " takes her turn, throws better, and the circle roars because everybody saw you put your body in that pot. You go to the blind side of the blanket and pay what you staked: she bends you over, pushes a prison-made strap into your ass, and works it while the ring settles up around you.">>
<<elseif _diceBodyGender is "Shemale">>
<<set $diceMsg = "You throw first and the bones go cold. " + _diceBodyName + " answers with a winning hand, and the circle roars because every man saw you stake your body on it. You go to the blanket's blind side and pay the wager: she bends you over, pushes her cock into your ass, and fucks you while the ring collects its side bets.">>
<<else>>
<<set $diceMsg = "You throw first and the bones go cold. " + _diceBodyName + " answers with a winning hand, and the circle roars because every man saw you stake your body on it. You go to the blanket's blind side and pay the wager: he bends you over, pushes his cock into your ass, and fucks you while the ring collects its side bets.">>
<</if>>
<</if>>
<</if>>
<<else>>
<<set $diceMsg = "The unfinished round is no longer valid. Nobody takes anything from you.">>
<</if>>
<</widget>>
/* Result prose and follow-up controls are separate from the dice table so a
confirmed throw can replace only these controls while the mounted dice stop
in place. */
<<widget "PrisonDiceOutcomePanel">>
<<set _diceOutcomeClass = $diceRoll ? "prison-dice-outcome" : "">>
<div @class="_diceOutcomeClass">
<<PrisonMediaProse $diceMsg $diceVideo>>
<<if $diceVideo and $diceVideo isnot "">><<Video $diceVideo>><<set $diceVideo = "">><</if>>
<div class="btn-container">
<<if ($prison.scrip || 0) gte DICE_STAKES[0] and $player.status.energy.value gte 8>>
<div class="btn"><<button "Shake again">><<set $diceMsg = "">><<set $diceVideo = "">><<set $diceContent = null>><<set $diceRound = null>><<set $diceRoll = null>><<goto "Prison_Dice">><</button>></div>
<<elseif ($prison.scrip || 0) gte DICE_STAKES[0]>>
<div class="prison-actnote">You are too wrung out to keep your head in the game. Rest it off, or put a coffee in you, before you throw good scrip after bad.</div>
<</if>>
<div class="btn"><<button "Cash out and walk" "Prison_Block">><<set $diceMsg = "">><<set $diceVideo = "">><<set $diceContent = null>><<set $diceRound = null>><<set $diceRoll = null>><</button>></div>
</div>
</div>
<</widget>>
/* Staged Cee-lo table. A "ready" payload keeps the player's bones tumbling
until the throw button is pressed. A resolved payload then reveals the
player's fixed hand first, lets the opponent throw second, and only then
exposes the result. _args[0] is a save-safe $diceRound/$diceRoll payload. */
<<widget "PrisonDiceRoll">>
<<set _diceRoll = _args[0]>>
<<set _diceFacePaths = [
"",
"Media/Items/Prison/dice-spin/frames/frame-13.png",
"Media/Items/Prison/dice-spin/frames/frame-11.png",
"Media/Items/Prison/dice-spin/frames/frame-15.png",
"Media/Items/Prison/dice-spin/frames/frame-14.png",
"Media/Items/Prison/dice-spin/frames/frame-12.png",
"Media/Items/Prison/dice-spin/frames/frame-16.png"
]>>
<<if _diceRoll and _diceRoll.phase is "ready">>
<section id="prison-dice-roll" class="prison-dice-roll prison-dice-roll--ready" data-phase="ready" role="group" @aria-label="'Cee-lo table: your dice are rolling; ' + (_diceRoll.opponent || 'the shooter') + ' waits to throw'">
<div class="prison-dice-side is-player-side is-rolling">
<strong class="prison-dice-side__name">You</strong>
<div class="prison-dice-hand" aria-label="Your three dice are rolling">
<<for _diceIndex range [0, 1, 2]>>
<<set _diceDelay = "--dice-delay: " + (_diceIndex * 90) + "ms;">>
<span class="prison-die" @style="_diceDelay">
<span class="prison-die__spin" aria-hidden="true"></span>
<img class="prison-die__result" alt="">
<span class="prison-die__waiting" aria-hidden="true">?</span>
</span>
<</for>>
</div>
<span class="prison-dice-side__hand">Rolling - throw when you are ready</span>
</div>
<div class="prison-dice-vs" aria-hidden="true">then</div>
<div class="prison-dice-side is-npc-side is-waiting">
<strong class="prison-dice-side__name"><<= _diceRoll.opponent || "The shooter">></strong>
<div class="prison-dice-hand" aria-label="The opponent is waiting for your throw">
<<for _diceIndex range [0, 1, 2]>>
<<set _diceDelay = "--dice-delay: " + (320 + _diceIndex * 90) + "ms;">>
<span class="prison-die" @style="_diceDelay">
<span class="prison-die__spin" aria-hidden="true"></span>
<img class="prison-die__result" alt="">
<span class="prison-die__waiting" aria-hidden="true">?</span>
</span>
<</for>>
</div>
<span class="prison-dice-side__hand">Throws after you</span>
</div>
</section>
<<elseif _diceRoll and Array.isArray(_diceRoll.playerDice) and Array.isArray(_diceRoll.npcDice)>>
<<set _dicePlayerClass = "prison-dice-side is-player-side" + (_diceRoll.outcome is "win" ? " is-winner" : (_diceRoll.outcome is "lose" ? " is-loser" : ""))>>
<<set _diceNpcClass = "prison-dice-side is-npc-side" + (_diceRoll.outcome is "lose" ? " is-winner" : (_diceRoll.outcome is "win" ? " is-loser" : ""))>>
<<set _diceSides = [
{
label: "You",
dice: _diceRoll.playerDice,
hand: _diceRoll.playerLabel || _diceRoll.playerDice.join("-"),
className: _dicePlayerClass,
baseDelay: 0,
handDelay: 0
},
{
label: _diceRoll.opponent || "The shooter",
dice: _diceRoll.npcDice,
hand: _diceRoll.npcLabel || _diceRoll.npcDice.join("-"),
className: _diceNpcClass,
baseDelay: 320,
handDelay: 1260
}
]>>
<section id="prison-dice-roll" class="prison-dice-roll prison-dice-roll--resolved" data-phase="resolved" role="group" @aria-label="'Cee-lo throw: You against ' + (_diceRoll.opponent || 'the shooter')">
<<for _diceSideIndex, _diceSide range _diceSides>>
<<if _diceSideIndex gt 0>><div class="prison-dice-vs" aria-hidden="true">vs</div><</if>>
<<set _diceSideStyle = "--dice-hand-delay: " + _diceSide.handDelay + "ms;">>
<div @class="_diceSide.className" @style="_diceSideStyle">
<strong class="prison-dice-side__name"><<= _diceSide.label>></strong>
<div class="prison-dice-hand">
<<for _diceIndex range [0, 1, 2]>>
<<set _diceValue = Math.max(1, Math.min(6, Number(_diceSide.dice[_diceIndex]) || 1))>>
<<set _diceDelay = "--dice-delay: " + (_diceSide.baseDelay + _diceIndex * 90) + "ms;">>
<<set _diceAlt = "Die showing " + _diceValue>>
<span class="prison-die" @style="_diceDelay">
<span class="prison-die__spin" aria-hidden="true"></span>
<img class="prison-die__result" @src="_diceFacePaths[_diceValue]" @alt="_diceAlt">
</span>
<</for>>
</div>
<span class="prison-dice-side__hand"><<= _diceSide.hand>></span>
</div>
<</for>>
</section>
<</if>>
<</widget>>
/* The incarceration-only status card in StoryCaption. Keeping the state guard
inside the widget makes the card impossible to leak into city or cruise UI,
even if the sidebar call site is later moved or reused. */
<<widget "PrisonSidebarStatus">>
<<if $prison and $prison.inside>>
<<set _prisonSidebarCrew = $prisonRoster ? alliesOfPlayer($prisonRoster).length : 0>>
<<set _prisonSidebarSentence = getSentenceProgress()>>
<section class="sidebar-card sidebar-prison-status" id="prison-sidebar-status">
<div class="sidebar-card-header">
<div class="sidebar-card-eyebrow">Incarceration</div>
<div class="sidebar-card-title">Prison Status</div>
</div>
<div class="prison-sidebar-metrics">
<div class="prison-sidebar-metric prison-sidebar-metric--sentence">
<span class="prison-sidebar-metric__label">Days left</span>
<strong class="prison-sidebar-metric__value"><<= _prisonSidebarSentence.daysLeft>></strong>
</div>
<div class="prison-sidebar-metric prison-sidebar-metric--scrip">
<span class="prison-sidebar-metric__label"><<PrisonItemIcon "scrip">> Scrip</span>
<strong class="prison-sidebar-metric__value"><<= ($prison.scrip || 0)>></strong>
</div>
<div class="prison-sidebar-metric">
<span class="prison-sidebar-metric__label"><<PrisonItemIcon "estrogen">> Estrogen</span>
<strong class="prison-sidebar-metric__value"><<= ($prison.estrogenDoses || 0)>> doses</strong>
</div>
<div class="prison-sidebar-metric">
<span class="prison-sidebar-metric__label">Property held</span>
<strong class="prison-sidebar-metric__value">$<<= ($prison.heldMoney || 0)>></strong>
</div>
<div class="prison-sidebar-metric">
<span class="prison-sidebar-metric__label">Priors on your sheet</span>
<strong class="prison-sidebar-metric__value"><<= ($prison.priors || 0)>></strong>
</div>
<div class="prison-sidebar-metric">
<span class="prison-sidebar-metric__label">Reputation</span>
<strong class="prison-sidebar-metric__value"><<= ($prison.rep || 0)>>/100</strong>
</div>
<<if _prisonSidebarCrew gt 0>>
<div class="prison-sidebar-metric">
<span class="prison-sidebar-metric__label">Riding with you</span>
<strong class="prison-sidebar-metric__value"><<= _prisonSidebarCrew>></strong>
</div>
<</if>>
<<if $prison.gang>>
<div class="prison-sidebar-metric">
<span class="prison-sidebar-metric__label">Running with</span>
<strong class="prison-sidebar-metric__value"><<= gangLabel($prison.gang)>></strong>
</div>
<</if>>
<<if $prison.shotCaller>>
<div class="prison-sidebar-metric">
<span class="prison-sidebar-metric__label">You run</span>
<strong class="prison-sidebar-metric__value">Cellblock <<= $prison.block>></strong>
</div>
<</if>>
<div class="prison-sidebar-metric">
<span class="prison-sidebar-metric__label">Tier business</span>
<strong class="prison-sidebar-metric__value"><<= prisonBusinessCredLabel(prisonBusinessCred($prison))>></strong>
</div>
<<if ($prison.businessCompleted || 0) gt 0 or ($prison.businessFailed || 0) gt 0>>
<div class="prison-sidebar-metric prison-sidebar-metric--jobs">
<span class="prison-sidebar-metric__label">Jobs closed</span>
<strong class="prison-sidebar-metric__value"><<= ($prison.businessCompleted || 0)>> clean · <<= ($prison.businessFailed || 0)>> failed or bent</strong>
</div>
<</if>>
</div>
<<if passage() isnot "Prison_Skills">>
<div class="player-stats-view-btn-container player-stats-view-btn-container--utility">
<div class="player-stats-view-btn player-stats-view-btn--secondary" id="prison-skills-sidebar-btn"><<button "Prison skills">>
<<if $prison and $prison.inside>>
<<goto "Prison_Skills">>
<</if>>
<</button>></div>
</div>
<</if>>
</section>
<</if>>
<</widget>>
/* A fixed-cast portrait for the scene it heads. _args[0] is the role
(sergeant / nurse / warden / co / hustler / shotcaller / wolf / fish / lifer);
_args[1] is an optional gender or block variant ("Female"/"F") for the roles
that ship both plates; _args[2] is an optional extra class (e.g.
"prison-portrait--lg"). Renders nothing for an unshipped role. */
<<widget "PrisonPortrait">>
/* Default the variant to the housed block so inmate-archetype roles (wolf / fish /
lifer / hustler) skip their male-only plates on the all-Female F block. */
<<if _args[0]>>
<<set _portraitVariant = _args[1] ? _args[1] : (($prison and $prison.block) ? $prison.block : "")>>
<<if String(_args[0]).toLowerCase() is "silk">><<set _portraitVariant = String(prisonSilkStage())>><</if>>
<<= prisonRolePortraitTag(_args[0], _portraitVariant, _args[2] ? _args[2] : "")>>
<</if>>
<</widget>>
/* Save-safe conversation memory. It lives only for the current prison stint and
is therefore wiped with $prison on release. The widget exposes the selected
record as _conversationMemory to the calling passage/widget. */
<<widget "PrisonEnsureDialogueMemory">>
<<set _dialogueInmateId = Number(_args[0])>>
<<if not $prison.dialogueMemory or typeof $prison.dialogueMemory isnot "object">>
<<set $prison.dialogueMemory = {}>>
<</if>>
<<set _dialogueMemoryKey = String(_dialogueInmateId)>>
<<if not $prison.dialogueMemory[_dialogueMemoryKey] or typeof $prison.dialogueMemory[_dialogueMemoryKey] isnot "object">>
<<set $prison.dialogueMemory[_dialogueMemoryKey] = { heard: {}, recent: [], reacted: {}, lastTopic: "", sharedDay: -1 }>>
<</if>>
<<set _conversationMemory = $prison.dialogueMemory[_dialogueMemoryKey]>>
<<if not _conversationMemory.heard or typeof _conversationMemory.heard isnot "object">><<set _conversationMemory.heard = {}>><</if>>
<<if not Array.isArray(_conversationMemory.recent)>><<set _conversationMemory.recent = []>><</if>>
<<if not _conversationMemory.reacted or typeof _conversationMemory.reacted isnot "object">><<set _conversationMemory.reacted = {}>><</if>>
<</widget>>
/* Build the player-side register and fixed-cast role used by inmateTalkLine. */
<<widget "PrisonConversationContext">>
<<set _conversationInmate = _args[0]>>
<<PrisonEnsureDialogueMemory _conversationInmate.id>>
<<set _conversationAspect = "fish">>
<<if $prison.shotCaller>><<set _conversationAspect = "boss">>
<<elseif $prison.protected or ($prison.block is "M" and femStage($player) gte 4 and ($prison.rep || 0) lt 60)>><<set _conversationAspect = "fallen">>
<<elseif ($prison.rep || 0) gte 55>><<set _conversationAspect = "solid">>
<</if>>
<<set _conversationCastRole = "">>
<<if $prison.questNpc and typeof $prison.questNpc is "object">>
<<for _conversationRole, _conversationRoleId range $prison.questNpc>>
<<if Number(_conversationRoleId) is Number(_conversationInmate.id)>><<set _conversationCastRole = _conversationRole>><</if>>
<</for>>
<</if>>
<<set _conversationCtx = {
shotCaller: ($prison.shotCaller ? true : false),
playerRep: ($prison.rep || 0),
playerAspect: _conversationAspect,
playerGender: $player.gender(),
castRole: _conversationCastRole,
recentLines: _conversationMemory.recent
}>>
<</widget>>
/* Keep only the latest eight responses, enough to prevent immediate repetition
without making a small authored pool permanently unavailable. */
<<widget "PrisonRememberDialogue">>
<<PrisonEnsureDialogueMemory _args[0]>>
<<set _dialogueRememberedLine = String(_args[1] || "")>>
<<if _dialogueRememberedLine isnot "">>
<<run _conversationMemory.recent.push(_dialogueRememberedLine)>>
<<if _conversationMemory.recent.length gt 8>><<run _conversationMemory.recent.splice(0, _conversationMemory.recent.length - 8)>><</if>>
<</if>>
<</widget>>
/* One real conversation turn: time passes, the daily trust budget is enforced,
direct challenges are resolved from live standing, and the answer is remembered.
The passage presents a single follow-up before returning to the topic menu. */
<<widget "PrisonConversationTurn">>
<<set _conversationTopic = String(_args[0] || "")>>
<<set _conversationPlayerText = String(_args[1] || "")>>
<<set _conversationInmate = getInmate($prisonRoster, $activeInmateId)>>
<<if not $prison or not $prison.inside or not isAdultPrisonInmate(_conversationInmate)>>
<<goto "Prison_Block">>
<<else>>
<<PrisonConversationContext _conversationInmate>>
<<set _conversationHeard = Number(_conversationMemory.heard[_conversationTopic] || 0)>>
<<set _conversationLastTopic = String(_conversationMemory.lastTopic || "")>>
<<set _conversationGain = (_conversationHeard is 0) ? 2 : 1>>
<<set _conversationStanceSuccess = true>>
<<if _conversationInmate.talkDay isnot getPrisonStintDay()>>
<<set _conversationInmate.talkDay = getPrisonStintDay()>>
<<set _conversationInmate.talkTrust = 0>>
<</if>>
<<if _conversationTopic is "support">>
<<set _conversationGain = 2>>
<<elseif _conversationTopic is "share">>
<<if _conversationMemory.sharedDay is getPrisonStintDay()>><<set _conversationGain = 0>><<else>><<set _conversationMemory.sharedDay = getPrisonStintDay()>><<set _conversationGain = 2>><</if>>
<<elseif _conversationTopic is "challenge">>
<<set _conversationDominance = $player.attributes.dominance ? $player.attributes.dominance.value : $player.attributes.dexterity.value>>
<<set _conversationSkill = ($prison.skills and $prison.skills.levels) ? Number($prison.skills.levels.persuasion || 0) : 0>>
<<set _conversationForce = Number(_conversationDominance || 0) + Math.floor(($prison.rep || 0) / 20) + Math.floor(_conversationSkill / 2)>>
<<set _conversationResistance = Number(_conversationInmate.dominance || 0) + Math.floor((_conversationInmate.stats.standing || 0) / 25)>>
<<set _conversationStanceSuccess = _conversationForce gte _conversationResistance>>
<<if _conversationStanceSuccess>>
<<set _conversationGain = 1>>
<<set _conversationInmate.stats.azart = Math.min(100, (_conversationInmate.stats.azart || 0) + 1)>>
<<else>>
<<set _conversationGain = 0>>
<<set _conversationInmate.stats.trust = Math.max(0, (_conversationInmate.stats.trust || 0) - 2)>>
<<set _conversationInmate.stats.fear = Math.max(0, (_conversationInmate.stats.fear || 0) - 1)>>
<</if>>
<</if>>
<<set _conversationGain = Math.min(_conversationGain, Math.max(0, 7 - (_conversationInmate.talkTrust || 0)))>>
<<if _conversationGain gt 0>>
<<set _conversationInmate.talkTrust = (_conversationInmate.talkTrust || 0) + _conversationGain>>
<<set _conversationInmate.stats.trust = Math.min(100, (_conversationInmate.stats.trust || 0) + _conversationGain)>>
<</if>>
<<set _conversationCtx.topic = _conversationTopic>>
<<set _conversationCtx.lastTopic = _conversationLastTopic>>
<<set _conversationCtx.heardCount = _conversationHeard>>
<<set _conversationCtx.stanceSuccess = _conversationStanceSuccess>>
<<set $prisonConversationPlayerLine = _conversationPlayerText>>
<<set $prisonConversationNpcLine = inmateTalkLine(_conversationInmate, _conversationInmate.stats.trust, undefined, 30, _conversationCtx)>>
<<set _conversationMemory.heard[_conversationTopic] = _conversationHeard + 1>>
<<if ["home", "charge", "time", "plans", "gang", "story", "feminization", "cast"].includes(_conversationTopic)>>
<<set _conversationMemory.lastTopic = _conversationTopic>>
<<set _conversationMemory.reacted[_conversationTopic] = false>>
<<set $prisonConversationCanReact = true>>
<<else>>
<<if _conversationLastTopic isnot "">><<set _conversationMemory.reacted[_conversationLastTopic] = true>><</if>>
<<set $prisonConversationCanReact = false>>
<</if>>
<<PrisonRememberDialogue _conversationInmate.id $prisonConversationNpcLine>>
<<SpendTime 10>>
<<goto "Prison_Conversation">>
<</if>>
<</widget>>
/* Picks the corrupt-CO clip body-aware into $guardVideo. _args[0] is the CO's
gender (Male screw on the men's block, Female matron on the women's); _args[1]
is the act the prose describes ("oral" or "anal"), so the clip matches the
scene instead of being guessed. An oral favor on a male screw reuses the street
blowjob asset (player-gender aware); an oral favor on a matron and every anal
scene resolve through the pick table. Gated on the pair filter. */
<<widget "PrisonGuardVideo">>
<<set _cog = _args[0]>>
<<set _gact = (_args[1] is "oral") ? "oral" : "anal">>
<<if not CheckContentFilter(_cog, $player)>>
<<set $guardVideo = "">>
<<elseif _gact is "oral" and _cog is "Male">>
<<if $player.gender() is "Male">>
<<set $guardVideo = "Media\\Events\\Police\\Street\\Male_Cop_Blowjob.mp4">>
<<else>>
<<set $guardVideo = "Media\\Events\\Police\\Street\\Female_Cop_Blowjob.mp4">>
<</if>>
<<elseif _gact is "oral">>
<<SetOralPick _cog $player.gender()>>
<<set $guardVideo = _pick>>
<<else>>
<<SetAnalPick _cog $player.gender()>>
<<set $guardVideo = _pick>>
<</if>>
<</widget>>
/* One authority for a forced step down the body system.
Two rules live here so no scene has to remember them separately.
First, the toggle is re-checked at the point of use, not only at the door.
The cornered scenes are MANDATORY - prisonMandatoryScenePassage() walks the
player back into them off $prison.sceneAuthority - so the content setting can
move between walking into the blind and clicking the choice, exactly like the
incident dispatcher already assumes for its own draw-to-click window.
Second, callers snapshot $player.gender() BEFORE calling this and drive both
the clip pick and the prose off that snapshot. applyFeminizationStage swaps
the penis for a vagina on the stage-6 step, so reading the body afterwards
makes a scene play a female-bottom clip for a change it is only now causing. */
<<widget "PrisonCoerceBody">>
<<if $gameSettings.contentFilter.PlayerFeminization == true and $player.gender() isnot "Female">>
<<run applyFeminizationStage($player, 1)>>
<</if>>
<</widget>>
/* One authority for taking the winner's due off a con you just beat. Every gate
is re-checked here because the button that calls it was rendered a click ago.
The scene state lives on $prison.fight, so the two scene passages can render
the clips in their own body - a video inside a click handler never plays. */
<<widget "PrisonTakeFightSpoils">>
<<set _spAct = (_args[0] is "oral") ? "oral" : ((_args[0] is "cunt") ? "cunt" : "anal")>>
<<set _spFight = $prison ? $prison.fight : null>>
<<set _spTarget = (_spFight and $prisonRoster) ? getInmate($prisonRoster, _spFight.targetId) : null>>
/* The cunt act needs a winner who has one; anything else falls back to the ass. */
<<if _spAct is "cunt" and not canTakeCuntFightSpoils($player.gender())>><<set _spAct = "anal">><</if>>
<<if not _spFight or not _spTarget or _spFight.spoilsAct or $prison.spoilsToday or $gameSettings.contentFilter.nonConsent isnot true or not CheckContentFilter(_spTarget.gender, $player) or not canTakePrisonFightSpoils(_spTarget) or prisonPlayerActiveSexBlocked($player, $playerlock)>>
<<goto "Prison_FightWon">>
<<else>>
<<set $prison.spoilsToday = true>>
<<set _spGender = $player.gender()>>
<<set _spFight.spoilsAct = _spAct>>
<<set _spFight.spoilsVideo = prisonFightSpoilsVideo(_spTarget, _spAct, _spGender, null)>>
<<set _spFight.spoilsLine = prisonFightSpoilsOpening(_spTarget, _spAct, _spGender)>>
/* No cock, no climax beat: the strap and cunt scenes close on their own
final beat instead of a placement choice. */
<<set _spFight.spoilsEndLine = (playerCumsInFightSpoils(_spGender) and _spAct isnot "cunt") ? "" : prisonFightSpoilsWithdraw(_spTarget, _spAct, _spGender)>>
<<set _spOut = applyPrisonFightSpoils(_spTarget, _spAct)>>
<<set _spFight.spoilsSummary = _spOut.summary>>
<<set $prison.rep = Math.max(0, Math.min(100, ($prison.rep || 0) + _spOut.repDelta))>>
<<set $prison.heat = Math.max(0, Math.min(100, ($prison.heat || 0) + _spOut.heatDelta))>>
<<SetCharProgression $player "dominance" 2 true>>
<<SetCharProgression $player "corruption" 1 true>>
<<SpendTime 15>>
<<goto "Prison_FightSpoils">>
<</if>>
<</widget>>
/* Second beat of the same scene. Placement is only ever reachable for a player
who has a cock, so the climax clip and prose stay anatomy-correct. */
<<widget "PrisonFinishFightSpoils">>
<<set _spPlacement = (_args[0] is "inside") ? "inside" : "outside">>
<<set _spFight = $prison ? $prison.fight : null>>
<<set _spTarget = (_spFight and $prisonRoster) ? getInmate($prisonRoster, _spFight.targetId) : null>>
<<if not _spFight or not _spTarget or not _spFight.spoilsAct or _spFight.spoilsAct is "cunt" or _spFight.spoilsPlacement or not playerCumsInFightSpoils($player.gender()) or not CheckContentFilter(_spTarget.gender, $player)>>
<<goto "Prison_FightWon">>
<<else>>
<<set _spGender = $player.gender()>>
<<set _spFight.spoilsPlacement = _spPlacement>>
<<set _spFight.spoilsCumVideo = prisonFightSpoilsVideo(_spTarget, _spFight.spoilsAct, _spGender, _spPlacement)>>
<<set _spFight.spoilsCumLine = prisonFightSpoilsClimax(_spTarget, _spFight.spoilsAct, _spPlacement, _spGender)>>
<<if _spTarget.stats and _spPlacement is "inside">><<set _spTarget.stats.shame = Math.min(100, (_spTarget.stats.shame || 0) + 4)>><</if>>
<<SpendTime 5>>
<<goto "Prison_FightSpoilsCum">>
<</if>>
<</widget>>
/* One authority for the post-sleep fork. Personal enemies and a rat jacket feed
a filter-safe retaliation scene; ordinary sexual threats still require every
relevant content toggle and actor filter. A blocked scene falls through to
the ordinary event roll instead of silently eating the night. */
<<widget "PrisonNormalNightEvent">>
<<set $prison.nightAggressorId = null>>
<<set $prison.sceneAuthority = null>>
<<set _evBlockGender = ($prison.block is "F" ? "Female" : "Male")>>
<<set _evAdult = CheckContentFilter(_evBlockGender, $player)>>
<<set _evNpcPair = CheckContentFilter(_evBlockGender, _evBlockGender)>>
<<set _evParticipantsAdult = prisonAdultSceneAllowed()>>
<<run ensurePrisonDirector($prison)>>
<<set _evDirectorDelta = Math.round($prison.director.lastNudge.eventChanceDelta * 100)>>
/* The act of the bid tilts the day: the opening runs hot because everything is
a first, the middle is the grind, and the short end heats back up. */
<<set _evProg = getSentenceProgress()>>
<<set _evAct = prisonAct(getPrisonStintDay(), _evProg.total)>>
<<set _evChance = Math.max(5, Math.min(95, 45 + _evDirectorDelta + prisonActEventBias(_evAct)))>>
/* Anchors are dates, not probabilities: the whole institution shares them, which
is what lets the tier warn you about one the day before. */
<<set _evAnchor = prisonAnchorFor(getPrisonStintDay())>>
/* The draw reads the bid, not just the content toggles: day, standing, whether
you run the tier or ride with a car, which block houses you, and what has
already fired. A newcomer scene stops addressing a shot-caller in week six. */
<<set _evFilter = {
participantsAdult: _evParticipantsAdult,
adult: _evAdult,
nonConsent: ($gameSettings.contentFilter.nonConsent === true),
npcPair: _evNpcPair,
stintDay: getPrisonStintDay(),
rep: ($prison.rep || 0),
shotCaller: ($prison.shotCaller === true),
gang: (($prison.gang || "") isnot ""),
block: $prison.block,
recentKeys: ($prison.recentEventKeys || []),
seenKeys: ($prison.seenEventKeys || [])
}>>
<<set _ev = _evAnchor ? getPrisonEvent(_evAnchor.key) : pickPrisonEvent(undefined, _evChance, _evFilter)>>
/* An anchored scene the live filters would not allow falls back to the ordinary
roll rather than eating the day. */
<<if _ev and _evAnchor and not prisonEventFits(_ev, _evFilter)>><<set _ev = pickPrisonEvent(undefined, _evChance, _evFilter)>><<set _evAnchor = null>><</if>>
<<if _ev and not canRelease()>>
<<set $prison.event = _ev>>
/* Cast the body once, at draw time, so the scene cannot reroll its partner
on a reload. The men's block is Male AND Shemale; only pairings the
content filter already allows are offered to the resolver. */
<<set _evPartnerAllowed = []>>
<<if CheckContentFilter("Male", $player)>><<run _evPartnerAllowed.push("Male")>><</if>>
<<if CheckContentFilter("Shemale", $player)>><<run _evPartnerAllowed.push("Shemale")>><</if>>
<<set $prison.eventPartnerGender = pickPrisonEventPartnerGender($prison.block, _evPartnerAllowed)>>
<<run recordPrisonEventDraw($prison, _ev.key)>>
<<if _evAnchor>><<set $prisonIncidentMsg = _evAnchor.notice>><</if>>
<<run recordPrisonDirectorEvent($prison, "incident")>>
<<goto "Prison_Event">>
<<else>>
<<goto "Prison_Block">>
<</if>>
<</widget>>
<<widget "PrisonNightRoll">>
<<set _agg = null>>
<<set _sexualThreatEnabled = ($gameSettings.contentFilter.nonConsent === true and $gameSettings.contentFilter.PlayerFeminization == true)>>
<<set _retaliationPending = (hasJacketMark("rat") or prisonHasRetaliationTarget($prisonRoster))>>
<<if (_sexualThreatEnabled or _retaliationPending) and not canRelease() and not $prison.protected and not $prison.inPC and not $prison.shotCaller>>
<<set _pd = ($player.attributes.dominance ? $player.attributes.dominance.value : 5)>>
<<set _agg = pickNightAggressor($prisonRoster, _pd, undefined, ($prison.rep || 0))>>
<</if>>
<<if _agg and (_agg.enemyOfPlayer === true or hasJacketMark("rat"))>>
<<set $prison.nightAggressorId = _agg.id>>
<<set $nightRetaliationMsg = "">>
<<set $prison.sceneAuthority = { scene: "nightRetaliation", stintDay: getPrisonStintDay(), targetId: _agg.id }>>
<<goto "Prison_NightRetaliation">>
<<elseif _agg and _sexualThreatEnabled and CheckContentFilter(_agg.gender, $player)>>
<<set $prison.nightAggressorId = _agg.id>>
<<set $nightThreatMsg = "">>
<<set $nightThreatVideo = "">>
<<set $prison.sceneAuthority = { scene: "nightThreat", stintDay: getPrisonStintDay(), targetId: _agg.id }>>
<<goto "Prison_NightThreat">>
<<else>>
<<PrisonNormalNightEvent>>
<</if>>
<</widget>>
/* Institutional movement schedule. Links are disabled in the map and every
scheduled destination repeats the guard so stale saves/direct links cannot
bypass it. The optional fourth argument names a story variable whose pending
result prose is transferred to the closed-room screen before redirecting. */
<<widget "PrisonRegimeLink">>
<<set _regimeLabel = _args[0]>>
<<set _regimeDest = _args[1]>>
<<set _regimeKind = _args[2]>>
<<set _regimeHours = _args[3]>>
<<set _regimeDay = getPrisonStintDay()>>
<<if passage() isnot _regimeDest>>
<<if prisonRegimeOpen(_regimeKind, $dateTime.hours, _regimeDay)>>
<div class="btn"><<button _regimeLabel _regimeDest>><</button>></div>
<<else>>
<<set _regimeWaitMinutes = minutesUntilPrisonAreaOpens(_regimeKind, $dateTime.hours, $dateTime.minutes, _regimeDay)>>
<<if _regimeWaitMinutes isnot null and _regimeWaitMinutes gt 0>>
<<set _regimeClosedLabel = "Wait until " + _regimeLabel.toLowerCase() + " opens (" + _regimeWaitMinutes + " min)">>
<<capture _regimeWaitMinutes _regimeDest>>
<div class="btn"><<button _regimeClosedLabel>><<SpendTime _regimeWaitMinutes>><<goto _regimeDest>><</button>></div>
<</capture>>
<<else>>
<<set _regimeClosedLabel = _regimeLabel + " - next call " + _regimeHours>>
<div class="btn non-interacting"><<button _regimeClosedLabel>><</button>></div>
<</if>>
<</if>>
<</if>>
<</widget>>
<<widget "PrisonRegimeGuard">>
<<set _regimeKind = _args[0]>>
<<set _regimeName = _args[1]>>
<<set _regimeHours = _args[2]>>
<<set _regimeMessageVar = _args[3]>>
<<set _regimeVideoVar = _args[4]>>
<<set _regimeContentVar = _args[5]>>
<<PrisonPendingMediaGuard _regimeMessageVar _regimeVideoVar _regimeContentVar>>
<<set $prisonScheduleKind = "">>
<<set $prisonScheduleDestination = "">>
<<if not prisonRegimeOpen(_regimeKind, $dateTime.hours, getPrisonStintDay())>>
<<set $prisonScheduleName = _regimeName>>
<<set $prisonScheduleHours = _regimeHours>>
<<set $prisonScheduleKind = _regimeKind>>
<<set $prisonScheduleDestination = passage()>>
<<set $prisonScheduleMessage = "">>
<<set $prisonScheduleVideo = "">>
<<set $prisonScheduleContent = null>>
<<if _regimeMessageVar and State.variables[_regimeMessageVar]>>
<<set $prisonScheduleMessage = State.variables[_regimeMessageVar]>>
<<run State.variables[_regimeMessageVar] = "">>
<<if _regimeVideoVar and State.variables[_regimeVideoVar]>>
<<set $prisonScheduleVideo = State.variables[_regimeVideoVar]>>
<</if>>
<<if _regimeContentVar and State.variables[_regimeContentVar]>>
<<set $prisonScheduleContent = State.variables[_regimeContentVar]>>
<</if>>
<</if>>
/* A video is valid only as the paired payload of a non-empty result. Old
saves may contain orphan media left by the pre-authority guard. Consume
it either way, but never surface it by itself. */
<<if _regimeVideoVar>>
<<run State.variables[_regimeVideoVar] = "">>
<</if>>
<<if _regimeContentVar>>
<<run State.variables[_regimeContentVar] = null>>
<</if>>
<<goto "Prison_ScheduleClosed">>
<</if>>
<</widget>>
<<widget "PrisonPendingMediaGuard">>
<<set _pendingMessageVar = _args[0]>>
<<set _pendingVideoVar = _args[1]>>
<<set _pendingContentVar = _args[2]>>
<<set _pendingHasMessage = (_pendingMessageVar and State.variables[_pendingMessageVar])>>
<<set _pendingHasVideo = (_pendingVideoVar and State.variables[_pendingVideoVar])>>
<<set _pendingContent = _pendingContentVar ? State.variables[_pendingContentVar] : null>>
<<set _pendingAllowed = (not _pendingHasMessage or prisonAdultSceneAllowed())>>
<<if not _pendingHasMessage>>
/* Media and provenance are meaningful only as the envelope of prose. */
<<if _pendingVideoVar>><<run State.variables[_pendingVideoVar] = "">><</if>>
<<if _pendingContentVar>><<run State.variables[_pendingContentVar] = null>><</if>>
<<else>>
<<if _pendingContent>>
<<if _pendingContent.adult is true>>
<<if _pendingContent.observed is true>>
<<set _pendingAllowed = (_pendingAllowed and _pendingContent.actorGender and _pendingContent.partnerGender and CheckContentFilter(_pendingContent.actorGender, _pendingContent.partnerGender))>>
<<else>>
<<set _pendingAllowed = (_pendingAllowed and _pendingContent.partnerGender and CheckContentFilter(_pendingContent.partnerGender, $player))>>
<</if>>
<<if _pendingAllowed and _pendingContent.nonConsent is true and $gameSettings.contentFilter.nonConsent isnot true>>
<<set _pendingAllowed = false>>
<</if>>
<<if _pendingAllowed and _pendingContent.playerFeminization is true and $gameSettings.contentFilter.PlayerFeminization isnot true>>
<<set _pendingAllowed = false>>
<</if>>
<<elseif _pendingContent.adult isnot false>>
/* Malformed provenance is never trusted as safe content. */
<<set _pendingAllowed = false>>
<</if>>
<<elseif _pendingContentVar and _pendingHasVideo>>
/* Provenance-aware channels never trust a media payload whose metadata
was lost. Two-argument legacy callers retain their local validators. */
<<set _pendingAllowed = false>>
<</if>>
<<if not _pendingAllowed>>
<<run State.variables[_pendingMessageVar] = "">>
<<if _pendingVideoVar>><<run State.variables[_pendingVideoVar] = "">><</if>>
<<if _pendingContentVar>><<run State.variables[_pendingContentVar] = null>><</if>>
<</if>>
<</if>>
<</widget>>
<<widget "PrisonAdvanceToMorning">>
<<set _toMorning = (($dateTime.hours < 7 ? 7 - $dateTime.hours : 31 - $dateTime.hours) * 60) - $dateTime.minutes>>
<<SpendTime _toMorning>>
<<RestorePlayerFromSleep>>
<</widget>>
<<widget "PrisonWaitForNextCall">>
<<if $dateTime.hours gte 19 or $dateTime.hours lt 7>>
<div class="btn"><<button "Turn in until morning" "Prison_PassDay">><</button>></div>
<<else>>
<<set _waitMinutes = minutesUntilNextPrisonCall($dateTime.hours, $dateTime.minutes)>>
<<if _waitMinutes isnot null>>
<<set _waitLabel = "Wait until the next movement call (" + _waitMinutes + " min)">>
<<capture _waitMinutes>>
<div class="btn"><<button _waitLabel>><<SpendTime _waitMinutes>><<goto "Prison_Block">><</button>></div>
<</capture>>
<</if>>
<</if>>
<</widget>>
/* Shared quest surface: PC uses the same dispatcher/route markers as general
population, but only Program-line threads survive behind the line. */
<<widget "PrisonQuestThreads">>
<<if not canRelease()>>
<<set _questParticipantsAdult = prisonAdultSceneAllowed()>>
<<set _qctx = buildQuestContext(_questParticipantsAdult and CheckContentFilter(($prison.block is "F" ? "Female" : "Male"), $player), ($gameSettings.contentFilter.nonConsent === true))>>
<<set _qactive = activePrisonQuests()>>
<<set _qavail = availablePrisonQuests(_qctx)>>
<<if $prison.inPC>>
<<set _qactive = prisonFilterQuestLine(_qactive, "program")>>
<<set _qavail = prisonFilterQuestLine(_qavail, "program")>>
<</if>>
<<if _qactive.length gt 0 or _qavail.length gt 0>>
<fieldset>
<legend><<= $prison.inPC ? "Business behind the line" : "Business on the tier">></legend>
<div class="btn-container">
<<for _q range _qactive>>
<<capture _q>>
<<set _clbl = "Return to: " + _q.title>>
<div class="btn"><<button _clbl>><<set $activeQuestId = _q.id>><<goto "Prison_Quest">><</button>></div>
<</capture>>
<</for>>
<<for _q range _qavail>>
<<capture _q>>
<<set _albl = "Hear out: " + _q.title>>
<div class="btn"><<button _albl>><<set $activeQuestId = _q.id>><<run startPrisonQuest(_q.id)>><<goto "Prison_Quest">><</button>></div>
<</capture>>
<</for>>
</div>
</fieldset>
<</if>>
<</if>>
<</widget>>
/* Navigation between the block's common areas (day room / yard / chow / showers).
Omits a button for wherever the player already is. */
<<widget "PrisonNav">>
/* Classification catches up with the player wherever they are standing: a body
that has finished the ladder is not housed with the men, and every prison
location renders this nav, so there is no room to sit out the crossing. */
<<if playerAwaitsWomensBlockTransfer()>>
<<goto "Prison_BlockTransfer">>
<</if>>
<<if prisonBusinessMatchesLocation($prison.business, passage())>>
<<set _locBiz = $prison.business>>
<fieldset class="prison-business-location">
<legend>Business is live here</legend>
<div class="prison-business-location__copy">The blind spot named in your job is in reach. Once you step into it, the handoff starts.</div>
<div class="btn"><<button "Handle the job at this location">>
<<set $businessReturnLocation = passage()>>
<<set $prison.sceneAuthority = { scene: "businessRun", stintDay: getPrisonStintDay(), block: passage() }>>
<<goto "Prison_BusinessRun">>
<</button>></div>
</fieldset>
<</if>>
<fieldset>
<legend>Move</legend>
<div class="btn-container">
<<if passage() isnot "Prison_Block">><div class="btn"><<button "Day room" "Prison_Block">><</button>></div><</if>>
<<PrisonRegimeLink "The yard" "Prison_Yard" "yard" "13:00-16:00">>
<<PrisonRegimeLink "Chow hall" "Prison_Chow" "chow" "07:00, 12:00, 18:00">>
<<if passage() isnot "Prison_Showers">><div class="btn"><<button "Showers" "Prison_Showers">><</button>></div><</if>>
<<if passage() isnot "Prison_RecRoom">><div class="btn"><<button "Rec room" "Prison_RecRoom">><</button>></div><</if>>
<<if passage() isnot "Prison_Dice">><div class="btn"><<button "Dice circle" "Prison_Dice">><</button>></div><</if>>
<<if passage() isnot "Prison_Laundry">><div class="btn"><<button "The laundry" "Prison_Laundry">><</button>></div><</if>>
<<PrisonRegimeLink "Commissary" "Prison_Commissary" "commissary" "16:00-18:00">>
<<if passage() isnot "Prison_Stash">><div class="btn"><<button "The stash" "Prison_Stash">><</button>></div><</if>>
<<if passage() isnot "Prison_GuardStation">><div class="btn"><<button "Guard station" "Prison_GuardStation">><</button>></div><</if>>
<<if passage() isnot "Prison_Infirmary">><div class="btn"><<button "Infirmary" "Prison_Infirmary">><</button>></div><</if>>
<<if passage() isnot "Prison_Chapel">><div class="btn"><<button "The chapel" "Prison_Chapel">><</button>></div><</if>>
<<if passage() isnot "Prison_LawLibrary">><div class="btn"><<button "Law library" "Prison_LawLibrary">><</button>></div><</if>>
<<if $prison.block is "F" and passage() isnot "Prison_Salon">><div class="btn"><<button "The salon" "Prison_Salon">><</button>></div><</if>>
</div>
</fieldset>
<fieldset>
<legend>Movement call</legend>
<div class="btn-container"><<PrisonWaitForNextCall>></div>
</fieldset>
<</widget>>
/* Point-of-no-return warning (doc 22.4). Rendered ABOVE a committing button so the
player is told what closes off BEFORE they choose - it never commits anything
itself. _args[0] is the heading (the move about to be made). Two body forms:
<<QuestForkWarning "heading" "quest_id" "path_key">> - builds the body from
the path's ForkWarning (the common case; all string literals, no footguns);
<<QuestForkWarning "heading" _preBuiltBodyString>> - a body you built with
<<set>> (for a PONR that is not a quest path, e.g. joining a car).
Passing a forkWarningBody(...) call straight as an arg breaks the macro parser -
let the widget build it, or precompute into a temp var first. */
<<widget "QuestForkWarning">>
<<if _args[0]>>
<<if _args[2] isnot undefined>><<set _fwBody = forkWarningBody(_args[1], _args[2])>>
<<else>><<set _fwBody = _args[1] ? _args[1] : "">><</if>>
<div class="prison-fork-warning">
<div class="prison-fork-warning__head"><span class="prison-fork-warning__lock">⚠</span> <span class="prison-fork-warning__title"><<= _args[0]>></span></div>
<div class="prison-fork-warning__note">Point of no return - there is no taking this back this bid.</div>
<<if _fwBody>><div class="prison-fork-warning__body"><<= _fwBody>></div><</if>>
</div>
<</if>>
<</widget>>
/* The player's jacket (doc 22.9): the committed road and its blurb, the yard/staff
standing meters, the marks the block reads the player by, the open quest threads
with their next step and the calls already made, and the closed ones. All markup
is built in TS (prisonJacketHtml) so the widget stays a one-liner. */
<<widget "PrisonJacket">>
<<= prisonJacketHtml()>>
<</widget>><<nobr>>
<<EachLoc>>
<<SaveLocation>>
<<SetBackground "Media/Locations/Other/Villa/Villa.jpg">>
<div class="centre-text">Party House</div>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn-container">
<div class="btn"><<button "Living Room" "PartyHouse_LivingRoom">><</button>></div>
<div class="btn"><<button "Bedroom" "PartyHouse_Bedroom">><</button>></div>
<div class="btn"><<button "Kitchen" "PartyHouse_Kitchen">><</button>></div>
<div class="btn"><<button "Pool Area" "PartyHouse_Pool">><</button>></div>
<<Travel "Leave" "ResidentialArea">>
</div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
</div>
</fieldset>
</div>
<<PeopleAround>>
<</nobr>><<nobr>>
<<EachLoc>>
<<SaveLocation>>
<<SetBackground "Media/Locations/Other/Villa/Villa.jpg">>
<div class="centre-text">Party House - Living Room</div>
<<ChatMessage 'A spacious living room with a huge couch, big screen TV, and plenty of space for activities. Empty beer cans and snacks are scattered around.'>>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn-container">
<div class="btn"><<button "Main Hall" "PartyHouse">><</button>></div>
<div class="btn"><<button "Bedroom" "PartyHouse_Bedroom">><</button>></div>
</div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
<div class="btn"><<button "Watch TV" "PartyHouse_LivingRoom">><<SpendTime 30>><</button>></div>
<div class="btn"><<button "Drink Beer" "PartyHouse_LivingRoom">><<SpendTime 15>><</button>></div>
</div>
</fieldset>
</div>
<<PeopleAround>>
<</nobr>><<nobr>>
<<EachLoc>>
<<SaveLocation>>
<<SetBackground "Media/Locations/Other/Villa/bedroom.jpg">>
<div class="centre-text">Party House - Bedroom</div>
<<ChatMessage 'A large bedroom with a king-size bed that could fit several people. The sheets look freshly changed.'>>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn-container">
<div class="btn"><<button "Main Hall" "PartyHouse">><</button>></div>
<div class="btn"><<button "Bathroom" "PartyHouse_Bathroom">><</button>></div>
</div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
<div class="btn"><<button "Rest" "PartyHouse_Bedroom">><<SpendTime 60>><<run $player.status.energy.increase(20)>><</button>></div>
</div>
</fieldset>
</div>
<<PeopleAround>>
<</nobr>><<nobr>>
<<EachLoc>>
<<SaveLocation>>
<<SetBackground "Media/Locations/College/Restroom/restroom.jpg">>
<div class="centre-text">Party House - Bathroom</div>
<<ChatMessage 'A clean bathroom with a large mirror. Perfect for freshening up after... activities.'>>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn-container">
<div class="btn"><<button "Bedroom" "PartyHouse_Bedroom">><</button>></div>
</div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
<div class="btn"><<button "Clean Up" "PartyHouse_Bathroom">><<SpendTime 15>><</button>></div>
</div>
</fieldset>
</div>
<<PeopleAround>>
<</nobr>><<nobr>>
<<EachLoc>>
<<SaveLocation>>
<<SetBackground "Media/Locations/Other/Diner.jpg">>
<div class="centre-text">Party House - Kitchen</div>
<<ChatMessage 'A well-stocked kitchen with a window overlooking the backyard. The counter is filled with snacks and drinks.'>>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn-container">
<div class="btn"><<button "Main Hall" "PartyHouse">><</button>></div>
<div class="btn"><<button "Pool Area" "PartyHouse_Pool">><</button>></div>
</div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
<div class="btn"><<button "Grab a Snack" "PartyHouse_Kitchen">><<SpendTime 10>><<run $player.status.energy.increase(5)>><</button>></div>
<div class="btn"><<button "Get a Drink" "PartyHouse_Kitchen">><<SpendTime 5>><</button>></div>
</div>
</fieldset>
</div>
<<PeopleAround>>
<</nobr>><<nobr>>
<<EachLoc>>
<<SaveLocation>>
<<SetBackground "Media/Locations/City/Park/Park.jpg">>
<div class="centre-text">Party House - Pool Area</div>
<<ChatMessage 'A beautiful pool area in the backyard. The water sparkles under the lights. Perfect for late-night swimming.'>>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn-container">
<div class="btn"><<button "Kitchen" "PartyHouse_Kitchen">><</button>></div>
<div class="btn"><<button "Main Hall" "PartyHouse">><</button>></div>
</div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
<div class="btn"><<button "Swim" "PartyHouse_Pool">><<SpendTime 30>><<run $player.status.energy.increase(10)>><</button>></div>
<div class="btn"><<button "Relax by the Pool" "PartyHouse_Pool">><<SpendTime 20>><</button>></div>
</div>
</fieldset>
</div>
<<PeopleAround>>
<</nobr>><<nobr>>
<<EachLoc>>
<<SaveLocation>>
<<SetBackground "Media/Locations/Other/Villa/Villa.jpg">>
<div class="centre-text">Villa</div>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn-container">
<div class="btn"><<button "Villa Bedroom" "VillaBedroom">><</button>></div>
<<Travel "Leave" "Campus">>
</div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
</div>
</fieldset>
</div>
<<PeopleAround>>
<</nobr>><<nobr>>
<<EachLoc>>
<<SaveLocation>>
<<SetBackground "Media/Locations/Other/Villa/bedroom.jpg">>
<div class="centre-text">Villa Bedroom</div>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn-container">
<<Travel "Leave" "Campus">>
</div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
</div>
</fieldset>
</div>
<<PeopleAround>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<div class="btn padding-top"><<button "Back" "Villa">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Locations/City/RedLightDistrict/Night Club/NC_Bar.jpg">>
<<timed 0.2s>>
<div class="centre-text">Bar</div>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn"><<button "Dance Floor" "NC_DanceFloor">><</button>></div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
<<if $player.money >= 25>>
<div class="btn"><<button "Drink ($25)" "NC_Bar_Drink">><</button>></div>
<<else>>
<div class="btn non-interacting"><<button "Drink ($25)">><</button>></div>
<</if>>
</div>
</fieldset>
</div>
<<PeopleAround>>
<<RandomEvent "NightClubBar">>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ChatMessage 'You go to the bar and have a shot'>>
<<done>>
<<include "CheckDrunkenness">>
<</done>>
<<set $player.money -= 25>>
<<set $player.status.alcoholIntoxication.increase(Random(8,15))>>
<<SpendTime 15>>
<div class="padding-top">
<div class="btn"><<button "Continue" $player.info.currentLocation>><</button>></div>
</div>
<</nobr>><<nobr>>
<<if $player.status.alcoholIntoxication.value == $player.status.alcoholIntoxication.max>>
<<SpendEnergy $player 20>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Locations/City/RedLightDistrict/Night Club/NC_DanceFloor.jpg">>
<<timed 0.2s>>
<div class="centre-text">Dance Floor</div>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn-container">
<div class="btn"><<button "Bar" "NC_Bar">><</button>></div>
<<if $player.characterEvents.isEventRegistered($player.info.id, "MeetDamian") == false>>
<div class="btn"><<button "VIP Lounge" "VIP_Section_NC">><</button>></div>
<<else>>
<div class="btn"><<button "VIP Lounge" "NC_VIP_Lounge">><</button>></div>
<</if>>
<div class="btn"><<button "Restroom" "NC_Restroom">><</button>></div>
</div>
<div class="btn padding-top"><<button "Leave" "RedLightDistrict">><</button>></div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
<<if $dateTime.hours >= 18 || $dateTime.hours < 6>>
<div class="btn"><<button "Party" "Night_Club_Events">><</button>></div>
<<else>>
<div class="btn non-interacting" id="party-btn"><<button "Party">><</button>></div>
<<done>>
<<run addHoverTooltip('party-btn', 'The parties at the club run from 6 PM to 6 AM')>>
<</done>>
<</if>>
<div class="btn"><<button "Elevator" "Elevator_Door_NC">><</button>></div>
</div>
</fieldset>
</div>
<<PeopleAround>>
<<RandomEvent "NightClubDanceFloor">>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/City/RedLightDistrict/Night Club/Elevator/Elevator_Door.png">>
<<if getQuestState("damian_quest3") == undefined && $player.characterEvents.isEventRegistered($player.info.id, "NightClubElevatorAccess") == false>>
<<Chat $player 'Some kind of weird elevator. Looks like the door opens with a keycard. Maybe the club owner can tell me where it leads - I should talk to him.'>>
<<run _questList = [
{
id: "damian_quest3",
title: "Nightclub elevator",
description: "I came across an elevator in the nightclub. I should find out where it goes.",
state: "active",
questType: "side",
tasks: [
{ description: "Ask the club owner about the elevator", completed: false },
{ description: "Earn 50 nightclub reputation points", completed: false },
{ description: "Go down to the lower level and meet the first-floor manager", completed: false }
],
}
]>>
<<CreateQuest _questList true>>
<<elseif $player.characterEvents.isEventRegistered($player.info.id, "NightClubElevatorAccess") == true>>
<div class="btn padding-top"><<button "Enter" "Elevator_NC">><</button>></div>
<</if>>
<div class="btn padding-top"><<button "Back" "NC_DanceFloor">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/City/RedLightDistrict/Night Club/Elevator/Elevator.png">>
<div class="btn padding-top"><<button "1st floor" "Elevator_Basement_1_NC">><</button>></div>
<div class="btn padding-top"><<button "Back" "NC_DanceFloor">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/City/RedLightDistrict/Night Club/Elevator/Elevator_basement.png">>
<div class="centre-text">1st level basement</div>
<div class="btn padding-top"><<button "Back" "Elevator_NC">><</button>></div>
<div style="padding-top: 15px;" class="characters-grid" id="character-grid"></div>
<<if getTaskState("damian_quest3", "Go down to the lower level and meet the first-floor manager") != 'completed' &&
getTaskState("damian_quest3", "Earn 50 nightclub reputation points") == 'completed'>>
<<done>><<LocationEvent '1st floor manager' 'DamianQuest3_1stFloorManager_NC_Finish' "transition" "Media\\Characters\\QuestChars\\Other\\NC_Basement_FloorManager_1.png" "npc-card" "Floor manager">><</done>>
<<elseif getTaskState("damian_quest3", "Go down to the lower level and meet the first-floor manager") == 'completed'>>
<<done>><<LocationEvent '1st floor manager' 'Elevator_Basement_1_FloorManager_NC' "transition" "Media\\Characters\\QuestChars\\Other\\NC_Basement_FloorManager_1.png" "npc-card" "Floor manager">><</done>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<DrawImage 'Media\\Characters\\QuestChars\\Other\\NC_Basement_FloorManager_1.png'>>
<<if $dateTime.hours >= 8 && $dateTime.hours < 22 && $player.money >= 1000>>
<div class="btn padding-top"><<button "Sex Battle ($1000)" "Elevator_Basement_1_TestSexFight_Choose">>
<</button>></div>
<<else>>
<div class="btn padding-top non-interacting"><<button "Sex Battle ($1000)" "Elevator_Basement_1_TestSexFight_Choose">><</button>></div>
<</if>>
<div class="btn padding-top"><<button "Leave" "Elevator_Basement_1_NC">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<DrawImage 'Media\\Characters\\QuestChars\\Other\\NC_Basement_FloorManager_1.png'>>
<<ChatWithoutNPC '1st floor manager' 'Media\\Characters\\QuestChars\\Other\\NC_Basement_FloorManager_1.png' 'Hey there, I haven’t seen you around before - you must be new. Let me fill you in on the vibe. This elevator takes you to different floors where Damian’s VIP guests can live out their wildest fantasies. Here on this floor, we host sex battles. The rules are simple: players place their bets, then the battle kicks off. First one to climax loses. We run tournaments every Saturday from 8 a.m. to 10 p.m., and trust me, it’s a hot time. Wanna join the fun? Just swing by during those hours, find me here, and I’ll get you signed up for the next round.'>>
<<run completeTaskByQuestID("damian_quest3", "Go down to the lower level and meet the first-floor manager")>>
<div class="btn padding-top"><<button "Continue" "Elevator_Basement_1_NC">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ChatMessage 'Choose your opponent.'>>
<div class="btn padding-top"><<button "Female opponent" "Elevator_Basement_1_TestSexFight_Start">><<set $opponentGender = "Female">><</button>></div>
<div class="btn padding-top"><<button "Male opponent" "Elevator_Basement_1_TestSexFight_Start">><<set $opponentGender = "Male">><</button>></div>
<div class="btn padding-top"><<button "Shemale opponent" "Elevator_Basement_1_TestSexFight_Start">><<set $opponentGender = "Trans">><</button>></div>
<div class="btn padding-top"><<button "Random" "Elevator_Basement_1_TestSexFight_Start">><<run $opponentGender = ["Male", "Female", "Trans"][Random(0,2)]>><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if ($dateTime.hours >= 8 && $dateTime.hours < 22 && $player.money >= 1000) == false>>
<<ChatMessage 'Sex battles run from 8:00 to 22:00 and require a $1,000 stake.'>>
<div class="btn padding-top"><<button "Back" "Elevator_Basement_1_FloorManager_NC">><</button>></div>
<<else>>
<<include "CharactersData">>
<<run _character = CreateCharacter({
isPlayer: false,
characterWork: "None",
gender: $opponentGender,
sexualPreference: "Bi",
age: Random(18,30),
}, true)>>
<<unset $maleNames $femaleNames $surnames>>
<<set $indexNPC = $Characters.indexOf(_character)>>
<<set $interactionNpc = $Characters[$indexNPC]>>
<<set _battleSetControls = {attack: false, seduce: true, items: false, actions: true}>>
<<StartFight $player $interactionNpc _battleSetControls 'Elevator_Basement_1_TestSexFight_Finish_Win' 'Elevator_Basement_1_TestSexFight_Finish_Loose' "SexFight">>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ChatMessage 'You won and earned $1,000.'>>
<<set $player.money += 1000>>
<<DeleteCharacter $interactionNpc>>
<div class="btn padding-top"><<button "Continue" "Elevator_Basement_1_NC">><<set $canShowStatsBtn = true>><<set $gameSettings.allowSaves = true>><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ChatMessage 'You lost and forfeited $1,000.'>>
<<set $player.money = Math.max(0, $player.money - 1000)>>
<<DeleteCharacter $interactionNpc>>
<div class="btn padding-top"><<button "Continue" "Elevator_Basement_1_NC">><<set $canShowStatsBtn = true>><<set $gameSettings.allowSaves = true>><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Locations/City/RedLightDistrict/Night Club/NC_Restroom.jpg">>
<<timed 0.2s>>
<div class="centre-text">Restroom</div>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn"><<button "Dance Floor" "NC_DanceFloor">><</button>></div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
</div>
</fieldset>
</div>
<<PeopleAround>>
<<RandomEvent "NightClubRestroom">>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Locations/City/RedLightDistrict/Night Club/NC_VIP.jpg">>
<<timed 0.2s>>
<div class="centre-text">VIP Lounge</div>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn"><<button "Dance Floor" "NC_DanceFloor">><</button>></div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
</div>
</fieldset>
</div>
<<PeopleAround>>
<<if $player.attributes && $player.attributes.corruption && $player.attributes.corruption.value >= 50 && ($dateTime.hours >= 22 || $dateTime.hours < 5) && !$player.dailyEvents.isEventRegistered($player.info.id, "NC_VIP_Lounge_PrivateShow")>>
<<LocationEvent 'Take a booth' 'NC_VIP_Lounge_PrivateShow' "transition" "Media\\Other\\Notice_Event.png">>
<</if>>
<</timed>>
<</nobr>><<nobr>>
<<EachLoc>>
<<SaveLocation>>
<<SetBackground "Media/Locations/City/RedLightDistrict/Basement.jpg">>
<<timed 0.2s>>
<<set $canShowStatsBtn = true>>
<<set $gameSettings.allowSaves = true>>
<<if $player.dailyEvents.isEventRegistered($player.info.id, "BeingFeminizedByPimp") == false>>
<<goto "DailyFeminization_Pimp">>
<<elseif Random(0,100) > 87>>
<<goto "Events_Pimp">>
<<else>>
<div class="centre-text">Your room</div>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn-container">
<div class="btn"><<button "Leave" "BrothelCorridor_Pimp">><</button>></div>
</div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
<<SleepButton>>
</div>
</fieldset>
</div>
<div class="padding-top">
<<set _msgDebt = "Your debt: $" + $playerDebt>>
<<ChatMessage _msgDebt>>
</div>
<</if>>
<</timed>>
<</nobr>><<nobr>>
<<SaveLocation>>
<<SetBackground "Media/Locations/City/RedLightDistrict/Brothel_corridor.jpg">>
<<EachLoc>>
<<timed 0.2s>>
<div class="centre-text">Hooker Rooms</div>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn-container">
<div class="btn"><<button "Your room" "PimpRoom">><</button>></div>
<div class="btn"><<button "Hall" "BrothelHall_Pimp">><</button>></div>
<div class="btn"><<button "Feminization room" "FeminizationRoom_Pimp">><</button>></div>
<div class="btn"><<button "Pimp's room" "PimpRoom_Pimp">><</button>></div>
</div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
</div>
</fieldset>
</div>
<<PeopleAround>>
<</timed>>
<</nobr>><<nobr>>
<<SaveLocation>>
<<SetBackground "Media/Locations/City/RedLightDistrict/Brothel_Hall.jpg">>
<<EachLoc>>
<<timed 0.2s>>
<div class="centre-text">Brothel Hall</div>
<div class="centre-text" style="font-size: 20px;">You can work from 8 AM to 10 PM.</div>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn-container">
<div class="btn"><<button "Hooker Rooms" "BrothelCorridor_Pimp">><</button>></div>
</div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
<<if $dateTime.hours >= 8 && $dateTime.hours < 22>>
<div class="btn"><<button "Start Work" "WorkAsHooker">>
<<include "HookerWordCalculateEarnings">>
<</button>></div>
<<else>>
<div class="btn non-interacting"><<button "Start Work">><</button>></div>
<</if>>
</div>
</fieldset>
</div>
<<PeopleAround>>
<</timed>>
<</nobr>><<nobr>>
<<SaveLocation>>
<<SetBackground "Media/Locations/City/RedLightDistrict/Feminization_room.jpg">>
<<EachLoc>>
<<timed 0.2s>>
<div class="centre-text">Feminization Room</div>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn-container">
<div class="btn"><<button "Leave" "BrothelCorridor_Pimp">><</button>></div>
</div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
<div class="btn"><<button "Paid Feminization" "PimpBrothelFeminization">><</button>></div>
</div>
</fieldset>
</div>
<<PeopleAround>>
<</timed>>
<</nobr>><<nobr>>
<<SaveLocation>>
<<SetBackground "Media/Locations/City/RedLightDistrict/pimp_room.jpg">>
<<EachLoc>>
<<timed 0.2s>>
<div class="centre-text">Pimp's office</div>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn-container">
<div class="btn"><<button "Leave" "BrothelCorridor_Pimp">><</button>></div>
</div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
</div>
</fieldset>
</div>
<<PeopleAround>>
<</timed>>
<</nobr>>/* Advanced Brothel Features: Worker Personalities, VIP Clients, Special Events */
/* ═══════════════════════════════════════════════════════════
WORKER PERSONALITY SYSTEM
═══════════════════════════════════════════════════════════ */
/* Personality types and their effects */
<<widget "GetWorkerPersonality">>
<<nobr>>
<<set _args[0].saveData.set("personality", _args[0].saveData.get("personality") ?? setup.assignWorkerPersonality())>>
<<set _result = _args[0].saveData.get("personality")>>
<</nobr>>
<</widget>>
<<widget "InitWorkerPersonalities">>
<<nobr>>
<<if !setup.workerPersonalities>>
<<set setup.workerPersonalities = {
"Eager": {
name: "Eager",
description: "Enthusiastic and always ready to please",
clientBonus: 1.2,
energyCost: 1.3,
moodRecovery: 1.0,
specialClients: ["Young", "First-timer"],
icon: "😄"
},
"Professional": {
name: "Professional",
description: "Efficient and business-minded",
clientBonus: 1.0,
energyCost: 0.8,
moodRecovery: 1.2,
specialClients: ["Business", "Regular"],
icon: "💼"
},
"Seductive": {
name: "Seductive",
description: "Masters the art of temptation",
clientBonus: 1.4,
energyCost: 1.1,
moodRecovery: 0.9,
specialClients: ["VIP", "Wealthy"],
icon: "😏"
},
"Submissive": {
name: "Submissive",
description: "Enjoys being dominated",
clientBonus: 1.3,
energyCost: 1.2,
moodRecovery: 1.1,
specialClients: ["Dominant", "BDSM"],
icon: "🥺"
},
"Dominant": {
name: "Dominant",
description: "Takes control of every encounter",
clientBonus: 1.3,
energyCost: 1.0,
moodRecovery: 1.3,
specialClients: ["Submissive", "Role-play"],
icon: "👸"
},
"Exotic": {
name: "Exotic",
description: "Mysterious and alluring",
clientBonus: 1.5,
energyCost: 1.0,
moodRecovery: 0.8,
specialClients: ["Tourist", "Adventurous"],
icon: "✨"
},
"Gentle": {
name: "Gentle",
description: "Caring and attentive to needs",
clientBonus: 1.1,
energyCost: 0.9,
moodRecovery: 1.4,
specialClients: ["Shy", "Romantic"],
icon: "💕"
},
"Wild": {
name: "Wild",
description: "Unpredictable and exciting",
clientBonus: 1.4,
energyCost: 1.4,
moodRecovery: 0.7,
specialClients: ["Party", "Group"],
icon: "🔥"
}
}>>
<<set setup.assignWorkerPersonality = function() {
const types = Object.keys(setup.workerPersonalities);
return types[Math.floor(Math.random() * types.length)];
}>>
<</if>>
<</nobr>>
<</widget>>
/* ═══════════════════════════════════════════════════════════
VIP CLIENT SYSTEM
═══════════════════════════════════════════════════════════ */
<<widget "InitVIPSystem">>
<<nobr>>
<<if !$playerBrothel.vipClients>>
<<set $playerBrothel.vipClients = []>>
<<set $playerBrothel.vipUpgrade = false>>
<</if>>
<</nobr>>
<</widget>>
/* VIP Client Types */
<<widget "InitVIPClientTypes">>
<<nobr>>
<<if !setup.vipClientTypes>>
<<set setup.vipClientTypes = {
"Business Tycoon": {
name: "Business Tycoon",
basePayment: 500,
tipRange: [100, 300],
preferences: ["Professional", "Seductive"],
frequency: "weekly",
icon: "💰"
},
"Politician": {
name: "Politician",
basePayment: 800,
tipRange: [200, 500],
preferences: ["Submissive", "Gentle"],
frequency: "monthly",
requiresPrivacy: true,
icon: "🏛️"
},
"Celebrity": {
name: "Celebrity",
basePayment: 1000,
tipRange: [300, 800],
preferences: ["Seductive", "Exotic"],
frequency: "monthly",
requiresPrivacy: true,
reputationBonus: 10,
icon: "⭐"
},
"Foreign Diplomat": {
name: "Foreign Diplomat",
basePayment: 1200,
tipRange: [400, 1000],
preferences: ["Exotic", "Professional"],
frequency: "rare",
requiresPrivacy: true,
icon: "🌍"
},
"Wealthy Collector": {
name: "Wealthy Collector",
basePayment: 600,
tipRange: [150, 400],
preferences: ["Dominant", "Wild"],
frequency: "weekly",
icon: "🎭"
},
"Regular High-Roller": {
name: "Regular High-Roller",
basePayment: 400,
tipRange: [50, 200],
preferences: ["Eager", "Wild"],
frequency: "daily",
loyaltyBonus: true,
icon: "🎰"
}
}>>
<</if>>
<</nobr>>
<</widget>>
/* ═══════════════════════════════════════════════════════════
SPECIAL EVENTS
═══════════════════════════════════════════════════════════ */
/* Police Raid Event */<<nobr>>
<<include "PlayerBrothel_InitCheck">>
<<SetBackground "Media/Locations/City/RedLightDistrict/Brothel/Hall.jpg">>
<div class="centre-text" style="font-size: 22px; color: #f44336; text-shadow: 0 0 15px rgba(244, 67, 54, 0.5);">🚨 POLICE RAID!</div>
<fieldset style="background: linear-gradient(135deg, rgba(244, 67, 54, 0.3) 0%, rgba(33, 33, 33, 0.95) 100%); border: 2px solid #f44336;">
<legend style="color: #ef9a9a;">⚠️ Emergency</legend>
<<ChatMessage "Sirens blare outside! The police are raiding the red light district. They\'re coming to your establishment!">>
<<set _hasBribe = $player.money >= 2000>>
<<set _hasLawyer = $playerBrothel.upgrades && $playerBrothel.upgrades.lawyer == true>>
<<set _hasBackExit = $playerBrothel.upgrades && $playerBrothel.upgrades.backExit == true>>
<div style="margin-top: 15px; padding: 15px; background: rgba(255, 152, 0, 0.2); border-radius: 10px; border: 1px solid #ff9800;">
<p style="color: #ffcc80;">The police are at your door. You have seconds to decide!</p>
</div>
<div class="brothel-btn-container" style="margin-top: 15px;">
<<if _hasLawyer>>
<span class="brothel-btn success"><<button "📞 Call your lawyer">>
<<ChatMessage "Your lawyer arrives quickly and handles everything. The police leave without incident, though it costs you $500 in legal fees.">>
<<set $player.money -= 500>>
<<goto "PlayerBrothel_Main">>
<</button>></span>
<</if>>
<<if _hasBribe>>
<span class="brothel-btn warning"><<button "💵 Bribe the officers ($2000)">>
<<set _bribeSuccess = Random(1, 100) <= 70>>
<<if _bribeSuccess>>
<<set $player.money -= 2000>>
<<ChatMessage "The officers accept your 'donation' and conveniently find nothing wrong. They leave quietly.">>
<<else>>
<<set $player.money -= 2000>>
<<set $playerBrothel.reputation = Math.max(0, $playerBrothel.reputation - 30)>>
<<ChatMessage "The officers refuse the bribe and arrest several of your workers! Your reputation takes a massive hit.">>
/* Release random workers */
<<set _arrested = Math.min(3, $playerBrothel.prostitutes.length)>>
<<for _i = 0; _i < _arrested; _i++>>
<<run $playerBrothel.prostitutes.pop()>>
<</for>>
<</if>>
<<goto "PlayerBrothel_Main">>
<</button>></span>
<<else>>
<span class="brothel-btn disabled"><<button "💵 Bribe ($2000 - Not enough)">><</button>></span>
<</if>>
<<if _hasBackExit>>
<span class="brothel-btn neutral"><<button "🚪 Evacuate through back exit">>
<<ChatMessage "Everyone escapes through the back exit. The police find an empty building. Operations are suspended for the day, but no one was caught.">>
<<set $playerBrothel.closedToday = true>>
<<goto "PlayerBrothel_Main">>
<</button>></span>
<</if>>
<span class="brothel-btn danger"><<button "😰 Accept the raid">>
<<set _fine = Random(1000, 3000)>>
<<set $player.money = Math.max(0, $player.money - _fine)>>
<<set $playerBrothel.reputation = Math.max(0, $playerBrothel.reputation - 20)>>
<<set _fineMsg = "The police search the premises and issue a fine of $" + _fine + ". Your reputation suffers.">>
<<ChatMessage _fineMsg>>
<<goto "PlayerBrothel_Main">>
<</button>></span>
</div>
</fieldset>
<</nobr>>
/* Health Inspection Event */<<nobr>>
<<include "PlayerBrothel_InitCheck">>
<<SetBackground "Media/Locations/City/RedLightDistrict/Brothel/Hall.jpg">>
<div class="centre-text" style="font-size: 22px; color: #2196f3; text-shadow: 0 0 15px rgba(33, 150, 243, 0.5);">🏥 Health Inspection</div>
<fieldset style="background: linear-gradient(135deg, rgba(33, 150, 243, 0.2) 0%, rgba(33, 33, 33, 0.95) 100%); border: 2px solid #2196f3;">
<legend style="color: #90caf9;">📋 Official Visit</legend>
<<ChatMessage "A health inspector arrives for a surprise inspection of your establishment.">>
<<set _cleanliness = $playerBrothel.upgrades && $playerBrothel.upgrades.premiumFurniture ? 80 : 50>>
<<set _cleanliness += $playerBrothel.upgrades && $playerBrothel.upgrades.cleaning ? 20 : 0>>
<<set _inspectionRoll = Random(1, 100)>>
<<set _passed = _inspectionRoll <= _cleanliness>>
<<if _passed>>
<<set $playerBrothel.reputation = Math.min(100, $playerBrothel.reputation + 10)>>
<div style="margin-top: 15px; padding: 15px; background: rgba(76, 175, 80, 0.2); border-radius: 10px; border: 1px solid #4CAF50;">
<p style="color: #81c784;">✅ Your establishment passes the inspection with flying colors!</p>
<p style="color: #888; font-size: 12px;">+10 Reputation</p>
</div>
<<else>>
<<set _fine = Random(200, 800)>>
<<set $player.money = Math.max(0, $player.money - _fine)>>
<<set $playerBrothel.reputation = Math.max(0, $playerBrothel.reputation - 5)>>
<div style="margin-top: 15px; padding: 15px; background: rgba(244, 67, 54, 0.2); border-radius: 10px; border: 1px solid #f44336;">
<<set _failMsg = "❌ The inspector finds several violations. You are fined $" + _fine + ".">>
<p style="color: #ef9a9a;"><<print _failMsg>></p>
<p style="color: #888; font-size: 12px;">Consider upgrading your facilities.</p>
</div>
<</if>>
<div class="brothel-btn-container" style="margin-top: 15px;">
<span class="brothel-btn neutral"><<button "← Continue" "PlayerBrothel_Main">><</button>></span>
</div>
</fieldset>
<</nobr>>
/* VIP Client Visit */<<nobr>>
<<include "PlayerBrothel_InitCheck">>
<<InitVIPClientTypes>>
<<SetBackground "Media/Locations/City/RedLightDistrict/Brothel/Hall.jpg">>
/* Select random VIP type */
<<set _vipTypes = Object.keys(setup.vipClientTypes)>>
<<set _vipType = _vipTypes[Random(0, _vipTypes.length - 1)]>>
<<set _vipData = setup.vipClientTypes[_vipType]>>
<div class="centre-text" style="font-size: 22px; color: #ffd700; text-shadow: 0 0 15px rgba(255, 215, 0, 0.5);">👑 VIP Arrival</div>
<fieldset style="background: linear-gradient(135deg, rgba(255, 215, 0, 0.2) 0%, rgba(33, 33, 33, 0.95) 100%); border: 2px solid #ffd700;">
<legend style="color: #ffecb3;"><<print _vipData.icon>> <<print _vipData.name>></legend>
<<set _arrivalMsg = "A " + _vipType.toLowerCase() + " has arrived at your establishment, looking for premium entertainment.">>
<<ChatMessage _arrivalMsg>>
<<if $playerBrothel.prostitutes.length > 0>>
<div style="margin-top: 15px; padding: 15px; background: rgba(255, 215, 0, 0.1); border-radius: 10px; border: 1px solid #ffd700;">
<<set _payMsg = "Base payment: $" + _vipData.basePayment + " | Potential tip: $" + _vipData.tipRange[0] + "-$" + _vipData.tipRange[1]>>
<p style="color: #ffecb3;">💰 <<print _payMsg>></p>
<p style="color: #aaa; font-size: 12px;">Preferred workers: <<print _vipData.preferences.join(", ")>></p>
</div>
<div class="brothel-btn-container" style="margin-top: 15px;">
<<set $brothelVIPData = _vipData>>
<span class="brothel-btn success"><<button "🎉 Accept the VIP">>
/* Calculate earnings */
<<set _baseEarning = $brothelVIPData.basePayment>>
<<set _tip = Random($brothelVIPData.tipRange[0], $brothelVIPData.tipRange[1])>>
<<set _total = _baseEarning + _tip>>
<<set $player.money += _total>>
/* Reputation bonus */
<<if $brothelVIPData.reputationBonus>>
<<set $playerBrothel.reputation = Math.min(100, $playerBrothel.reputation + $brothelVIPData.reputationBonus)>>
<</if>>
<<set _earnMsg = "The VIP is satisfied! You earned $" + _total + " (including $" + _tip + " tip).">>
<<ChatMessage _earnMsg>>
<<goto "PlayerBrothel_Main">>
<</button>></span>
<span class="brothel-btn danger"><<button "❌ Turn them away">>
<<set $playerBrothel.reputation = Math.max(0, $playerBrothel.reputation - 5)>>
<<ChatMessage "You turn away the VIP. They leave disappointed, and word spreads about your refusal.">>
<<goto "PlayerBrothel_Main">>
<</button>></span>
</div>
<<else>>
<div style="margin-top: 15px; padding: 15px; background: rgba(244, 67, 54, 0.2); border-radius: 10px; border: 1px solid #f44336;">
<p style="color: #ef9a9a;">⚠️ You have no workers available to serve this VIP!</p>
</div>
<div class="brothel-btn-container" style="margin-top: 15px;">
<span class="brothel-btn danger"><<button "😔 Apologize and send them away">>
<<set $playerBrothel.reputation = Math.max(0, $playerBrothel.reputation - 10)>>
<<ChatMessage "You apologize to the VIP. They leave disappointed. This hurts your reputation significantly.">>
<<goto "PlayerBrothel_Main">>
<</button>></span>
</div>
<</if>>
</fieldset>
<</nobr>>
/* Celebrity Scandal Event */<<nobr>>
<<include "PlayerBrothel_InitCheck">>
<<SetBackground "Media/Locations/City/RedLightDistrict/Brothel/Hall.jpg">>
<div class="centre-text" style="font-size: 22px; color: #e91e63; text-shadow: 0 0 15px rgba(233, 30, 99, 0.5);">📰 Scandal!</div>
<fieldset style="background: linear-gradient(135deg, rgba(233, 30, 99, 0.2) 0%, rgba(33, 33, 33, 0.95) 100%); border: 2px solid #e91e63;">
<legend style="color: #f48fb1;">🔥 Breaking News</legend>
<<ChatMessage "A tabloid reporter has been spotted outside your establishment with a camera! A celebrity client might be inside.">>
<div style="margin-top: 15px; padding: 15px; background: rgba(255, 152, 0, 0.2); border-radius: 10px; border: 1px solid #ff9800;">
<p style="color: #ffcc80;">⚠️ This could be very good or very bad for your business...</p>
</div>
<div class="brothel-btn-container" style="margin-top: 15px;">
<span class="brothel-btn success"><<button "📸 Let them take photos (Publicity)">>
<<set _goodOutcome = Random(1, 100) <= 50>>
<<if _goodOutcome>>
<<set $playerBrothel.reputation = Math.min(100, $playerBrothel.reputation + 25)>>
<<ChatMessage "The news coverage brings massive publicity to your establishment! Your reputation soars.">>
<<else>>
<<set $playerBrothel.reputation = Math.max(0, $playerBrothel.reputation - 15)>>
<<ChatMessage "The scandalous coverage paints your establishment in a negative light. Some clients are scared away.">>
<</if>>
<<goto "PlayerBrothel_Main">>
<</button>></span>
<<if $player.money >= 500>>
<span class="brothel-btn warning"><<button "💵 Bribe the reporter ($500)">>
<<set $player.money -= 500>>
<<ChatMessage "You pay off the reporter. They delete their photos and leave. Crisis averted.">>
<<goto "PlayerBrothel_Main">>
<</button>></span>
<<else>>
<span class="brothel-btn disabled"><<button "💵 Bribe ($500 - Not enough)">><</button>></span>
<</if>>
<span class="brothel-btn danger"><<button "🚫 Chase them away">>
<<set _chaseResult = Random(1, 100)>>
<<if _chaseResult <= 60>>
<<ChatMessage "You manage to chase away the reporter before they get any good shots.">>
<<else>>
<<set $playerBrothel.reputation = Math.max(0, $playerBrothel.reputation - 10)>>
<<ChatMessage "The reporter escapes with photos. The story runs anyway, and it\'s not flattering.">>
<</if>>
<<goto "PlayerBrothel_Main">>
<</button>></span>
</div>
</fieldset>
<</nobr>><<nobr>>
<<include "PlayerBrothel_InitCheck">>
<<include "UpdateAll">>
<div class="centre-text">Casting - Hire New Workers</div>
<<set _currentWorkers = $playerBrothel.prostitutes.length>>
<<set _maxWorkers = $playerBrothel.rooms>>
<<if _currentWorkers >= _maxWorkers>>
<<ChatMessage "All your rooms are occupied! You need to buy more rooms or fire workers to hire new ones.">>
<<set _msg = "Current workers: " + _currentWorkers + "/" + _maxWorkers>>
<<ChatMessage _msg>>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn neutral"><<button "← Back to Office" "PlayerBrothel_Office">><</button>></span>
</div>
<<else>>
<<set _msg = "You can hire " + (_maxWorkers - _currentWorkers) + " more worker(s).">>
<<ChatMessage _msg>>
<<ChatMessage "Interview candidates to learn about them and test their skills.">>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn primary"><<button "💋 View Candidates" "BrothelCasting_ViewCandidates">><</button>></span>
<span class="brothel-btn neutral"><<button "← Back to Office" "PlayerBrothel_Office">><</button>></span>
</div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
/* Generate candidates only if not already generated */
<<if ndef $castingCandidates || $castingCandidates.length == 0>>
<<include "CharactersData">>
<<set $castingCandidates = []>>
<<for _i = 0; _i < 3; _i++>>
<<set _genderRoll = Random(0, 100)>>
<<if _genderRoll < 50>>
<<set _candidateGender = "Female">>
<<elseif _genderRoll < 75>>
<<set _candidateGender = "Trans">>
<<else>>
<<set _candidateGender = "Male">>
<</if>>
/* Generate personality type */
<<set _personalities = ["shy", "confident", "flirty", "desperate", "arrogant", "submissive", "cynical"]>>
<<set _personality = _personalities.random()>>
/* Set appropriate body parameters based on gender */
/* Gender is calculated: femininity = breastSize + buttSize + face */
/* Male: femininity <= 4, Shemale: femininity > 4, Female: has vagina */
<<if _candidateGender == "Male">>
<<set _breastSize = 0>>
<<set _buttSize = Random(0, 1)>>
<<set _faceValue = 0>>
<<set _vaginaSize = 0>>
<<set _penisSize = Random(15, 40)>>
<<set _clothesPref = "men">>
<<elseif _candidateGender == "Trans">>
<<set _breastSize = Random(2, 4)>>
<<set _buttSize = Random(2, 4)>>
<<set _faceValue = Random(4, 7)>>
<<set _vaginaSize = 0>>
<<set _penisSize = Random(10, 35)>>
<<set _clothesPref = "women">>
<<else>>
<<set _breastSize = Random(1, 5)>>
<<set _buttSize = Random(1, 5)>>
<<set _faceValue = Random(3, 8)>>
<<set _vaginaSize = Random(10, 40)>>
<<set _penisSize = 0>>
<<set _clothesPref = "women">>
<</if>>
/* Generate sex skills based on brothel level - higher level = better candidates */
<<set _skillBonus = Math.min(($playerBrothel.level || 1) * 5, 40)>>
<<set _oralSkill = Math.min(Random(10, 40 + _skillBonus), 100)>>
<<set _analSkill = Math.min(Random(5, 30 + _skillBonus), 100)>>
<<if _candidateGender == "Female">>
<<set _vaginalSkill = Math.min(Random(10, 40 + _skillBonus), 100)>>
<<else>>
<<set _vaginalSkill = 0>>
<</if>>
<<set _candidate = CreateCharacter({
isPlayer: false,
characterWork: "Candidate",
gender: _candidateGender,
sexualPreference: "Bi",
clothesPreference: _clothesPref,
age: Random(18, 35),
face: _faceValue,
corruption: Random(1, 10),
breastSize: _breastSize,
buttSize: _buttSize,
throatSize: Random(10, 40),
anusSize: Random(5, 35),
vaginaSize: _vaginaSize,
penisSize: _penisSize,
}, true)>>
/* Store personality in character's saveData */
<<run _candidate.saveData.set("personality", _personality)>>
/* Store sex skills */
<<run _candidate.saveData.set("oralSkill", _oralSkill)>>
<<run _candidate.saveData.set("analSkill", _analSkill)>>
<<run _candidate.saveData.set("vaginalSkill", _vaginalSkill)>>
/* Generate limits based on corruption */
<<set _corruption = _candidate.attributes.corruption.value>>
/* Oral limit - almost everyone allows */
<<if _corruption >= 2>>
<<set _oralLimit = "yes">>
<<set _oralReason = "">>
<<else>>
<<set _oralLimit = "reluctant">>
<<set _oralReason = "Inexperienced">>
<</if>>
/* Vaginal limit */
<<if _candidateGender == "Female">>
<<if _corruption >= 5>>
<<set _vaginalLimit = "yes">>
<<set _vaginalReason = "">>
<<elseif _corruption >= 3>>
<<set _vaginalLimit = "maybe">>
<<set _vaginalReason = "Needs trust">>
<<else>>
<<set _vaginalLimit = "no">>
<<set _vaginalReason = "Not ready">>
<</if>>
<<else>>
<<set _vaginalLimit = "na">>
<<set _vaginalReason = "N/A">>
<</if>>
/* Anal limit */
<<if _corruption >= 7>>
<<set _analLimit = "yes">>
<<set _analReason = "">>
<<elseif _corruption >= 4>>
<<set _analLimit = "maybe">>
<<set _analReason = "Extra charge">>
<<else>>
<<set _analLimit = "no">>
<<set _analReason = "Too painful">>
<</if>>
/* Creampie/Cum inside limit */
<<if _corruption >= 8>>
<<set _creampieLimit = "yes">>
<<set _creampieReason = "">>
<<elseif _corruption >= 5>>
<<set _creampieLimit = "maybe">>
<<set _creampieReason = "With protection">>
<<else>>
<<set _creampieLimit = "no">>
<<set _creampieReason = "Hard limit">>
<</if>>
/* Anilingus (rimjob giving) limit */
<<if _corruption >= 6>>
<<set _anilingusLimit = "yes">>
<<set _anilingusReason = "">>
<<elseif _corruption >= 3>>
<<set _anilingusLimit = "maybe">>
<<set _anilingusReason = "If clean">>
<<else>>
<<set _anilingusLimit = "no">>
<<set _anilingusReason = "Unhygienic">>
<</if>>
/* Cunnilingus (receiving) limit */
<<if _candidateGender == "Female">>
<<if _corruption >= 3>>
<<set _cunnilingusLimit = "yes">>
<<set _cunnilingusReason = "">>
<<else>>
<<set _cunnilingusLimit = "maybe">>
<<set _cunnilingusReason = "Shy">>
<</if>>
<<else>>
<<set _cunnilingusLimit = "na">>
<<set _cunnilingusReason = "N/A">>
<</if>>
/* Golden shower limit */
<<if _corruption >= 9>>
<<set _goldenLimit = "yes">>
<<set _goldenReason = "">>
<<elseif _corruption >= 7>>
<<set _goldenLimit = "maybe">>
<<set _goldenReason = "Extra charge">>
<<else>>
<<set _goldenLimit = "no">>
<<set _goldenReason = "Degrading">>
<</if>>
/* Store all limits */
<<run _candidate.saveData.set("limits", {
oral: { status: _oralLimit, reason: _oralReason },
vaginal: { status: _vaginalLimit, reason: _vaginalReason },
anal: { status: _analLimit, reason: _analReason },
creampie: { status: _creampieLimit, reason: _creampieReason },
anilingus: { status: _anilingusLimit, reason: _anilingusReason },
cunnilingus: { status: _cunnilingusLimit, reason: _cunnilingusReason },
goldenShower: { status: _goldenLimit, reason: _goldenReason }
})>>
/* Generate mood (0-10) - affected by personality */
<<set _baseMood = Random(3, 8)>>
<<if _personality == "Shy">>
<<set _baseMood -= 1>>
<<elseif _personality == "Nervous">>
<<set _baseMood -= 2>>
<<elseif _personality == "Friendly">>
<<set _baseMood += 1>>
<<elseif _personality == "Flirty">>
<<set _baseMood += 2>>
<<elseif _personality == "Confident">>
<<set _baseMood += 1>>
<</if>>
<<set _baseMood = Math.max(0, Math.min(10, _baseMood))>>
<<run _candidate.saveData.set("mood", _baseMood)>>
<<run $castingCandidates.push(_candidate.info.id)>>
<</for>>
<<unset $maleNames $femaleNames $surnames>>
<</if>>
<div class="centre-text" style="font-size: 22px; color: #e91e63; text-shadow: 0 0 10px rgba(233, 30, 99, 0.5);">💋 Available Candidates</div>
<<ChatMessage "Select a candidate to start an interview.">>
<div class="item-shop-container brothel-casting-grid">
<<for _i = 0; _i < $castingCandidates.length; _i++>>
<<set _candId = $castingCandidates[_i]>>
<<set _cand = $Characters.find(c => c.info.id == _candId)>>
<<if _cand>>
<<set _candIcon = _cand.getPhotoImage()>>
<<set _candName = _cand.info.firstName + " " + _cand.info.secondName>>
<<set _candAge = _cand.info.age.value>>
<<set _candGender = _cand.gender()>>
<<set _candFace = _cand.body.face.value>>
<<set _candCorruption = _cand.attributes.corruption.value>>
<<set _candPersonality = _cand.saveData.get("personality")>>
/* Personality display with icon */
<<switch _candPersonality>>
<<case "shy">>
<<set _personalityDisplay = "Shy">>
<<set _personalityColor = "#ff9999">>
<<set _personalityIcon = "🥺">>
<<case "confident">>
<<set _personalityDisplay = "Confident">>
<<set _personalityColor = "#64b5f6">>
<<set _personalityIcon = "😎">>
<<case "flirty">>
<<set _personalityDisplay = "Flirty">>
<<set _personalityColor = "#f48fb1">>
<<set _personalityIcon = "😘">>
<<case "desperate">>
<<set _personalityDisplay = "Desperate">>
<<set _personalityColor = "#ffcc80">>
<<set _personalityIcon = "😰">>
<<case "arrogant">>
<<set _personalityDisplay = "Arrogant">>
<<set _personalityColor = "#b39ddb">>
<<set _personalityIcon = "😤">>
<<case "submissive">>
<<set _personalityDisplay = "Submissive">>
<<set _personalityColor = "#80cbc4">>
<<set _personalityIcon = "🙇">>
<<case "cynical">>
<<set _personalityDisplay = "Cynical">>
<<set _personalityColor = "#b0bec5">>
<<set _personalityIcon = "🙄">>
<<default>>
<<set _personalityDisplay = "Unknown">>
<<set _personalityColor = "#888888">>
<<set _personalityIcon = "❓">>
<</switch>>
/* Gender icon */
<<if _candGender == "Female">>
<<set _genderIcon = "♀️">>
<<set _genderColor = "#f48fb1">>
<<elseif _candGender == "Male">>
<<set _genderIcon = "♂️">>
<<set _genderColor = "#64b5f6">>
<<else>>
<<set _genderIcon = "⚧️">>
<<set _genderColor = "#ce93d8">>
<</if>>
/* Calculate hiring cost based on attractiveness and skills */
<<set _baseCost = 100>>
<<set _faceCost = Math.floor(_candFace * 50)>>
/* Get skills from saveData */
<<set _oralSkill = _cand.saveData.get("oralSkill") || 0>>
<<set _analSkill = _cand.saveData.get("analSkill") || 0>>
<<set _vagSkill = _cand.saveData.get("vaginalSkill") || 0>>
<<set _avgSkill = Math.floor((_oralSkill + _analSkill + _vagSkill) / 3)>>
<<set _skillCost = Math.floor(_avgSkill * 2)>>
/* Get limits and add bonus for more permissive prostitutes */
<<set _limits = _cand.saveData.get("limits")>>
<<set _limitBonus = 0>>
<<if _limits>>
<<if _limits.anal && _limits.anal.status == "yes">><<set _limitBonus += 20>><</if>>
<<if _limits.creampie && _limits.creampie.status == "yes">><<set _limitBonus += 30>><</if>>
<<if _limits.goldenShower && _limits.goldenShower.status == "yes">><<set _limitBonus += 25>><</if>>
<</if>>
<<set _hiringCost = _baseCost + _faceCost + _skillCost + _limitBonus>>
/* Calculate bar widths and styles */
<<set _faceWidth = _candFace * 10>>
<<set _corruptionWidth = _candCorruption * 10>>
<<set _faceBarStyle = "background: linear-gradient(90deg, #e91e63, #f48fb1); width: " + _faceWidth + "%; height: 100%;">>
<<set _corruptionBarStyle = "background: linear-gradient(90deg, #ff5722, #ff9800); width: " + _corruptionWidth + "%; height: 100%;">>
<<set _genderBadgeStyle = "position: absolute; bottom: 0; right: 30%; background: " + _genderColor + "; border-radius: 50%; padding: 3px 6px; font-size: 14px;">>
<<set _personalityBadgeStyle = "background: " + _personalityColor + "33; padding: 3px 10px; border-radius: 12px; font-size: 12px; color: " + _personalityColor + ";">>
<<capture _cand _candIcon _candName _candAge _candGender _candFace _candCorruption _hiringCost _personalityDisplay _personalityColor _personalityIcon _genderIcon _genderColor _faceWidth _corruptionWidth _faceBarStyle _corruptionBarStyle _genderBadgeStyle _personalityBadgeStyle>>
<div class="shop-item brothel-casting-card">
/* Avatar with glow */
<div class="brothel-casting-card__avatar-wrap">
<img @src='_candIcon' alt='Avatar' class="brothel-casting-card__avatar">
<div @style="_genderBadgeStyle"><<print _genderIcon>></div>
</div>
/* Name */
<h3 class="brothel-casting-card__name"><<print _candName>></h3>
/* Age and Personality badge */
<div class="brothel-casting-card__meta">
<span style="background: rgba(255,255,255,0.1); padding: 3px 10px; border-radius: 12px; font-size: 12px; color: #aaa;"><<print _candAge>> y.o.</span>
<span @style="_personalityBadgeStyle"><<print _personalityIcon>> <<print _personalityDisplay>></span>
</div>
/* Stats with progress bars - only visible with Candidate Insight perk */
<<if $playerBrothel.perks && $playerBrothel.perks.seeStats>>
<div class="brothel-casting-card__insight">
<div style="display: flex; justify-content: space-between; font-size: 11px; color: #aaa; margin-bottom: 3px;">
<span data-metric="attractiveness">✨ Attractiveness</span>
<span><<print _candFace>>/10</span>
</div>
<div style="background: rgba(255,255,255,0.1); height: 6px; border-radius: 3px; overflow: hidden;">
<div @style="_faceBarStyle"></div>
</div>
</div>
<div style="margin: 8px 0;">
<div style="display: flex; justify-content: space-between; font-size: 11px; color: #aaa; margin-bottom: 3px;">
<span>🔥 Corruption</span>
<span><<print _candCorruption>>/10</span>
</div>
<div style="background: rgba(255,255,255,0.1); height: 6px; border-radius: 3px; overflow: hidden;">
<div @style="_corruptionBarStyle"></div>
</div>
</div>
<<else>>
<div class="brothel-casting-card__insight brothel-casting-card__insight--hidden">
<div style="color: #888; font-size: 11px;">🔒 Stats Hidden</div>
<div style="color: #666; font-size: 10px; margin-top: 5px;">Learn "Candidate Insight" skill</div>
</div>
<</if>>
/* Price tag */
<div class="brothel-casting-card__price">
<span style="color: #ffd700; font-size: 20px; font-weight: bold;">$<<print _hiringCost>></span>
<div style="color: #aaa; font-size: 10px; margin-top: 3px;">per week</div>
</div>
/* Interview button */
<div class="brothel-casting-card__actions">
<span class="brothel-btn primary small"><<button "💬 INTERVIEW" "BrothelCasting_Interview">>
<<set $selectedCandidate = _cand>>
<<set $candidateHiringCost = _hiringCost>>
<<set $interactionNpc = _cand>>
<<set $indexNPC = $Characters.indexOf(_cand)>>
<</button>></span>
</div>
</div>
<</capture>>
<</if>>
<</for>>
</div>
<div class="brothel-btn-container padding-top">
<<if $player.money >= 50>>
<span class="brothel-btn success"><<button "🔄 Refresh Candidates ($50)" "BrothelCasting_RefreshCandidates">><</button>></span>
<<else>>
<span class="brothel-btn disabled"><<button "🔄 Refresh ($50) - Not enough money">><</button>></span>
<</if>>
<span class="brothel-btn neutral"><<button "← Back" "BrothelCasting_Main">><</button>></span>
</div>
<</nobr>><<nobr>>
/* Remove unsaved candidates from game */
<<if def $castingCandidates>>
<<for _i = 0; _i < $castingCandidates.length; _i++>>
<<set _candId = $castingCandidates[_i]>>
<<set _candIndex = $Characters.findIndex(c => c.info.id == _candId)>>
<<if _candIndex > -1 && !$playerBrothel.prostitutes.includes(_candId)>>
<<run $Characters.splice(_candIndex, 1)>>
<</if>>
<</for>>
<<unset $castingCandidates>>
<</if>>
<</nobr>><<nobr>>
<<if $player.money >= 50>>
<<set $player.money -= 50>>
<<include "BrothelCasting_CleanupCandidates">>
<<goto "BrothelCasting_ViewCandidates">>
<<else>>
<<ChatMessage "Not enough money to refresh candidates. You need $50.">>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn neutral"><<button "← Back" "BrothelCasting_ViewCandidates">><</button>></span>
</div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _candidate = $selectedCandidate>>
<<ShowNpcIcon _candidate>>
<<set _candName = _candidate.info.firstName>>
<<set _candCorruption = _candidate.attributes.corruption.value>>
<<set _personality = _candidate.saveData.get("personality")>>
/* Greeting based on personality */
<<switch _personality>>
<<case "shy">>
<<set _greetings = [
"H-hello... I'm here for the interview. I hope I'm not too nervous...",
"Um... hi. I've never done anything like this before. Please be patient with me.",
"Oh! You must be the boss. I... I'll try my best.",
"*fidgets with hands* Hello... I hope I'm what you're looking for."
]>>
<<case "confident">>
<<set _greetings = [
"Hello. I'm here to discuss the position. I believe I have exactly what you need.",
"Good day. Let's get straight to business - what do you need to know?",
"I've done my research on this establishment. I think we can work well together.",
"Thank you for seeing me. I'm confident I'll exceed your expectations."
]>>
<<case "flirty">>
<<set _greetings = [
"*winks* Well, hello there, boss. I hope you like what you see.",
"Mmm, they didn't tell me the owner was so attractive. This might be more fun than I thought.",
"*licks lips* I'm here for the position... among other things.",
"Hi there, handsome. I've been looking forward to meeting you personally."
]>>
<<case "desperate">>
<<set _greetings = [
"Please, I really need this job. I'll do whatever it takes.",
"Thank you so much for this opportunity. I won't let you down, I promise!",
"I've been looking for work everywhere. Please, just give me a chance.",
"I'll work harder than anyone else here. Just please hire me."
]>>
<<case "arrogant">>
<<set _greetings = [
"Finally. I was wondering when you'd see me. Let's make this quick.",
"You're lucky I even showed up. I had other offers, you know.",
"So, this is your establishment? It's... quaint. I suppose it will do.",
"I'm here because I heard you pay well. Don't waste my time."
]>>
<<case "submissive">>
<<set _greetings = [
"Hello, sir. I'm here to serve in whatever capacity you need.",
"I'll do anything you ask. Just tell me what you want.",
"It's an honor to be considered. I'll follow any instructions you give.",
"I'm yours to command, if you'll have me."
]>>
<<case "cynical">>
<<set _greetings = [
"Another interview, another brothel. Let's see if this one's any different.",
"Look, I know how this works. What do you need to see?",
"I've been in this business long enough. Skip the pleasantries - what's the deal?",
"So, what's your angle? Every place has one."
]>>
<<default>>
<<set _greetings = ["Hello! I'm here for the job interview. What would you like to know?"]>>
<</switch>>
<<Chat _candidate _greetings.random()>>
<<set _mood = _candidate.saveData.get("mood") || 5>>
<div class="centre-text" style="font-size: 14px; padding-top: 10px;">
Interview with _candName
<br><span style="color: #888; font-size: 12px;">Personality: <<print _personality.charAt(0).toUpperCase() + _personality.slice(1)>></span>
</div>
/* Mood display panel */
<<set _moodPercent = _mood * 10>>
<<set _moodColor = _mood >= 7 ? "#4CAF50" : (_mood >= 4 ? "#ffc107" : "#f44336")>>
<fieldset style="background: linear-gradient(135deg, rgba(255, 193, 7, 0.1) 0%, rgba(33, 33, 33, 0.9) 100%); border: 1px solid #ffc107; margin-top: 10px;">
<legend style="color: #ffca28;">😊 Mood</legend>
<div style="padding: 10px;">
<div style="display: flex; align-items: center; gap: 15px;">
/* Mood bar */
<div style="flex-grow: 1;">
<div style="background: rgba(0, 0, 0, 0.3); border-radius: 10px; height: 20px; overflow: hidden; border: 1px solid #555;">
<div @style="'background: linear-gradient(90deg, ' + _moodColor + ' 0%, ' + _moodColor + '88 100%); height: 100%; width: ' + _moodPercent + '%; transition: width 0.3s;'"></div>
</div>
</div>
/* Mood value */
<div @style="'color: ' + _moodColor + '; font-weight: bold; font-size: 16px; min-width: 40px; text-align: right;'">
<<print _mood>>/10
</div>
</div>
/* Mood description */
<div style="margin-top: 8px; font-size: 12px; color: #aaa; text-align: center;">
<<if _mood >= 9>>
<<set _moodDesc = "Very happy and ready for anything!">>
<<elseif _mood >= 7>>
<<set _moodDesc = "In a good mood, open to suggestions">>
<<elseif _mood >= 5>>
<<set _moodDesc = "Neutral mood">>
<<elseif _mood >= 3>>
<<set _moodDesc = "A bit tense">>
<<else>>
<<set _moodDesc = "In a bad mood, skeptical">>
<</if>>
<<print _moodDesc>>
</div>
</div>
</fieldset>
<fieldset class="brothel-fieldset purple">
<legend>Questions</legend>
<div class="brothel-btn-container">
<span class="brothel-btn info"><<button "📖 Tell me about yourself" "BrothelCasting_AskAboutSelf">><</button>></span>
<span class="brothel-btn info"><<button "💼 Ask about experience" "BrothelCasting_AskExperience">><</button>></span>
<span class="brothel-btn info"><<button "❤️ Ask about preferences" "BrothelCasting_AskPreferences">><</button>></span>
<span class="brothel-btn info"><<button "🚫 Ask about limits" "BrothelCasting_AskLimits">><</button>></span>
<span class="brothel-btn info"><<button "💑 Ask about relationships" "BrothelCasting_AskRelationship">><</button>></span>
<span class="brothel-btn secondary"><<button "👀 View Body" "BrothelCasting_ViewBody">><</button>></span>
<<if _mood < 10>>
<span class="brothel-btn primary"><<button "💬 Improve Mood" "BrothelCasting_ImproveMood">><</button>></span>
<<else>>
<span class="brothel-btn disabled" title="Mood is already at maximum"><<button "💬 Improve Mood">><</button>></span>
<</if>>
/* Gift money option */
<<if _mood < 10 && $player.money >= 250>>
<span class="brothel-btn success"><<button "💵 Gift $250 (+1 Mood)" "BrothelCasting_GiftMoney">><</button>></span>
<<elseif _mood >= 10>>
<span class="brothel-btn disabled" title="Mood is already at maximum"><<button "💵 Gift $250 (+1 Mood)">><</button>></span>
<<else>>
<span class="brothel-btn disabled" title="Not enough money ($250 required)"><<button "💵 Gift $250 (+1 Mood)">><</button>></span>
<</if>>
</div>
</fieldset>
<<if _mood >= 8>>
<fieldset class="brothel-fieldset">
<legend>Test Skills</legend>
<<set _playerGender = $player.gender()>>
<<set _hasEnergy = $player.status.energy.value >= 10>>
<<set _hasPotency = $player.status.potency.value >= 1>>
<<set _canTest = _hasEnergy && _hasPotency>>
<<set _candGender = _candidate.gender()>>
<<set _playerHasVagina = $player.body.vaginaSize.value > 0>>
<<if !_canTest>>
<<if !_hasEnergy>>
<p style="color: #ff6666; font-size: 12px; margin: 5px 0;">⚠ You're too tired to conduct physical tests (Energy < 10)</p>
<<elseif !_hasPotency>>
<p style="color: #ff6666; font-size: 12px; margin: 5px 0;">⚠ You're too exhausted for sex (Sex Stamina < 1)</p>
<</if>>
<</if>>
<div class="brothel-btn-container">
/* Oral test - for Male candidates, player gives oral; for others, candidate gives oral */
<<if _candGender == "Male">>
<<if _canTest>>
<span class="brothel-btn primary"><<button "👄 Give Blowjob Test" "BrothelCasting_TestBlowjob">><</button>></span>
<<else>>
<span class="brothel-btn disabled" title="Not enough energy/stamina"><<button "👄 Give Blowjob Test">><</button>></span>
<</if>>
<<else>>
<<if _canTest>>
<span class="brothel-btn primary"><<button "👄 Request Blowjob Test" "BrothelCasting_TestBlowjob">><</button>></span>
<<else>>
<span class="brothel-btn disabled" title="Not enough energy/stamina"><<button "👄 Request Blowjob Test">><</button>></span>
<</if>>
<</if>>
/* Vaginal test - for Female candidates, player fucks them; for Male candidates, player receives (if has vagina) */
<<if _candGender == "Female">>
<<if _canTest>>
<span class="brothel-btn primary"><<button "💕 Request Vaginal Test" "BrothelCasting_TestVaginal">><</button>></span>
<<else>>
<span class="brothel-btn disabled" title="Not enough energy/stamina"><<button "💕 Request Vaginal Test">><</button>></span>
<</if>>
<<elseif _candGender == "Male">>
<<if _playerHasVagina>>
<<if _canTest>>
<span class="brothel-btn primary"><<button "💕 Receive Vaginal Test" "BrothelCasting_TestVaginal_ReceiveFromMale">><</button>></span>
<<else>>
<span class="brothel-btn disabled" title="Not enough energy/stamina"><<button "💕 Receive Vaginal Test">><</button>></span>
<</if>>
<<else>>
<span class="brothel-btn disabled" title="You don't have a vagina"><<button "💕 Vaginal Test (N/A)">><</button>></span>
<</if>>
<<else>>
/* Shemale - no vaginal */
<span class="brothel-btn disabled" title="Not available for this gender"><<button "💕 Vaginal Test (N/A)">><</button>></span>
<</if>>
/* Anal test - for Male candidates, player receives; for others, candidate receives */
<<if _candGender == "Male">>
<<if _canTest>>
<span class="brothel-btn primary"><<button "🍑 Receive Anal Test" "BrothelCasting_TestAnal_ReceiveFromMale">><</button>></span>
<<else>>
<span class="brothel-btn disabled" title="Not enough energy/stamina"><<button "🍑 Receive Anal Test">><</button>></span>
<</if>>
<<else>>
<<if _canTest>>
<span class="brothel-btn primary"><<button "🍑 Request Anal Test" "BrothelCasting_TestAnal">><</button>></span>
<<else>>
<span class="brothel-btn disabled" title="Not enough energy/stamina"><<button "🍑 Request Anal Test">><</button>></span>
<</if>>
<</if>>
</div>
</fieldset>
<<else>>
<fieldset class="brothel-fieldset" style="opacity: 0.7;">
<legend>Test Skills 🔒</legend>
<div style="padding: 15px; text-align: center;">
<div style="color: #ffa726; font-size: 14px; margin-bottom: 10px;">⚠ Skills Testing Unavailable</div>
<div style="color: #888; font-size: 12px;">Candidate's mood is too low for demonstration</div>
<div style="color: #aaa; font-size: 11px; margin-top: 5px;">Current Mood: <<print _mood>>/10 | Required: 8+</div>
<div style="color: #666; font-size: 11px; margin-top: 8px;">Improve their mood with conversation or gifts</div>
</div>
</fieldset>
<</if>>
<fieldset class="brothel-fieldset purple">
<legend>Decision</legend>
<<set _hireBtnText = "✓ Hire ($" + $candidateHiringCost + "/week)">>
<<set _noMoneyBtnText = "Not enough money ($" + $candidateHiringCost + "/week)">>
<<set _canHire = _mood >= 7>>
/* Haggle option - Negotiator perk */
<<set _hasHagglePerk = $playerBrothel.perks && $playerBrothel.perks.haggle>>
<<set _alreadyHaggled = $selectedCandidate.saveData.get("haggled")>>
<<if _hasHagglePerk && !_alreadyHaggled>>
<div style="background: rgba(255, 152, 0, 0.2); padding: 10px; border-radius: 8px; margin-bottom: 10px; border: 1px solid #ff9800;">
<div style="color: #ffc107; font-size: 12px; margin-bottom: 8px;">💬 Negotiator Perk Available</div>
<span class="brothel-btn info small"><<button "Try to haggle (30% off)" "BrothelCasting_Haggle">><</button>></span>
</div>
<<elseif _hasHagglePerk && _alreadyHaggled>>
<div style="background: rgba(100, 100, 100, 0.2); padding: 10px; border-radius: 8px; margin-bottom: 10px; border: 1px solid #666;">
<div style="color: #888; font-size: 12px;">💬 Already attempted negotiation</div>
</div>
<</if>>
<<if !_canHire>>
<div style="background: rgba(255, 152, 0, 0.15); padding: 10px; border-radius: 8px; margin-bottom: 10px; border: 1px solid #ff9800;">
<div style="color: #ffa726; font-size: 12px;">⚠ Candidate's mood is too low to accept your offer (Mood: <<print _mood>>/10, need: 7+)</div>
<div style="color: #888; font-size: 11px; margin-top: 5px;">Improve their mood with conversation or gifts</div>
</div>
<</if>>
<div class="brothel-btn-container">
<<if !_canHire>>
<span class="brothel-btn disabled" title="Mood too low (<<print _mood>>/7)"><<button _hireBtnText>><</button>></span>
<<elseif $player.money >= $candidateHiringCost && $playerBrothel.prostitutes.length < $playerBrothel.rooms>>
<span class="brothel-btn success"><<button _hireBtnText "BrothelCasting_HireComplete">><</button>></span>
<<elseif $playerBrothel.prostitutes.length >= $playerBrothel.rooms>>
<span class="brothel-btn disabled"><<button "No room available">><</button>></span>
<<else>>
<span class="brothel-btn disabled"><<button _noMoneyBtnText>><</button>></span>
<</if>>
<span class="brothel-btn danger"><<button "✗ Reject" "BrothelCasting_Reject">><</button>></span>
<span class="brothel-btn neutral"><<button "← Back to candidates" "BrothelCasting_ViewCandidates">>
<<unset $selectedCandidate $candidateHiringCost>>
<</button>></span>
</div>
</fieldset>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _candidate = $selectedCandidate>>
<<ShowNpcIcon _candidate>>
<<set _candName = _candidate.info.firstName>>
<<set _personality = _candidate.saveData.get("personality")>>
<<set _candAge = _candidate.info.age.value>>
/* Generate backstory if not already generated */
<<if !_candidate.saveData.has("backstory")>>
/* Childhood stories based on personality */
<<switch _personality>>
<<case "shy">>
<<set _childhoodOptions = [
"I grew up in a small town. I was always the quiet kid, never really fit in.",
"My childhood was lonely. I spent most of my time reading books alone in my room.",
"I had a difficult relationship with my parents. They never really understood me.",
"I was bullied a lot growing up. It made me afraid to speak up.",
"My family was poor. We didn't have much, but my grandmother was kind to me."
]>>
<<case "confident">>
<<set _childhoodOptions = [
"I was raised to believe in myself. My parents always supported my ambitions.",
"I grew up competing in sports and academics. I learned early that hard work pays off.",
"My family had high expectations, and I always exceeded them.",
"I was popular in school. People naturally gravitated towards me.",
"My parents were successful business owners. I learned confidence from watching them."
]>>
<<case "flirty">>
<<set _childhoodOptions = [
"I was always a charmer, even as a kid. I knew how to get what I wanted.",
"I grew up with lots of siblings. I learned early how to stand out and get attention.",
"My parents spoiled me. I was their little princess.",
"I discovered my... effect on people pretty early. It made life interesting.",
"I was a cheerleader, prom queen material. Always in the spotlight."
]>>
<<case "desperate">>
<<set _childhoodOptions = [
"I grew up in poverty. We never had enough food on the table.",
"My parents abandoned me when I was young. I bounced between foster homes.",
"We lost everything when I was a kid. My father's business failed.",
"I grew up in a broken home. Violence was normal.",
"I had to work from a young age to help my family survive."
]>>
<<case "arrogant">>
<<set _childhoodOptions = [
"I was born into a wealthy family. We had everything money could buy.",
"I was always the smartest kid in class. Teachers praised me constantly.",
"My parents told me I was special, destined for greatness.",
"I grew up with servants and private tutors. Only the best for me.",
"I was better than everyone else, and I knew it from the start."
]>>
<<case "submissive">>
<<set _childhoodOptions = [
"I grew up in a strict household. Obedience was expected, not requested.",
"My parents were very controlling. I learned to follow rules without question.",
"I was taught that my purpose was to serve others and make them happy.",
"I was a quiet, obedient child. Never caused any trouble.",
"My family had traditional values. Women were expected to be submissive."
]>>
<<case "cynical">>
<<set _childhoodOptions = [
"I learned early that life isn't fair. My parents divorced when I was five.",
"I grew up seeing the worst in people. Trust was never an option.",
"My childhood was fine, I guess. Nothing special either way.",
"I was raised by a single mother who worked three jobs. Reality hit me early.",
"I saw my father's dreams crushed by the system. That teaches you things."
]>>
<<default>>
<<set _childhoodOptions = ["I had a normal childhood. Nothing too exciting."]>>
<</switch>>
/* Teenage years based on personality */
<<switch _personality>>
<<case "shy">>
<<set _teenOptions = [
"In my teens, I discovered I could express myself through art and writing.",
"High school was hard. I barely talked to anyone.",
"I had one close friend who understood me. We're still in touch.",
"I spent my teenage years online, where I felt more comfortable.",
"I developed severe anxiety in my teens. It still affects me."
]>>
<<case "confident">>
<<set _teenOptions = [
"I was captain of the debate team. Learned to argue my point.",
"In high school, I already knew I'd be successful at whatever I chose.",
"I dated a lot but never seriously. I was focused on my future.",
"I started my first business at 16. It failed, but I learned a lot.",
"College was when I really came into my own. Made connections that matter."
]>>
<<case "flirty">>
<<set _teenOptions = [
"I had my first boyfriend at 14. Or girlfriend. I experimented a lot.",
"High school was a blur of parties and first experiences.",
"I was voted 'Most Likely to Break Hearts'. They weren't wrong.",
"I discovered my sexuality early. Let's just say I explored it thoroughly.",
"I was every parent's worst nightmare. But I had so much fun."
]>>
<<case "desperate">>
<<set _teenOptions = [
"I dropped out of school to work full-time. Education was a luxury we couldn't afford.",
"My teenage years were spent surviving, not living.",
"I got into trouble with the wrong crowd. Made mistakes I regret.",
"I ran away from home at 16. The streets were harsh but felt safer.",
"I had to grow up fast. There was no room for being a kid."
]>>
<<case "arrogant">>
<<set _teenOptions = [
"I went to the best private schools. Only associated with the right people.",
"I was already modeling in my teens. Everyone wanted me.",
"College was boring. I was smarter than most of my professors.",
"I traveled the world as a teenager. Most people never see what I've seen.",
"I had everything handed to me. Because I deserved it."
]>>
<<case "submissive">>
<<set _teenOptions = [
"I had my first relationship at 17. They controlled everything. I liked it.",
"I always followed the rules. Never rebelled like other teens.",
"I discovered I enjoyed being told what to do. It felt natural.",
"I dated someone older who taught me my... place. I was grateful.",
"My teens were about learning to serve others better."
]>>
<<case "cynical">>
<<set _teenOptions = [
"I got my first job at 15. Learned quickly that bosses exploit workers.",
"High school politics taught me that people are selfish at their core.",
"I dated someone who cheated. Lost my ability to trust.",
"I watched friends get into drugs and crime. Some didn't make it out.",
"By 18, I'd seen enough to know how the world really works."
]>>
<<default>>
<<set _teenOptions = ["My teenage years were pretty typical."]>>
<</switch>>
/* How they ended up here based on personality */
<<switch _personality>>
<<case "shy">>
<<set _reasonOptions = [
"I needed money and... this seemed like something I could do quietly. Behind closed doors.",
"A friend suggested it. Said I might... come out of my shell.",
"I couldn't find regular work. Too anxious for customer service. This is different somehow.",
"I heard you treat your workers well. I need a safe place.",
"I'm tired of being invisible. Maybe here I can be... wanted."
]>>
<<case "confident">>
<<set _reasonOptions = [
"I analyzed the industry. The earning potential is significant if managed correctly.",
"I'm good at what I do. This is just another skill to monetize.",
"I want to build capital for my real goals. This is a stepping stone.",
"I'm in control here. I decide my worth. That appeals to me.",
"I've always been comfortable with my sexuality. Why not profit from it?"
]>>
<<case "flirty">>
<<set _reasonOptions = [
"I love sex. I love attention. Why not get paid for it?",
"This is basically what I've been doing for free anyway!",
"My last boyfriend said I should just be a prostitute. So here I am. Thanks, jerk.",
"I've always been a natural at... pleasing people. Time to make it official.",
"The nightlife got boring. I need something more... structured. And lucrative."
]>>
<<case "desperate">>
<<set _reasonOptions = [
"I have debts. Bad ones. This is the only way I can pay them off.",
"My family needs money for medical bills. I'll do anything.",
"I was on the streets. This is better than what I was doing before.",
"I have nothing. No education, no skills. This is all I have.",
"Someone threatened my family. I need money. Fast."
]>>
<<case "arrogant">>
<<set _reasonOptions = [
"I lost everything due to circumstances beyond my control. This is temporary.",
"I'm slumming it while I rebuild my empire. Don't get used to me.",
"Rich men want to pay for my company. I'm finally charging what I'm worth.",
"This is research for a book I'm writing. Or a documentary. Something.",
"Let's just say bad investments happened. I'll be back on top soon."
]>>
<<case "submissive">>
<<set _reasonOptions = [
"I was sent here by someone I serve. I do as I'm told.",
"I've always wanted to serve. This is the purest form of that.",
"I need structure. Rules. Someone to tell me what to do. This provides that.",
"My previous master released me. I need a new purpose.",
"I want to belong to someone. Multiple someones. I want to be used."
]>>
<<case "cynical">>
<<set _reasonOptions = [
"Regular jobs don't pay enough. At least this is honest about what it is.",
"I've done worse things for less money. This is just business.",
"Society failed me. Now I play by my own rules.",
"Bills don't pay themselves. Dreams don't come true. But money is real.",
"Everyone sells themselves somehow. I'm just more direct about it."
]>>
<<default>>
<<set _reasonOptions = ["I need the money and this seemed like a good opportunity."]>>
<</switch>>
/* Generate the story */
<<set _childhood = _childhoodOptions.random()>>
<<set _teens = _teenOptions.random()>>
<<set _reason = _reasonOptions.random()>>
/* Add feminization story for shemale/female NPCs */
<<set _feminizationStory = "">>
<<set _wasFeminizedByPlayer = _candidate.saveData.has("feminizedByPlayer") && _candidate.saveData.get("feminizedByPlayer") == true>>
<<if _wasFeminizedByPlayer>>
/* Player feminized this candidate during casting */
<<set _feminizedLevel = _candidate.saveData.get("feminized")>>
<<if _feminizedLevel == "shemale">>
<<switch _personality>>
<<case "shy">>
<<set _feminizationStory = " *blushes deeply* A-and... you know... you convinced me to undergo the transformation. To become a shemale. I was scared at first, but... *touches new breasts* I think it was the right choice. Thank you for believing in me.">>
<<case "confident">>
<<set _feminizationStory = " And as you know, you offered me the chance to transform. I weighed the pros and cons and decided it was a smart career move. The results speak for themselves. Best investment I've made.">>
<<case "flirty">>
<<set _feminizationStory = " *giggles* And then YOU came along and offered to make me even prettier! *bounces* I love my new curves! And I still have my fun parts down there. Win-win, right boss?">>
<<case "desperate">>
<<set _feminizationStory = " A-and you... you gave me a chance to transform. I would have done anything to get this job, and now... *looks at body* I'm actually grateful. This is who I was meant to be. Thank you so much!">>
<<case "arrogant">>
<<set _feminizationStory = " Then you proposed the feminization. I considered it beneath me at first, but I must admit... the results are impressive. I make a stunning shemale. As expected.">>
<<case "submissive">>
<<set _feminizationStory = " And then you, my future master, offered to reshape me. I obeyed without hesitation. You knew what was best for me. *kneeling* This body belongs to you now.">>
<<case "cynical">>
<<set _feminizationStory = " Then you made the feminization offer. I figured, why not? It's just business. New body, new opportunities. At least you were upfront about what you wanted.">>
<<default>>
<<set _feminizationStory = " And then you offered to help me transform. It was a big decision, but I trusted you. Now I'm a shemale, and honestly, it feels right.">>
<</switch>>
<<else>>
/* Full female transformation */
<<switch _personality>>
<<case "shy">>
<<set _feminizationStory = " *voice trembles* And... you helped me become a real woman. Completely. I was so nervous, but... *looks down at body* I finally feel like myself. Thank you for giving me this gift.">>
<<case "confident">>
<<set _feminizationStory = " And you facilitated my complete transformation. I'm now fully female. It was a calculated decision, and I'm satisfied with the outcome. A whole new chapter begins.">>
<<case "flirty">>
<<set _feminizationStory = " *twirls excitedly* And YOU turned me into a real girl! Look at me! *giggles* I can't believe I used to be a man. This is SO much better! Thank you, boss~">>
<<case "desperate">>
<<set _feminizationStory = " You... you gave me a completely new body. A new life. I'm a woman now, fully. I can never repay you for this. I'll work so hard for you!">>
<<case "arrogant">>
<<set _feminizationStory = " Then you offered full feminization. I accepted because I knew I would be exceptional in any form. I was right. I make a magnificent woman.">>
<<case "submissive">>
<<set _feminizationStory = " You remade me entirely. I'm a woman now because you wished it. *bowing* My old self is gone. I exist only to serve you in this new form.">>
<<case "cynical">>
<<set _feminizationStory = " You offered to make me fully female. I thought about it, weighed my options, and agreed. No point in half measures. It's done now, and I'm fine with it.">>
<<default>>
<<set _feminizationStory = " And you helped me become a complete woman. It was a life-changing decision, and I'm grateful you gave me that opportunity.">>
<</switch>>
<</if>>
<<elseif _candidate.gender() == "Shemale">>
/* Original shemale - standard backstory */
<<set _feminizationOptions = [
"I always felt like I was born in the wrong body. When I was 18, I finally started transitioning. Hormones changed everything - my skin, my curves, my whole outlook on life. I kept what makes me special down there though... clients love that.",
"My journey to becoming who I am started young. I knew I was different. After high school, I saved every penny for hormones and surgery. Now I'm the woman I was always meant to be... with a little extra surprise.",
"I was raised as a boy, but I never felt like one. A wealthy patron helped me transition in exchange for... companionship. It was worth it. Now I'm finally comfortable in my skin.",
"The streets taught me that being different can be an advantage. I started hormones when I was 19. The transformation attracted a certain clientele. Now it's my biggest asset.",
"I discovered myself through the underground scene. The hormones, the surgeries... each step brought me closer to who I really am. A woman, yes, but with something extra that many find... irresistible.",
"My ex-boyfriend encouraged me to explore my feminine side. What started as roleplay became my reality. I transitioned fully, except for one part. It's made me very popular in certain circles."
]>>
<<set _feminizationStory = " " + _feminizationOptions.random()>>
<</if>>
<<set _fullStory = _childhood + " " + _teens + _feminizationStory + " And that's how I ended up here. " + _reason>>
<<run _candidate.saveData.set("backstory", _fullStory)>>
<<else>>
<<set _fullStory = _candidate.saveData.get("backstory")>>
<</if>>
/* Add personality-specific intro */
<<switch _personality>>
<<case "shy">>
<<set _intro = ["*looks down nervously* You want to know about me...? Okay... *takes a deep breath*", "*fidgets with hands* My story isn't very interesting... but if you want to hear it...", "*quietly* I don't usually talk about myself... but I'll try..."].random()>>
<<case "confident">>
<<set _intro = ["Of course. My background speaks for itself.", "Happy to share. I have nothing to hide.", "Let me tell you about the person you're about to hire."].random()>>
<<case "flirty">>
<<set _intro = ["*giggles* Ooh, getting personal! I like it.", "*winks* Want to know my secrets? How naughty...", "*playfully* Buy me a drink first! Just kidding. Here's my story..."].random()>>
<<case "desperate">>
<<set _intro = ["*takes a shaky breath* Okay... I'll tell you everything.", "*voice trembling* I have nothing to hide at this point...", "*sniffles* It's not a happy story... but you should know."].random()>>
<<case "arrogant">>
<<set _intro = ["*sighs* Fine. I suppose you need to understand who you're dealing with.", "*smugly* My story is more impressive than most candidates, I assure you.", "Very well. Prepare to be impressed by my background."].random()>>
<<case "submissive">>
<<set _intro = ["Yes, sir. I'll tell you everything about myself.", "*obediently* Whatever you want to know, I'll share.", "*head bowed* My life is an open book for you."].random()>>
<<case "cynical">>
<<set _intro = ["*shrugs* Fine. Though I'm not sure what you're expecting.", "Sure, why not. Here's the sob story.", "*sarcastically* Oh, story time? Alright, gather 'round."].random()>>
<<default>>
<<set _intro = "Sure, I can tell you about myself.">>
<</switch>>
<<Chat _candidate _intro>>
<<Chat _candidate _fullStory>>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn secondary"><<button "→ Continue interview" "BrothelCasting_Interview">><</button>></span>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _candidate = $selectedCandidate>>
<<ShowNpcIcon _candidate>>
<<set _corruption = _candidate.attributes.corruption.value>>
<<set _candName = _candidate.info.firstName>>
<<set _personality = _candidate.saveData.get("personality")>>
/* Experience responses based on personality AND corruption level */
<<switch _personality>>
<<case "shy">>
<<if _corruption >= 8>>
<<set _responses = [
"*blushes deeply* I... I've actually done quite a lot. More than you might think looking at me...",
"People always underestimate me because I'm quiet. But I've learned... many things over the years.",
"*looks away* I'm more experienced than I seem. I just don't like to brag about it..."
]>>
<<elseif _corruption >= 5>>
<<set _responses = [
"I've worked a few places... *fidgets* It was okay, I guess. I learned the basics.",
"Um, I have some experience. Clients usually... they liked how gentle I was.",
"*quietly* I've done this before. Not a lot, but... I know what I'm doing."
]>>
<<elseif _corruption >= 3>>
<<set _responses = [
"I... I've only done this a couple of times. *voice trembles* Is that okay?",
"I'm still learning... *twirls hair nervously* But I really want to get better.",
"Not much, honestly... *looks down* But I'm a fast learner, I promise."
]>>
<<else>>
<<set _responses = [
"*barely audible* This is... this would be my first time doing this kind of work...",
"I've never... *face turns red* I don't have any experience at all. I'm sorry...",
"*voice cracks* I don't know what I'm doing here. I just really need the money..."
]>>
<</if>>
<<case "confident">>
<<if _corruption >= 8>>
<<set _responses = [
"I've worked at three different establishments over the past five years. My client satisfaction rate was exceptional.",
"Let me be direct - I'm a professional. I've mastered every technique you can name and invented a few of my own.",
"Experience? I could write a book. Actually, several books. All bestsellers, if you know what I mean."
]>>
<<elseif _corruption >= 5>>
<<set _responses = [
"I have solid experience. I know what clients want and how to deliver it efficiently.",
"I've been doing this long enough to know my strengths and how to use them.",
"Enough experience to know this is what I'm good at. You won't be disappointed."
]>>
<<elseif _corruption >= 3>>
<<set _responses = [
"I'm newer to the industry, but I learn quickly and apply myself fully.",
"What I lack in experience, I make up for in dedication and professionalism.",
"I may not have years of experience, but I have natural talent and drive."
]>>
<<else>>
<<set _responses = [
"I'm entering this field fresh, but I've done my research and I'm prepared.",
"No prior experience, but everyone starts somewhere. I intend to excel.",
"This is new territory for me, but I approach every challenge with determination."
]>>
<</if>>
<<case "flirty">>
<<if _corruption >= 8>>
<<set _responses = [
"*traces finger down your arm* Mmm, years and years of practice. Want me to show you what I've learned?",
"Let's just say I've made a LOT of people very, very happy. *bites lip* Including myself.",
"Oh honey, I've been in more beds than I can count. And I remember every single trick I picked up."
]>>
<<elseif _corruption >= 5>>
<<set _responses = [
"*winks* I've had my fair share of... adventures. Each one taught me something new.",
"Enough experience to know exactly what I'm doing. *leans closer* Want a demonstration?",
"*giggles* I've been around the block a few times. It's always been... fun."
]>>
<<elseif _corruption >= 3>>
<<set _responses = [
"I'm still exploring... *playful smile* But I've had some very educational encounters.",
"*twirls hair* Not super experienced yet, but I'm a natural. Can't you tell?",
"I'm learning as I go... *touches your hand* Maybe you could teach me more?"
]>>
<<else>>
<<set _responses = [
"*bats eyelashes* I'm practically a virgin in this business. But I'm SO eager to learn...",
"New to this, but... *moves closer* I have a feeling you could show me the ropes?",
"Zero experience... *pouts cutely* But my body was made for this. Don't you think?"
]>>
<</if>>
<<case "desperate">>
<<if _corruption >= 8>>
<<set _responses = [
"I've done everything, I swear! Whatever you need, I can do it. I've been doing this for years!",
"Tons of experience! I worked at the best places until... well, things happened. Please, I need this!",
"I know everything there is to know. Every technique, every trick. Just give me a chance!"
]>>
<<elseif _corruption >= 5>>
<<set _responses = [
"I have experience! Maybe not a lot, but enough! I know what I'm doing, I promise!",
"I've done this before, really! I'll work twice as hard as anyone else!",
"Some experience, yes! And I'll learn anything else you need. Just please consider me!"
]>>
<<elseif _corruption >= 3>>
<<set _responses = [
"I-I don't have much experience, but I'll learn! I'll work so hard, you'll see!",
"Not a lot, but that means I'm trainable! Please, I really need this opportunity!",
"I'm newer to this, but I'll do anything. Literally anything. Just tell me what you need!"
]>>
<<else>>
<<set _responses = [
"None... but please, I'll learn! I have nowhere else to go. I'll do whatever you want!",
"I've never done this before, but I'm desperate! I'll be the best worker you've ever had!",
"No experience at all... *tears welling up* But I'll do anything. Please, just hire me..."
]>>
<</if>>
<<case "arrogant">>
<<if _corruption >= 8>>
<<set _responses = [
"More experience than anyone else you'll interview. I've worked at establishments you couldn't afford to enter.",
"I've been doing this since before it was trendy. Everyone else is an amateur compared to me.",
"My experience? Legendary. Ask anyone in the district. Actually, don't bother - just hire me."
]>>
<<elseif _corruption >= 5>>
<<set _responses = [
"I have adequate experience. More than enough for a place like this, anyway.",
"I've worked at better establishments than this one. I know exactly what I'm doing.",
"Sufficient experience to be overqualified for this position, if I'm honest."
]>>
<<elseif _corruption >= 3>>
<<set _responses = [
"Not much, but I don't need it. Some people are just naturally gifted. I'm one of them.",
"Limited experience, but with my looks and talents, does it really matter?",
"I'm relatively new, but I'm a quick study. Besides, experience is overrated when you have raw talent."
]>>
<<else>>
<<set _responses = [
"None yet. But frankly, someone with my assets doesn't need experience.",
"This is my first time, but I'm already better than most veterans. You'll see.",
"No experience. So what? Look at me. Clients will be fighting over me regardless."
]>>
<</if>>
<<case "submissive">>
<<if _corruption >= 8>>
<<set _responses = [
"I've served many masters before, and I've learned to fulfill any desire they have.",
"Years of experience obeying and pleasing. I exist only to serve, and I've perfected it.",
"I've done everything that's ever been asked of me. Everything. And I'll do the same for you."
]>>
<<elseif _corruption >= 5>>
<<set _responses = [
"I have some experience serving others. I always do exactly as I'm told.",
"I've learned to please and obey. Whatever you need, I will provide.",
"Enough experience to know my place. I'm here to serve, nothing more."
]>>
<<elseif _corruption >= 3>>
<<set _responses = [
"Not much experience yet, but I'm eager to learn. Please teach me how to serve you.",
"I'm still learning, but I want to be useful. I'll do anything you command.",
"Limited experience... but I'm obedient. Just tell me what you want me to do."
]>>
<<else>>
<<set _responses = [
"No experience... but I want to learn to serve. Will you show me how?",
"I've never done this before. Please be patient with me as I learn to please you.",
"None at all... but I'm ready to submit and learn. I'll be whatever you need me to be."
]>>
<</if>>
<<case "cynical">>
<<if _corruption >= 8>>
<<set _responses = [
"Too much experience. I've seen it all, done it all. Nothing surprises me anymore.",
"Years in the business. Multiple establishments, each one the same as the last. At least the money was decent.",
"Extensive experience. I know every trick in the book, and I've seen how this industry really works."
]>>
<<elseif _corruption >= 5>>
<<set _responses = [
"Moderate experience. Enough to know what to expect and not to expect any fairy tales.",
"A few years in the business. Long enough to lose any illusions about it.",
"Some experience. Enough to know that clients are all pretty much the same."
]>>
<<elseif _corruption >= 3>>
<<set _responses = [
"Not much. But it doesn't take long to figure out how this all works.",
"Limited experience. Already enough to see through the glamour to what this really is.",
"Newer to the business. Already jaded though, if you can believe that."
]>>
<<else>>
<<set _responses = [
"None. First time. Probably won't be my last desperate decision, knowing my luck.",
"No experience. Life just has a way of leading you to places you never planned to go.",
"Never done this before. But hey, we all have to pay rent somehow, right?"
]>>
<</if>>
<<default>>
<<if _corruption >= 8>>
<<set _responses = ["I've been doing this for years. I know exactly how to please any client."]>>
<<else>>
<<set _responses = ["I have some experience in this field."]>>
<</if>>
<</switch>>
<<Chat _candidate _responses.random()>>
/* Assessment message based on corruption */
<<if _corruption >= 8>>
<<set _msg = _candName + " is clearly very experienced and knowledgeable.">>
<<ChatMessage _msg>>
<<elseif _corruption >= 5>>
<<set _msg = _candName + " has solid experience in the industry.">>
<<ChatMessage _msg>>
<<elseif _corruption >= 3>>
<<set _msg = _candName + " is somewhat inexperienced but shows potential.">>
<<ChatMessage _msg>>
<<else>>
<<set _msg = _candName + " is a complete novice to this line of work.">>
<<ChatMessage _msg>>
<</if>>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn secondary"><<button "→ Continue interview" "BrothelCasting_Interview">><</button>></span>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _candidate = $selectedCandidate>>
<<ShowNpcIcon _candidate>>
<<set _corruption = _candidate.attributes.corruption.value>>
<<set _sexPref = _candidate.info.sexualPreference>>
<<set _candName = _candidate.info.firstName>>
<<set _personality = _candidate.saveData.get("personality")>>
/* Sexual orientation responses based on personality */
<<switch _personality>>
<<case "shy">>
<<if _sexPref == "Bi">>
<<set _prefResponse = [
"*blushes* I... I like both, actually. Men and women. Is that okay?",
"*quiet voice* I don't really have a preference... both can be nice.",
"Um... I'm open to anyone, really. *looks down* Whatever you need."
].random()>>
<<elseif _sexPref == "Manly">>
<<set _prefResponse = [
"*fidgets* I... I'm more comfortable with men, if that's alright.",
"I prefer male clients... *whispers* they make me feel safer somehow.",
"*quietly* I like men more. Women make me... nervous."
].random()>>
<<else>>
<<set _prefResponse = [
"*mumbles* I prefer women... or feminine people. They're gentler.",
"Is it okay if I mostly see female clients? *nervously* I'm more comfortable with them.",
"*shyly* I feel more at ease with women..."
].random()>>
<</if>>
<<case "confident">>
<<if _sexPref == "Bi">>
<<set _prefResponse = [
"I work equally well with all genders. Versatility is a professional asset.",
"Men, women, doesn't matter. I know how to satisfy anyone.",
"Bisexual and proud of it. It doubles my potential client base."
].random()>>
<<elseif _sexPref == "Manly">>
<<set _prefResponse = [
"I specialize in male clients. I know exactly what men want.",
"Men are my forte. I've studied male psychology extensively.",
"I prefer men - I've perfected my technique for them specifically."
].random()>>
<<else>>
<<set _prefResponse = [
"I prefer women and feminine clients. I excel at understanding their needs.",
"Women are my specialty. The female body holds no mysteries for me.",
"I focus on female clients - that's where my expertise lies."
].random()>>
<</if>>
<<case "flirty">>
<<if _sexPref == "Bi">>
<<set _prefResponse = [
"*giggles* Why choose? I love everyone. The more variety, the more fun!",
"Mmm, I'm an equal opportunity lover. Everyone gets my attention.",
"*winks* Men, women, I adore them all. Twice the pleasure!"
].random()>>
<<elseif _sexPref == "Manly">>
<<set _prefResponse = [
"*licks lips* I just love men. There's something about a strong masculine presence...",
"Give me a handsome man any day. *sighs dreamily* They're so... satisfying.",
"I'm all about the boys. *giggles* Can you blame me? Look at you!"
].random()>>
<<else>>
<<set _prefResponse = [
"Women are so beautiful... *traces own curves* I love exploring feminine bodies.",
"*playfully* There's nothing like a woman's touch. Soft, sensual...",
"I prefer the ladies. We understand each other's needs so well."
].random()>>
<</if>>
<<case "desperate">>
<<if _sexPref == "Bi">>
<<set _prefResponse = [
"I'll work with anyone! Men, women, whoever! I'm not picky at all!",
"Both! Either! I don't care, as long as I can work!",
"I'm fine with everyone! Please, just give me a chance!"
].random()>>
<<elseif _sexPref == "Manly">>
<<set _prefResponse = [
"I prefer men, but I can try with women too if you need that!",
"Men are my preference, but I'm flexible! I'll adapt!",
"I like men best, but I'll do whatever you need me to!"
].random()>>
<<else>>
<<set _prefResponse = [
"Women mostly, but I can learn with men too! Whatever you need!",
"I prefer feminine clients, but I'll work with anyone if you hire me!",
"I'm better with women, but I'll try anything! Please!"
].random()>>
<</if>>
<<case "arrogant">>
<<if _sexPref == "Bi">>
<<set _prefResponse = [
"I grace both men and women with my presence. They're all lucky to have me.",
"Gender is irrelevant. Everyone desires me equally.",
"I don't discriminate - I allow everyone the pleasure of my company."
].random()>>
<<elseif _sexPref == "Manly">>
<<set _prefResponse = [
"I only work with men. Women couldn't handle someone like me anyway.",
"Men only. They pay better and appreciate quality when they see it.",
"I prefer men. They're easier to... impress. If you know what I mean."
].random()>>
<<else>>
<<set _prefResponse = [
"Women and feminine types only. Men are too... simple for my tastes.",
"I prefer sophisticated clientele. Usually women.",
"Ladies only. They have better taste and appreciate true beauty."
].random()>>
<</if>>
<<case "submissive">>
<<if _sexPref == "Bi">>
<<set _prefResponse = [
"I'll serve anyone you assign me to. Your choice is my preference.",
"Either gender is fine. I exist to please whoever you want me to please.",
"Men or women, I submit to all equally. I have no preference of my own."
].random()>>
<<elseif _sexPref == "Manly">>
<<set _prefResponse = [
"I prefer serving men, if that's acceptable. Their dominance... feels natural.",
"Male clients, please. I respond well to masculine authority.",
"I feel most comfortable serving men. They know how to command."
].random()>>
<<else>>
<<set _prefResponse = [
"I prefer serving women. Their touch is gentler but just as commanding.",
"Female clients, if possible. I love being at a woman's service.",
"Women, please. I want to devote myself to their pleasure."
].random()>>
<</if>>
<<case "cynical">>
<<if _sexPref == "Bi">>
<<set _prefResponse = [
"Men, women, doesn't matter. Money's money regardless of who it comes from.",
"Both. They all pay the same and want the same things, more or less.",
"No preference. Everyone's just a client at the end of the day."
].random()>>
<<elseif _sexPref == "Manly">>
<<set _prefResponse = [
"Men. They're quicker and don't expect emotional labor afterwards.",
"I stick to male clients. Simpler transactions, fewer complications.",
"Men only. Less drama, more straightforward."
].random()>>
<<else>>
<<set _prefResponse = [
"Women. At least they tip better and don't get weird afterwards.",
"Female clients. They understand boundaries better, usually.",
"I prefer women. Fewer uncomfortable situations."
].random()>>
<</if>>
<<default>>
<<if _sexPref == "Bi">>
<<set _prefResponse = "I'm comfortable with both men and women.">>
<<elseif _sexPref == "Manly">>
<<set _prefResponse = "I prefer working with men.">>
<<else>>
<<set _prefResponse = "I'm more comfortable with women and feminine partners.">>
<</if>>
<</switch>>
<<Chat _candidate _prefResponse>>
/* Kink level based on personality */
<<switch _personality>>
<<case "shy">>
<<if _corruption >= 7>>
<<set _kinkResponse = [
"*whispers* I... I actually like the kinky stuff. *face turns red* Don't tell anyone...",
"*barely audible* The dirtier the better, honestly... I just can't admit it out loud.",
"*blushing furiously* I have... secret desires. Things I'm embarrassed to talk about."
].random()>>
<<elseif _corruption >= 4>>
<<set _kinkResponse = [
"I can do some things... *fidgets* Just not too extreme, please.",
"*nervously* I'm... adaptable. Within reason.",
"I'll try new things if the client is patient with me..."
].random()>>
<<else>>
<<set _kinkResponse = [
"*shrinks back* Nothing too intense, please. I scare easily.",
"V-vanilla only, if that's okay? Anything else is too much...",
"*timidly* Can we keep things... simple? I'm not ready for more."
].random()>>
<</if>>
<<case "confident">>
<<if _corruption >= 7>>
<<set _kinkResponse = [
"I'm proficient in all areas - vanilla to extreme. Name it, I've mastered it.",
"My repertoire is extensive. No kink is beyond my expertise.",
"I've trained in everything you can imagine and a few things you can't."
].random()>>
<<elseif _corruption >= 4>>
<<set _kinkResponse = [
"I have my specialties, but I maintain professional flexibility.",
"I know what I'm good at and I excel at it. Adaptable within reason.",
"My skill set covers most common requests effectively."
].random()>>
<<else>>
<<set _kinkResponse = [
"I focus on quality over variety. Classic techniques, perfected.",
"I believe in doing a few things exceptionally well.",
"Standard services, delivered at the highest level of quality."
].random()>>
<</if>>
<<case "flirty">>
<<if _corruption >= 7>>
<<set _kinkResponse = [
"*bites lip* Mmm, I'm into EVERYTHING. The kinkier the better, baby.",
"*eyes sparkle* Oh, I have so many fantasies to explore. Wanna hear them?",
"I love trying new things. *moves closer* Want to discover my limits together?"
].random()>>
<<elseif _corruption >= 4>>
<<set _kinkResponse = [
"*playfully* I can be naughty or nice. Depends on the mood...",
"I have my favorites... *winks* but I'm always up for adventure.",
"*giggles* I'm pretty open-minded. Surprise me!"
].random()>>
<<else>>
<<set _kinkResponse = [
"*teasing smile* I like to keep things romantic. Sweet and sensual.",
"I'm more of a lover than a freak, if you know what I mean.",
"*pouts* Nothing too crazy. I prefer making love to... performing."
].random()>>
<</if>>
<<case "desperate">>
<<if _corruption >= 7>>
<<set _kinkResponse = [
"Anything! Everything! I'll do whatever the clients want, no matter what!",
"I have no limits! Nothing is too extreme for me! I'll prove it!",
"I'll do things no one else will! Just please hire me!"
].random()>>
<<elseif _corruption >= 4>>
<<set _kinkResponse = [
"I can do a lot of things! And I'll learn more if you need!",
"I'm flexible! I'll push my boundaries for the right opportunity!",
"Whatever clients want! I'll adapt! I promise!"
].random()>>
<<else>>
<<set _kinkResponse = [
"I'm new to... all this. But I'll try! I'll try anything once!",
"Standard stuff for now, but I can learn! Please give me time!",
"I'll start simple and work my way up! Just give me a chance!"
].random()>>
<</if>>
<<case "arrogant">>
<<if _corruption >= 7>>
<<set _kinkResponse = [
"I excel at everything. Even the extreme stuff. ESPECIALLY the extreme stuff.",
"There's nothing I can't do and nothing I won't do. I'm that good.",
"Kinks? Please. I invented half of them. Ask anyone."
].random()>>
<<elseif _corruption >= 4>>
<<set _kinkResponse = [
"I choose what I do based on my mood. Clients should be grateful for anything.",
"I have my preferences and they should be respected.",
"Standard offerings from me are better than anyone else's best."
].random()>>
<<else>>
<<set _kinkResponse = [
"I don't need tricks or gimmicks. My natural talents are sufficient.",
"Classic services only. Why degrade myself with bizarre requests?",
"I'm not some desperate amateur who needs kinks to attract clients."
].random()>>
<</if>>
<<case "submissive">>
<<if _corruption >= 7>>
<<set _kinkResponse = [
"I'll do anything commanded. Anything. I have no limits when ordered.",
"Use me however you see fit. The more extreme, the better I serve.",
"My body is yours to command. For any purpose. Any."
].random()>>
<<elseif _corruption >= 4>>
<<set _kinkResponse = [
"I obey most requests willingly. Tell me what to do and it's done.",
"I aim to please. Most things... I will submit to.",
"Whatever is asked of me, within reason, I will comply."
].random()>>
<<else>>
<<set _kinkResponse = [
"I follow instructions, but I hope they're gentle ones...",
"I'll obey, but please... don't ask for anything too harsh.",
"I want to please, but I need some... protection from extremes."
].random()>>
<</if>>
<<case "cynical">>
<<if _corruption >= 7>>
<<set _kinkResponse = [
"I've done it all. Seen it all. Nothing shocks me anymore. Might as well profit.",
"Extreme stuff pays better anyway. I stopped caring about 'limits' years ago.",
"Whatever they're paying for. At this point, it's all just... work."
].random()>>
<<elseif _corruption >= 4>>
<<set _kinkResponse = [
"I do what pays. Got a few things I won't touch, but not many.",
"Most things are on the table. As long as the price is right.",
"Flexible enough. Everyone has their price, I know mine."
].random()>>
<<else>>
<<set _kinkResponse = [
"Keeping it simple. Less complicated means less drama.",
"Standard stuff only. Not interested in pretending I enjoy more than that.",
"Basic services. Anything more requires... significant compensation."
].random()>>
<</if>>
<<default>>
<<if _corruption >= 7>>
<<set _kinkResponse = "I'm open to pretty much anything. The kinkier the better.">>
<<elseif _corruption >= 4>>
<<set _kinkResponse = "I have my favorites, but I can adapt to what clients want.">>
<<else>>
<<set _kinkResponse = "I prefer to keep things... vanilla, if possible.">>
<</if>>
<</switch>>
<<Chat _candidate _kinkResponse>>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn secondary"><<button "→ Continue interview" "BrothelCasting_Interview">><</button>></span>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _candidate = $selectedCandidate>>
<<ShowNpcIcon _candidate>>
<<set _candName = _candidate.info.firstName>>
/* Check for Candidate Insight perk */
<<if !$playerBrothel.perks || !$playerBrothel.perks.seeStats>>
<<Chat _candidate "You want to know my limits? I'll tell you what I'm comfortable with...">>
<fieldset style="background: rgba(0,0,0,0.4); border: 2px solid #ff9800; margin: 15px 0;">
<legend style="color: #ff9800;">🔒 Details Hidden</legend>
<div style="text-align: center; padding: 30px;">
<div style="font-size: 48px; margin-bottom: 15px;">🔒</div>
<p style="color: #ff9800; font-size: 16px; font-weight: bold;">Candidate Insight Required</p>
<p style="color: #aaa; font-size: 13px; margin-top: 10px;">
Without the "Candidate Insight" skill, you cannot accurately assess a candidate's limits and preferences.
</p>
<p style="color: #666; font-size: 11px; margin-top: 15px;">
🎯 Skills → Management → Candidate Insight (1 skill point)
</p>
</div>
</fieldset>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn secondary"><<button "→ Continue interview" "BrothelCasting_Interview">><</button>></span>
</div>
<<else>>
<<set _corruption = _candidate.attributes.corruption.value>>
<<set _hasVagina = _candidate.body.vaginaSize.value > 0>>
<<set _personality = _candidate.saveData.get("personality")>>
<<set _limits = _candidate.saveData.get("limits")>>
<<set _msg = "Here are " + _candName + "'s service boundaries:">>
<<ChatMessage _msg>>
/* Limits Panel UI */
<div style="margin: 15px 0; padding: 20px; background: linear-gradient(180deg, rgba(156, 39, 176, 0.15) 0%, rgba(33, 33, 33, 0.95) 100%); border: 2px solid #9c27b0; border-radius: 15px; box-shadow: 0 5px 20px rgba(156, 39, 176, 0.3);">
<div style="text-align: center; margin-bottom: 15px;">
<span style="color: #ce93d8; font-size: 18px; font-weight: bold; text-shadow: 0 0 10px rgba(156, 39, 176, 0.5);">🚫 Service Limits</span>
</div>
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px;">
/* Oral */
<div style="background: rgba(0,0,0,0.3); padding: 10px; border-radius: 8px; border-left: 3px solid <<if _limits && _limits.oral && _limits.oral.status == 'yes'>>#4caf50<<elseif _limits && _limits.oral && _limits.oral.status == 'reluctant'>>#ff9800<<else>>#f44336<</if>>;">
<div style="display: flex; justify-content: space-between; align-items: center;">
<span style="color: #fff; font-size: 13px;">👅 Oral</span>
<<if _limits && _limits.oral>>
<<if _limits.oral.status == "yes">>
<span style="color: #4caf50; font-size: 12px;">✓ Yes</span>
<<elseif _limits.oral.status == "reluctant">>
<span style="color: #ff9800; font-size: 12px;">~ Reluctant</span>
<<else>>
<span style="color: #f44336; font-size: 12px;">✗ No</span>
<</if>>
<<else>>
<span style="color: #888; font-size: 12px;">?</span>
<</if>>
</div>
<<if _limits && _limits.oral && _limits.oral.reason>>
<div style="color: #888; font-size: 10px; margin-top: 3px;">(<<print _limits.oral.reason>>)</div>
<</if>>
</div>
/* Vaginal */
<div style="background: rgba(0,0,0,0.3); padding: 10px; border-radius: 8px; border-left: 3px solid <<if !_hasVagina>>#666<<elseif _limits && _limits.vaginal && _limits.vaginal.status == 'yes'>>#4caf50<<elseif _limits && _limits.vaginal && _limits.vaginal.status == 'maybe'>>#ff9800<<else>>#f44336<</if>>;">
<div style="display: flex; justify-content: space-between; align-items: center;">
<span style="color: #fff; font-size: 13px;">🌸 Vaginal</span>
<<if !_hasVagina>>
<span style="color: #666; font-size: 12px;">- N/A</span>
<<elseif _limits && _limits.vaginal>>
<<if _limits.vaginal.status == "yes">>
<span style="color: #4caf50; font-size: 12px;">✓ Yes</span>
<<elseif _limits.vaginal.status == "maybe">>
<span style="color: #ff9800; font-size: 12px;">~ Maybe</span>
<<else>>
<span style="color: #f44336; font-size: 12px;">✗ No</span>
<</if>>
<<else>>
<span style="color: #888; font-size: 12px;">?</span>
<</if>>
</div>
<<if _hasVagina && _limits && _limits.vaginal && _limits.vaginal.reason>>
<div style="color: #888; font-size: 10px; margin-top: 3px;">(<<print _limits.vaginal.reason>>)</div>
<</if>>
</div>
/* Anal */
<div style="background: rgba(0,0,0,0.3); padding: 10px; border-radius: 8px; border-left: 3px solid <<if _limits && _limits.anal && _limits.anal.status == 'yes'>>#4caf50<<elseif _limits && _limits.anal && _limits.anal.status == 'maybe'>>#ff9800<<else>>#f44336<</if>>;">
<div style="display: flex; justify-content: space-between; align-items: center;">
<span style="color: #fff; font-size: 13px;">🍑 Anal</span>
<<if _limits && _limits.anal>>
<<if _limits.anal.status == "yes">>
<span style="color: #4caf50; font-size: 12px;">✓ Yes</span>
<<elseif _limits.anal.status == "maybe">>
<span style="color: #ff9800; font-size: 12px;">~ Maybe</span>
<<else>>
<span style="color: #f44336; font-size: 12px;">✗ No</span>
<</if>>
<<else>>
<span style="color: #888; font-size: 12px;">?</span>
<</if>>
</div>
<<if _limits && _limits.anal && _limits.anal.reason>>
<div style="color: #888; font-size: 10px; margin-top: 3px;">(<<print _limits.anal.reason>>)</div>
<</if>>
</div>
/* Creampie */
<div style="background: rgba(0,0,0,0.3); padding: 10px; border-radius: 8px; border-left: 3px solid <<if _limits && _limits.creampie && _limits.creampie.status == 'yes'>>#4caf50<<elseif _limits && _limits.creampie && _limits.creampie.status == 'maybe'>>#ff9800<<else>>#f44336<</if>>;">
<div style="display: flex; justify-content: space-between; align-items: center;">
<span style="color: #fff; font-size: 13px;">💦 Cum Inside</span>
<<if _limits && _limits.creampie>>
<<if _limits.creampie.status == "yes">>
<span style="color: #4caf50; font-size: 12px;">✓ Yes</span>
<<elseif _limits.creampie.status == "maybe">>
<span style="color: #ff9800; font-size: 12px;">~ Maybe</span>
<<else>>
<span style="color: #f44336; font-size: 12px;">✗ No</span>
<</if>>
<<else>>
<span style="color: #888; font-size: 12px;">?</span>
<</if>>
</div>
<<if _limits && _limits.creampie && _limits.creampie.reason>>
<div style="color: #888; font-size: 10px; margin-top: 3px;">(<<print _limits.creampie.reason>>)</div>
<</if>>
</div>
/* Anilingus */
<div style="background: rgba(0,0,0,0.3); padding: 10px; border-radius: 8px; border-left: 3px solid <<if _limits && _limits.anilingus && _limits.anilingus.status == 'yes'>>#4caf50<<elseif _limits && _limits.anilingus && _limits.anilingus.status == 'maybe'>>#ff9800<<else>>#f44336<</if>>;">
<div style="display: flex; justify-content: space-between; align-items: center;">
<span style="color: #fff; font-size: 13px;">👅🍑 Anilingus</span>
<<if _limits && _limits.anilingus>>
<<if _limits.anilingus.status == "yes">>
<span style="color: #4caf50; font-size: 12px;">✓ Yes</span>
<<elseif _limits.anilingus.status == "maybe">>
<span style="color: #ff9800; font-size: 12px;">~ Maybe</span>
<<else>>
<span style="color: #f44336; font-size: 12px;">✗ No</span>
<</if>>
<<else>>
<span style="color: #888; font-size: 12px;">?</span>
<</if>>
</div>
<<if _limits && _limits.anilingus && _limits.anilingus.reason>>
<div style="color: #888; font-size: 10px; margin-top: 3px;">(<<print _limits.anilingus.reason>>)</div>
<</if>>
</div>
/* Cunnilingus */
<div style="background: rgba(0,0,0,0.3); padding: 10px; border-radius: 8px; border-left: 3px solid <<if !_hasVagina>>#666<<elseif _limits && _limits.cunnilingus && _limits.cunnilingus.status == 'yes'>>#4caf50<<elseif _limits && _limits.cunnilingus && _limits.cunnilingus.status == 'maybe'>>#ff9800<<else>>#f44336<</if>>;">
<div style="display: flex; justify-content: space-between; align-items: center;">
<span style="color: #fff; font-size: 13px;">👅🌸 Cunnilingus</span>
<<if !_hasVagina>>
<span style="color: #666; font-size: 12px;">- N/A</span>
<<elseif _limits && _limits.cunnilingus>>
<<if _limits.cunnilingus.status == "yes">>
<span style="color: #4caf50; font-size: 12px;">✓ Yes</span>
<<elseif _limits.cunnilingus.status == "maybe">>
<span style="color: #ff9800; font-size: 12px;">~ Maybe</span>
<<else>>
<span style="color: #f44336; font-size: 12px;">✗ No</span>
<</if>>
<<else>>
<span style="color: #888; font-size: 12px;">?</span>
<</if>>
</div>
<<if _hasVagina && _limits && _limits.cunnilingus && _limits.cunnilingus.reason>>
<div style="color: #888; font-size: 10px; margin-top: 3px;">(<<print _limits.cunnilingus.reason>>)</div>
<</if>>
</div>
/* Golden Shower */
<div style="background: rgba(0,0,0,0.3); padding: 10px; border-radius: 8px; border-left: 3px solid <<if _limits && _limits.goldenShower && _limits.goldenShower.status == 'yes'>>#4caf50<<elseif _limits && _limits.goldenShower && _limits.goldenShower.status == 'maybe'>>#ff9800<<else>>#f44336<</if>>; grid-column: span 2;">
<div style="display: flex; justify-content: space-between; align-items: center;">
<span style="color: #fff; font-size: 13px;">🚿 Golden Shower</span>
<<if _limits && _limits.goldenShower>>
<<if _limits.goldenShower.status == "yes">>
<span style="color: #4caf50; font-size: 12px;">✓ Yes</span>
<<elseif _limits.goldenShower.status == "maybe">>
<span style="color: #ff9800; font-size: 12px;">~ Maybe</span>
<<else>>
<span style="color: #f44336; font-size: 12px;">✗ No</span>
<</if>>
<<else>>
<span style="color: #888; font-size: 12px;">?</span>
<</if>>
</div>
<<if _limits && _limits.goldenShower && _limits.goldenShower.reason>>
<div style="color: #888; font-size: 10px; margin-top: 3px;">(<<print _limits.goldenShower.reason>>)</div>
<</if>>
</div>
</div>
/* Income impact summary */
<div style="margin-top: 15px; padding: 10px; background: rgba(255,215,0,0.1); border-radius: 8px; border: 1px solid rgba(255,215,0,0.3);">
<div style="color: #ffd700; font-size: 11px; text-align: center;">
💰 <strong>Income Impact:</strong>
<<set _permissiveCount = 0>>
<<if _limits>>
<<if _limits.anal && _limits.anal.status == "yes">><<set _permissiveCount++>><</if>>
<<if _limits.creampie && _limits.creampie.status == "yes">><<set _permissiveCount++>><</if>>
<<if _limits.goldenShower && _limits.goldenShower.status == "yes">><<set _permissiveCount++>><</if>>
<<if _limits.anilingus && _limits.anilingus.status == "yes">><<set _permissiveCount++>><</if>>
<</if>>
<<if _permissiveCount >= 3>>
<span style="color: #4caf50;">+++ Very High (accepts most services)</span>
<<elseif _permissiveCount >= 2>>
<span style="color: #8bc34a;">++ High (accepts many services)</span>
<<elseif _permissiveCount >= 1>>
<span style="color: #ff9800;">+ Moderate (some restrictions)</span>
<<else>>
<span style="color: #f44336;">Low (many restrictions)</span>
<</if>>
</div>
</div>
</div>
/* Personality-based limit explanation */
<<switch _personality>>
<<case "shy">>
<<if _corruption >= 8>>
<<set _limitResponse = "*whispering* I'll... I'll do anything you want. *blushes deeply*">>
<<elseif _corruption >= 5>>
<<set _limitResponse = "*fidgets* There are a few things I'm not comfortable with...">>
<<else>>
<<set _limitResponse = "*voice trembling* I have a lot of limits, I'm sorry...">>
<</if>>
<<case "confident">>
<<if _corruption >= 8>>
<<set _limitResponse = "No limits to speak of. I've mastered every service.">>
<<elseif _corruption >= 5>>
<<set _limitResponse = "I have clear boundaries, but they're reasonable.">>
<<else>>
<<set _limitResponse = "I have firm boundaries. Quality over quantity.">>
<</if>>
<<case "flirty">>
<<if _corruption >= 8>>
<<set _limitResponse = "*winks* Limits? What are those? I'm up for anything~">>
<<elseif _corruption >= 5>>
<<set _limitResponse = "*playfully* Most things are on the menu...">>
<<else>>
<<set _limitResponse = "*pouts* I'm a romantic at heart. Some things aren't... sexy to me.">>
<</if>>
<<case "desperate">>
<<if _corruption >= 8>>
<<set _limitResponse = "No limits! None! I'll do ANYTHING! Please hire me!">>
<<elseif _corruption >= 5>>
<<set _limitResponse = "Almost no limits! I can work on the rest!">>
<<else>>
<<set _limitResponse = "I have some limits... but I'll try! For the job!">>
<</if>>
<<case "arrogant">>
<<if _corruption >= 8>>
<<set _limitResponse = "I have no limits. But that's because I'm exceptional.">>
<<elseif _corruption >= 5>>
<<set _limitResponse = "My limits are my choice. Clients should be grateful.">>
<<else>>
<<set _limitResponse = "Strict limits. I'm not here to degrade myself.">>
<</if>>
<<case "submissive">>
<<if _corruption >= 8>>
<<set _limitResponse = "I have no limits. I exist to serve. Use me as you see fit.">>
<<elseif _corruption >= 5>>
<<set _limitResponse = "Few limits. I want to obey. Tell me what to do.">>
<<else>>
<<set _limitResponse = "I want to serve, but... I have fears. Please be gentle.">>
<</if>>
<<case "cynical">>
<<if _corruption >= 8>>
<<set _limitResponse = "No limits anymore. Everything has a price.">>
<<elseif _corruption >= 5>>
<<set _limitResponse = "Some limits. Everyone needs a line somewhere.">>
<<else>>
<<set _limitResponse = "Plenty of limits. This is a job, not my life.">>
<</if>>
<<default>>
<<if _corruption >= 8>>
<<set _limitResponse = "I don't really have limits. Whatever pays well.">>
<<elseif _corruption >= 5>>
<<set _limitResponse = "I have a few things I won't do, but I'm fairly flexible.">>
<<else>>
<<set _limitResponse = "I have some strict boundaries. I hope that's okay...">>
<</if>>
<</switch>>
<<Chat _candidate _limitResponse>>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn secondary"><<button "→ Continue interview" "BrothelCasting_Interview">><</button>></span>
</div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _candidate = $selectedCandidate>>
<<ShowNpcIcon _candidate>>
<<set _candName = _candidate.info.firstName>>
<<set _personality = _candidate.saveData.get("personality")>>
/* Generate relationship status randomly if not set */
<<if !_candidate.saveData.has("relationshipStatus")>>
<<set _statusRoll = Random(0, 100)>>
<<if _statusRoll < 50>>
<<set _relStatus = "single">>
<<elseif _statusRoll < 75>>
<<set _relStatus = "dating">>
<<elseif _statusRoll < 90>>
<<set _relStatus = "complicated">>
<<else>>
<<set _relStatus = "married">>
<</if>>
<<run _candidate.saveData.set("relationshipStatus", _relStatus)>>
<<else>>
<<set _relStatus = _candidate.saveData.get("relationshipStatus")>>
<</if>>
<<set _msg = "You ask " + _candName + " about their relationship status...">>
<<ChatMessage _msg>>
/* Relationship responses based on personality AND status */
<<switch _personality>>
<<case "shy">>
<<switch _relStatus>>
<<case "single">>
<<set _relResponse = [
"*blushes* I... I'm single. *looks down* I've never been very good at... relationships.",
"*fidgets* No boyfriend or girlfriend... *quiet voice* I'm too shy to talk to people.",
"*whispers* I'm alone... *sad smile* Maybe that will change someday..."
].random()>>
<<case "dating">>
<<set _relResponse = [
"*nervously* I... I'm seeing someone. *blushes deeply* They don't know I'm here...",
"*fidgets* I have a partner... *looks away* They think I'm at a regular job interview.",
"*anxiously* There's someone... please don't tell them about this place..."
].random()>>
<<case "complicated">>
<<set _relResponse = [
"*sighs quietly* It's... complicated. *tears forming* We're kind of on a break...",
"*sad* I don't know what we are anymore... *voice breaks* Things are confusing.",
"*hesitantly* There's someone, but... *sniffles* I don't know if they still want me."
].random()>>
<<case "married">>
<<set _relResponse = [
"*hides ring finger* I... I'm married. *tearfully* They can't know about this...",
"*whispering* I have a spouse... *voice breaking* We need the money so badly...",
"*crying quietly* I'm married, but... things are hard... please keep it secret..."
].random()>>
<</switch>>
<<case "confident">>
<<switch _relStatus>>
<<case "single">>
<<set _relResponse = [
"Single by choice. Relationships are distracting and I'm focused on my career.",
"No partner currently. I prefer to keep my personal and professional life separate.",
"I'm unattached. It makes this line of work much simpler."
].random()>>
<<case "dating">>
<<set _relResponse = [
"I'm in a relationship. They're aware of my career and supportive of it.",
"I have a partner. We have an open arrangement - it works for both of us.",
"Dating someone, yes. They understand that this is professional, not personal."
].random()>>
<<case "complicated">>
<<set _relResponse = [
"It's complicated. But that's none of my employer's concern.",
"It's complicated, but I'm handling it professionally.",
"There's someone in my life, but we're working through things. It won't affect my work."
].random()>>
<<case "married">>
<<set _relResponse = [
"Married. My spouse is fully aware and we have an understanding.",
"I have a spouse. We're pragmatic about finances and have discussed this.",
"Yes, I'm married. We're adults who made this decision together."
].random()>>
<</switch>>
<<case "flirty">>
<<switch _relStatus>>
<<case "single">>
<<set _relResponse = [
"*giggles* Single and ready to mingle! *winks* Why, are you interested?",
"*playfully* No boyfriend, no girlfriend... I'm all yours, boss.",
"*teasing* Completely unattached! My heart is available... if you're offering."
].random()>>
<<case "dating">>
<<set _relResponse = [
"*giggles* I'm dating someone, but we're open! *winks* Very open.",
"*playfully* There's someone... but they know I'm a free spirit.",
"*teasing* I have a partner who knows sharing is caring. Jealousy is so boring!"
].random()>>
<<case "complicated">>
<<set _relResponse = [
"*dramatic sigh* It's complicated... you know how love is. *flirty smile* Maybe you could uncomplicate things?",
"*pouts* Relationship drama! *giggles* But that makes me more available for... work.",
"*playfully* On-and-off with someone. More off than on lately. Good timing for you!"
].random()>>
<<case "married">>
<<set _relResponse = [
"*whispers conspiratorially* Married... but very bored. *winks* This job will be exciting.",
"*giggles* I have a ring, but what happens at work stays at work, right?",
"*flirty* Technically married... but we have a 'don't ask, don't tell' policy."
].random()>>
<</switch>>
<<case "desperate">>
<<switch _relStatus>>
<<case "single">>
<<set _relResponse = [
"*sadly* I'm single. I've been alone for a while... it's hard.",
"No one... *voice breaks* I don't have anyone. That's why I need this job so much.",
"*tearfully* I'm alone. Maybe if I had money, someone would want me..."
].random()>>
<<case "dating">>
<<set _relResponse = [
"*anxiously* I have a partner... they don't know I'm here. Please don't tell!",
"*nervously* I'm seeing someone. I'm doing this for us! We need the money!",
"*desperately* There's someone in my life... but bills come first. They'll understand... right?"
].random()>>
<<case "complicated">>
<<set _relResponse = [
"*crying* It's complicated... we're fighting over money... that's why I'm here!",
"*sobbing* I don't know what we are anymore! But I need this job to survive!",
"*desperately* Things are falling apart... this job might save my relationship... or end it..."
].random()>>
<<case "married">>
<<set _relResponse = [
"*sobbing* I'm married... my spouse lost their job... we're about to lose everything!",
"*crying* I have a family to support! *desperate* Please, I'll do anything!",
"*tearfully* Married with debts... this is my only option... please hire me!"
].random()>>
<</switch>>
<<case "arrogant">>
<<switch _relStatus>>
<<case "single">>
<<set _relResponse = [
"*scoffs* Single. Because no one meets my standards. Obviously.",
"Unattached. Most people aren't worthy of dating someone like me.",
"*dismissive* Single by choice. I haven't found anyone good enough yet."
].random()>>
<<case "dating">>
<<set _relResponse = [
"I have a partner who knows their place. They don't question what I do.",
"*smugly* Dating someone who's lucky to have me. They're supportive, as they should be.",
"In a relationship with someone who respects my independence."
].random()>>
<<case "complicated">>
<<set _relResponse = [
"*rolls eyes* Complicated. They can't handle being with someone superior.",
"*dismissive* Drama with someone who doesn't appreciate me. Their loss.",
"Relationship issues. They'll come crawling back. They always do."
].random()>>
<<case "married">>
<<set _relResponse = [
"*haughtily* Married. My spouse knows they're lucky to have me.",
"I have a spouse. They don't tell me what to do with my career.",
"*superior* Married, not that it's any of your business. Next question."
].random()>>
<</switch>>
<<case "submissive">>
<<switch _relStatus>>
<<case "single">>
<<set _relResponse = [
"*sadly* I'm single, sir. I'm looking for someone to... belong to.",
"*quietly* No one owns me yet... *hopeful* Maybe this job will change that.",
"*submissively* I'm alone. I want to serve someone... anyone..."
].random()>>
<<case "dating">>
<<set _relResponse = [
"*obediently* I have a master... I mean, partner. They sent me here.",
"*devoted* I belong to someone. They know I'm interviewing here.",
"*quietly* My partner controls my decisions. They approved this job."
].random()>>
<<case "complicated">>
<<set _relResponse = [
"*sadly* It's complicated... my master... they're not sure if they want me anymore...",
"*tearfully* Someone owns me... but they've been distant. I'm scared.",
"*submissively* There's someone, but I don't know if I still belong to them..."
].random()>>
<<case "married">>
<<set _relResponse = [
"*obediently* I'm married, sir. My spouse commands me, and they approved this.",
"*devoted* I have a spouse who owns me completely. They sent me here to work.",
"*submissively* Married. I serve my spouse in all things. This is their decision."
].random()>>
<</switch>>
<<case "cynical">>
<<switch _relStatus>>
<<case "single">>
<<set _relResponse = [
"*shrugs* Single. Relationships are overrated anyway.",
"No partner. Had enough of that drama. Flying solo now.",
"*sarcastically* Blissfully alone. Romance is just trouble with extra steps."
].random()>>
<<case "dating">>
<<set _relResponse = [
"*shrugs* Dating someone. They know about this job. It is what it is.",
"I have a partner. We're realistic about money and what it takes to get it.",
"*matter-of-fact* In a relationship. They're not thrilled, but they understand."
].random()>>
<<case "complicated">>
<<set _relResponse = [
"*sighs* It's complicated. Isn't it always? Relationships are messy.",
"*sarcastically* Some 'it's complicated' situation. The usual romantic disaster.",
"*tiredly* Relationship drama. Nothing new. That's life, I guess."
].random()>>
<<case "married">>
<<set _relResponse = [
"*flatly* Married. We need money. This is the reality of modern economics.",
"*cynically* Got a spouse at home. Fairy tale romance, right? *laughs bitterly*",
"*matter-of-fact* Married. The romance died, the bills didn't. Here I am."
].random()>>
<</switch>>
<<default>>
<<switch _relStatus>>
<<case "single">>
<<set _relResponse = "I'm single at the moment.">>
<<case "dating">>
<<set _relResponse = "I'm in a relationship.">>
<<case "complicated">>
<<set _relResponse = "It's... complicated.">>
<<case "married">>
<<set _relResponse = "I'm married.">>
<</switch>>
<</switch>>
<<Chat _candidate _relResponse>>
/* Additional assessment message */
<<switch _relStatus>>
<<case "single">>
<<set _msg = _candName + " appears to be unattached, which may mean fewer complications.">>
<<ChatMessage _msg>>
<<case "dating">>
<<set _msg = _candName + " is in a relationship. This could potentially cause issues.">>
<<ChatMessage _msg>>
<<case "complicated">>
<<set _msg = _candName + " has relationship drama. They might be emotionally distracted.">>
<<ChatMessage _msg>>
<<case "married">>
<<set _msg = _candName + " is married. This is a significant personal factor to consider.">>
<<ChatMessage _msg>>
<</switch>>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn secondary"><<button "→ Continue interview" "BrothelCasting_Interview">><</button>></span>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _candidate = $selectedCandidate>>
<<set _candName = _candidate.info.firstName>>
<<set _personality = _candidate.saveData.get("personality")>>
<<set _currentMood = _candidate.saveData.get("mood") || 5>>
<<ShowNpcIcon _candidate>>
<div class="centre-text" style="font-size: 18px; color: #ffc107; padding-bottom: 10px;">💬 Improve Mood</div>
/* Speech check determines success */
<<set _speechSkill = $player.attributes.speech.value>>
<<set _successChance = 40 + (_speechSkill * 8)>>
/* Personality modifiers */
<<if _personality == "shy" || _personality == "nervous">>
<<set _successChance += 10>>
<<set _personalityMod = "shyness">>
<<elseif _personality == "friendly">>
<<set _successChance += 20>>
<<set _personalityMod = "friendliness">>
<<elseif _personality == "flirty">>
<<set _successChance += 15>>
<<set _personalityMod = "flirtatiousness">>
<<elseif _personality == "arrogant">>
<<set _successChance -= 15>>
<<set _personalityMod = "arrogance">>
<<elseif _personality == "cynical">>
<<set _successChance -= 10>>
<<set _personalityMod = "cynicism">>
<<elseif _personality == "submissive">>
<<set _successChance += 25>>
<<set _personalityMod = "submissiveness">>
<<elseif _personality == "desperate">>
<<set _successChance += 30>>
<<set _personalityMod = "desperation">>
<<else>>
<<set _personalityMod = "personality">>
<</if>>
<<set _successChance = Math.max(10, Math.min(95, _successChance))>>
<<set _roll = Random(1, 100)>>
<<if _roll <= _successChance>>
/* Success - improve mood */
<<set _moodGain = Random(1, 3)>>
<<if _personality == "desperate" || _personality == "submissive">>
<<set _moodGain += 1>>
<</if>>
<<set _newMood = Math.min(10, _currentMood + _moodGain)>>
<<run _candidate.saveData.set("mood", _newMood)>>
/* Update in Characters array */
<<for _i = 0; _i < $Characters.length; _i++>>
<<if $Characters[_i].info.id == _candidate.info.id>>
<<run $Characters[_i].saveData.set("mood", _newMood)>>
<<break>>
<</if>>
<</for>>
<<ChatMessage "You start a pleasant conversation, showing interest in the candidate...">>
/* Response based on personality */
<<switch _personality>>
<<case "shy">>
<<set _responses = [
"*smiles shyly* Thank you for listening to me... I feel better now.",
"*relaxes a bit* You're... very kind. That's nice.",
"*blushes* Oh, thank you... That means a lot to me."
]>>
<<case "confident">>
<<set _responses = [
"*smiles* Nice to meet someone with a good sense of humor.",
"I must admit, you know how to make people comfortable.",
"Not bad. I like your approach."
]>>
<<case "flirty">>
<<set _responses = [
"*winks* Mmm, you know how to make a girl feel good~",
"*laughs playfully* You're definitely interesting.",
"*licks lips* You're so charming... I like it."
]>>
<<case "desperate">>
<<set _responses = [
"Really? You really think so? Thank you so much!",
"*eyes light up* You're such a kind person!",
"That's so nice to hear! I'm so glad I came here!"
]>>
<<case "arrogant">>
<<set _responses = [
"*surprised* Hm, not bad. Maybe you're not so bad after all.",
"*smiles slightly* Alright, you've earned some respect.",
"I must admit, you know how to talk."
]>>
<<case "submissive">>
<<set _responses = [
"*lowers eyes, smiling* Thank you, master... I'm very pleased.",
"*nods obediently* You're very kind to me...",
"*smiles shyly* I'm glad you're happy with me..."
]>>
<<case "cynical">>
<<set _responses = [
"*raises an eyebrow* Hm, unexpected. Maybe not everyone here is so bad.",
"Alright, that was... nice. Not used to that.",
"*smirks* You're a strange one. But in a good way."
]>>
<<default>>
<<set _responses = [
"Thank you, I feel better now!",
"You're a very nice person.",
"I enjoy talking with you."
]>>
<</switch>>
<<Chat _candidate _responses.random()>>
<div style="background: rgba(76, 175, 80, 0.2); padding: 12px; border-radius: 8px; margin-top: 15px; border: 1px solid #4CAF50;">
<div style="color: #81c784; font-size: 14px;">
✅ <b>Success!</b> Mood improved by +<<print _moodGain>>
</div>
<div style="color: #aaa; font-size: 12px; margin-top: 5px;">
Current mood: <<print _newMood>>/10
</div>
</div>
<<else>>
/* Failure */
<<ChatMessage "You try to start a pleasant conversation, but...">>
<<switch _personality>>
<<case "shy">>
<<set _failResponses = [
"*looks away* Oh... um... sure, I guess...",
"*awkward silence* ...thanks, I suppose..."
]>>
<<case "confident">>
<<set _failResponses = [
"*looks coolly* That was... nice, I suppose.",
"Yeah, sure. Can we get back to business?"
]>>
<<case "arrogant">>
<<set _failResponses = [
"*rolls eyes* Seriously? Is that all you've got?",
"*bored* Yeah, yeah, very nice. Next question?"
]>>
<<case "cynical">>
<<set _failResponses = [
"*skeptically* Was that an attempt to butter me up? Weak.",
"Yeah, right. I've seen better attempts."
]>>
<<default>>
<<set _failResponses = [
"Um... okay. That was... weird.",
"*awkward smile* Yeah, thanks, I guess..."
]>>
<</switch>>
<<Chat _candidate _failResponses.random()>>
<div style="background: rgba(244, 67, 54, 0.2); padding: 12px; border-radius: 8px; margin-top: 15px; border: 1px solid #f44336;">
<div style="color: #ef9a9a; font-size: 14px;">
❌ <b>Failed</b> to improve mood
</div>
<div style="color: #aaa; font-size: 12px; margin-top: 5px;">
Their _personalityMod worked against you
</div>
</div>
<</if>>
<div style="color: #888; font-size: 11px; margin-top: 10px; text-align: center;">
Success chance was: <<print _successChance>>% (Speech: <<print _speechSkill>>)
</div>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn secondary"><<button "→ Continue interview" "BrothelCasting_Interview">><</button>></span>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _candidate = $selectedCandidate>>
<<set _candName = _candidate.info.firstName>>
<<set _personality = _candidate.saveData.get("personality")>>
<<set _currentMood = _candidate.saveData.get("mood") || 5>>
<<ShowNpcIcon _candidate>>
<div class="centre-text" style="font-size: 18px; color: #4CAF50; padding-bottom: 10px;">💵 Gift Money</div>
<<if $player.money >= 250 && _currentMood < 10>>
<<set $player.money -= 250>>
<<set _newMood = Math.min(10, _currentMood + 1)>>
<<run _candidate.saveData.set("mood", _newMood)>>
/* Update in Characters array */
<<for _i = 0; _i < $Characters.length; _i++>>
<<if $Characters[_i].info.id == _candidate.info.id>>
<<run $Characters[_i].saveData.set("mood", _newMood)>>
<<break>>
<</if>>
<</for>>
<<set _handMoneyMsg = "You discreetly hand $250 to " + _candName + "...">>
<<ChatMessage _handMoneyMsg>>
/* Response based on personality */
<<switch _personality>>
<<case "shy">>
<<set _responses = [
"*eyes widen* Oh! That's... that's very generous of you. Thank you...",
"*blushes* I... I don't know what to say. Thank you so much.",
"*looks surprised* For me? That's... really kind."
]>>
<<case "confident">>
<<set _responses = [
"*smiles appreciatively* Nice. I like a boss who knows how to treat people.",
"Well, this is a pleasant surprise. You certainly know how to make an impression.",
"*nods approvingly* Smart move. I appreciate the gesture."
]>>
<<case "flirty">>
<<set _responses = [
"*winks* Mmm, throwing money at me already? I like your style~",
"*purrs* Oh my, aren't you generous... I might have to show my appreciation later.",
"*licks lips* You know how to get a girl's attention, don't you?"
]>>
<<case "desperate">>
<<set _responses = [
"*tears up* Oh my god, thank you so much! This means everything to me!",
"*grabs your hand* You're amazing! I won't forget this!",
"*overwhelmed* I... I really needed this. Thank you, thank you!"
]>>
<<case "arrogant">>
<<set _responses = [
"*raises eyebrow* Hmph. At least you understand my worth.",
"*takes money cooly* I suppose this is appropriate. You have taste.",
"*slight smile* Well, well. Perhaps you're not as bad as I thought."
]>>
<<case "submissive">>
<<set _responses = [
"*lowers eyes* Thank you, master... You're too kind to me.",
"*bows slightly* I'm grateful for your generosity, sir.",
"*smiles softly* Thank you... I'll remember your kindness."
]>>
<<case "cynical">>
<<set _responses = [
"*looks at money* Hm. Bribery, huh? ...I can respect that.",
"*smirks* Trying to buy my affection? ...Well, it's working.",
"*shrugs* Money talks, I guess. Alright, you've got my attention."
]>>
<<default>>
<<set _responses = [
"Wow, thank you! That's really generous of you!",
"*smiles warmly* This is very kind. Thank you!",
"I appreciate this a lot. Thank you!"
]>>
<</switch>>
<<Chat _candidate _responses.random()>>
<div style="background: rgba(76, 175, 80, 0.2); padding: 12px; border-radius: 8px; margin-top: 15px; border: 1px solid #4CAF50;">
<div style="color: #81c784; font-size: 14px;">
💵 <b>-$250</b> | Mood improved by +1
</div>
<div style="color: #aaa; font-size: 12px; margin-top: 5px;">
Current mood: <<print _newMood>>/10
</div>
</div>
<<else>>
<<if _currentMood >= 10>>
<<ChatMessage "Their mood is already at maximum.">>
<<else>>
<<ChatMessage "You don't have enough money.">>
<</if>>
<</if>>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn secondary"><<button "→ Continue interview" "BrothelCasting_Interview">><</button>></span>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _candidate = $selectedCandidate>>
<<set _candName = _candidate.info.firstName>>
<<set _candGender = _candidate.gender()>>
<<ShowNpcIcon _candidate>>
<div class="centre-text" style="font-size: 20px; color: #e91e63;">👀 <<print _candName>>'s Body</div>
<<set _msg = "You ask " + _candName + " to show you their body...">>
<<ChatMessage _msg>>
<<set _personality = _candidate.saveData.get("personality")>>
<<switch _personality>>
<<case "shy">>
<<set _response = "*blushes deeply and hesitates* O-okay... if you need to see...">>
<<case "confident">>
<<set _response = "*smiles and poses* Sure, take a good look. I know what I'm working with.">>
<<case "flirty">>
<<set _response = "*winks seductively* Mmm, like what you see? There's plenty more~">>
<<case "desperate">>
<<set _response = "*quickly complies* Of course! Whatever you need to see!">>
<<case "arrogant">>
<<set _response = "*sighs* Fine, feast your eyes. Try not to be too jealous.">>
<<case "submissive">>
<<set _response = "*nods obediently* Yes, of course... as you wish.">>
<<case "cynical">>
<<set _response = "*shrugs* Sure, look all you want. Part of the job, right?">>
<<default>>
<<set _response = "Alright, here you go...">>
<</switch>>
<<Chat _candidate _response>>
<fieldset style="background: linear-gradient(135deg, rgba(233, 30, 99, 0.15) 0%, rgba(33, 33, 33, 0.95) 100%); border: 1px solid #e91e63; margin: 15px 0;">
<legend style="color: #f48fb1;">Body Photos</legend>
<div style="display: grid; grid-template-columns: repeat(3, 1fr); gap: 15px; padding: 15px; text-align: center;">
/* Breasts */
<div style="background: rgba(0,0,0,0.3); border-radius: 10px; padding: 15px;">
<div style="color: #fff; font-size: 14px; margin-bottom: 10px;">🍈 Breasts</div>
<div style="color: #aaa; font-size: 12px; margin-bottom: 10px;"><<print _candidate.getBreastText()>></div>
<span class="brothel-btn primary small"><<button "View">>
<<script>>
Dialog.create(SugarCube.State.variables.selectedCandidate.getBreastText());
Dialog.wiki(SugarCube.State.variables.selectedCandidate.getBreastImage());
Dialog.open();
<</script>>
<</button>></span>
</div>
/* Butt */
<div style="background: rgba(0,0,0,0.3); border-radius: 10px; padding: 15px;">
<div style="color: #fff; font-size: 14px; margin-bottom: 10px;">🍑 Butt</div>
<div style="color: #aaa; font-size: 12px; margin-bottom: 10px;"><<print _candidate.getButtText()>></div>
<span class="brothel-btn secondary small"><<button "View">>
<<script>>
Dialog.create(SugarCube.State.variables.selectedCandidate.getButtText());
Dialog.wiki(SugarCube.State.variables.selectedCandidate.getAssImage());
Dialog.open();
<</script>>
<</button>></span>
</div>
/* Genitals */
<div style="background: rgba(0,0,0,0.3); border-radius: 10px; padding: 15px;">
<div style="color: #fff; font-size: 14px; margin-bottom: 10px;">🔞 Genitals</div>
<<if _candGender == "Female">>
<div style="color: #aaa; font-size: 12px; margin-bottom: 10px;">Vagina</div>
<span class="brothel-btn secondary small"><<button "View">>
<<script>>
var cand = SugarCube.State.variables.selectedCandidate;
Dialog.create("Vagina");
var skin = cand.info.skin;
var skinCapitalized = skin.charAt(0).toUpperCase() + skin.slice(1);
var img = '<img class="chat-image" style="width: 100%; max-width: 400px; aspect-ratio: 4 / 3; object-fit: cover;" src="Media/Characters/' + skinCapitalized + '/Vag/0.jpg" alt="Vagina">';
Dialog.wiki(img);
Dialog.open();
<</script>>
<</button>></span>
<<elseif _candGender == "Male">>
<div style="color: #aaa; font-size: 12px; margin-bottom: 10px;">Penis</div>
<span class="brothel-btn disabled small" title="Photos of male genitals are not available"><<button "View (N/A)">><</button>></span>
<<else>>
<div style="color: #aaa; font-size: 12px; margin-bottom: 10px;">Penis (Shemale)</div>
<span class="brothel-btn disabled small" title="Photos of male genitals are not available"><<button "View (N/A)">><</button>></span>
<</if>>
</div>
</div>
</fieldset>
/* Body stats */
<fieldset style="background: rgba(0,0,0,0.3); border: 1px solid #888; margin: 10px 0;">
<legend style="color: #aaa;">Body Stats</legend>
<div style="display: grid; grid-template-columns: repeat(2, 1fr); gap: 10px; padding: 10px;">
<div style="font-size: 12px; color: #aaa;">🍈 Breast Size: <span style="color: #fff;"><<print _candidate.body.breastSize.value>>/5</span></div>
<div style="font-size: 12px; color: #aaa;">🍑 Butt Size: <span style="color: #fff;"><<print _candidate.body.buttSize.value>>/5</span></div>
<<if _candGender == "Female">>
<div style="font-size: 12px; color: #aaa;">💕 Vagina Size: <span style="color: #fff;"><<print _candidate.body.vaginaSize.value>></span></div>
<<else>>
<div style="font-size: 12px; color: #aaa;">🍆 Penis Size: <span style="color: #fff;"><<print _candidate.body.penisSize.value>></span></div>
<</if>>
<div style="font-size: 12px; color: #aaa;">🍩 Anus Size: <span style="color: #fff;"><<print _candidate.body.anusSize.value>></span></div>
</div>
</fieldset>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn neutral"><<button "← Back to interview" "BrothelCasting_Interview">><</button>></span>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _candidate = $selectedCandidate>>
<<ShowNpcIcon _candidate>>
<<set _corruption = _candidate.attributes.corruption.value>>
<<set _candName = _candidate.info.firstName>>
<<set _personality = _candidate.saveData.get("personality")>>
<<set _requiredCorruption = 2>>
<<set _msg = "You ask " + _candName + " if they would demonstrate their oral skills...">>
<<ChatMessage _msg>>
<<if _corruption >= _requiredCorruption>>
/* Agreed - personality-based responses */
<<switch _personality>>
<<case "shy">>
<<set _agreeResponse = [
"*blushes deeply* O-okay... I'll do my best. *kneels down nervously*",
"*voice barely audible* If... if you want me to... *hesitantly approaches*",
"*trembling slightly* I... I can try. Please don't judge me too harshly..."
].random()>>
<<case "confident">>
<<set _agreeResponse = [
"Of course. Prepare to be impressed.",
"Gladly. This is one of my strongest skills. Let me demonstrate.",
"A practical demonstration? Smart. You'll see exactly why I'm the best choice."
].random()>>
<<case "flirty">>
<<set _agreeResponse = [
"*licks lips sensually* Mmm, I was hoping you'd ask. *winks*",
"*giggles* Finally, the fun part! *drops to knees with a smile*",
"Ooh, I thought you'd never ask! Let me show you my favorite skill..."
].random()>>
<<case "desperate">>
<<set _agreeResponse = [
"Yes! Of course! I'll show you I'm worth hiring! Right now!",
"Absolutely! I'll be the best you've ever seen! I promise!",
"Right away! I'll prove myself! You won't regret it!"
].random()>>
<<case "arrogant">>
<<set _agreeResponse = [
"*sighs* Fine. Though this is beneath a formal interview. Watch and learn.",
"Very well. Consider yourself lucky to receive a preview.",
"If you insist. Don't expect this kind of treatment from me normally."
].random()>>
<<case "submissive">>
<<set _agreeResponse = [
"Yes, sir. *immediately kneels* I'm here to serve.",
"Of course. I want to show you how obedient I can be.",
"*drops to knees* Command me. I'll do exactly as you wish."
].random()>>
<<case "cynical">>
<<set _agreeResponse = [
"*shrugs* Sure. It's part of the interview process, right? Let's get it done.",
"Why not. Actions speak louder than words anyway.",
"Alright. At least this part of the interview is straightforward."
].random()>>
<<default>>
<<set _agreeResponse = "Of course. Let me show you what I can do.">>
<</switch>>
<<Chat _candidate _agreeResponse>>
<<set _msg = _candName + " agrees to the test.">>
<<ChatMessage _msg>>
<div class="btn-container padding-top">
<span class="brothel-btn primary"><<button "✓ Proceed with test" "BrothelCasting_TestBlowjob_Scene">><</button>></span>
<span class="brothel-btn neutral"><<button "← That won't be necessary" "BrothelCasting_Interview">><</button>></span>
</div>
<<else>>
/* Refused - personality-based responses */
<<switch _personality>>
<<case "shy">>
<<set _refuseResponse = [
"*shrinks back* I-I'm sorry, I can't... not like this... *eyes tear up*",
"*shakes head rapidly* Please, no... I'm not ready for that... not here...",
"*voice cracks* I... I couldn't possibly... it's too much for me right now..."
].random()>>
<<case "confident">>
<<set _refuseResponse = [
"I don't perform during interviews. Hire me first, then we'll discuss demonstrations.",
"That's not appropriate for an interview. I maintain professional boundaries.",
"I keep certain skills exclusive for actual employment. Standards, you understand."
].random()>>
<<case "flirty">>
<<set _refuseResponse = [
"*pouts* Mmm, tempting... but a girl has to keep some mystery. Hire me first?",
"*teasing smile* That's for after you hire me, handsome. Anticipation is half the fun.",
"*winks* Not yet, sweetie. But I promise it'll be worth the wait if you bring me on."
].random()>>
<<case "desperate">>
<<set _refuseResponse = [
"I... I want to, but... *tears welling* Please, can we just... not during the interview?",
"*looks conflicted* I need this job so badly, but... I'm not ready for that yet...",
"Maybe... maybe after you hire me? I'll do it then, I promise! Just not now..."
].random()>>
<<case "arrogant">>
<<set _refuseResponse = [
"*scoffs* Excuse me? I don't audition like some common street worker.",
"Absolutely not. You should be able to recognize quality without degrading tests.",
"*coldly* That's insulting. Either hire me based on my qualities or don't."
].random()>>
<<case "submissive">>
<<set _refuseResponse = [
"*head bowed* I'm sorry... I want to obey but... I'm scared. Please forgive me...",
"*trembling* I wish I could serve you, but... I'm not ready yet. I'm so sorry...",
"Forgive me... I want to please you but my fear is too strong right now..."
].random()>>
<<case "cynical">>
<<set _refuseResponse = [
"Nice try. Unpaid demonstrations aren't part of legitimate interviews.",
"*raises eyebrow* I know this game. Work comes after contracts, not before.",
"Let me guess - this is a 'test' that never leads to actual hiring? Pass."
].random()>>
<<default>>
<<set _refuseResponse = "I'm not comfortable doing that during an interview. Maybe after you hire me?">>
<</switch>>
<<Chat _candidate _refuseResponse>>
<<set _msg = _candName + " refuses. They seem too shy for this.">>
<<ChatMessage _msg>>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn secondary"><<button "→ Continue interview" "BrothelCasting_Interview">><</button>></span>
</div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _candidate = $selectedCandidate>>
<<set _throatSize = _candidate.body.throatSize.value>>
<<set _candName = _candidate.info.firstName>>
<<set _candGender = _candidate.gender()>>
<<set _playerGender = $player.gender()>>
<<set _personality = _candidate.saveData.get("personality")>>
/* For male candidates, player gives oral; for others, candidate gives oral */
<<if _candGender == "Male">>
/* Male candidate - player gives oral to test candidate's cock */
<<SetOralPick _candGender _playerGender>>
<<Video _pick>>
<<set _msg = "You get on your knees to evaluate " + _candName + "'s equipment and endurance...">>
<<ChatMessage _msg>>
<<set _penisSize = _candidate.body.penisSize.value>>
<<if _penisSize >= 30>>
<<ChatMessage "He's very well-endowed. Impressive equipment for the job.">>
<<elseif _penisSize >= 20>>
<<ChatMessage "He has a good size. Should satisfy most clients.">>
<<else>>
<<ChatMessage "He's on the smaller side, but technique matters more than size.">>
<</if>>
<<else>>
/* Female/Shemale candidate - candidate gives oral */
/* Determine who is the tester (dom) */
<<if _playerGender == "Female">>
/* Female player - use a brothel worker as tester */
<<set _testerGender = "Male">>
<<set _testerName = "brothel worker">>
<<set _msg = "You call one of your brothel workers to test " + _candName + "'s oral skills.">>
<<ChatMessage _msg>>
<<else>>
/* Male/Shemale player tests directly */
<<set _testerGender = _playerGender>>
<<set _testerName = "you">>
<</if>>
/* Set video - tester receives oral from candidate */
<<SetOralPick _testerGender _candGender>>
<<Video _pick>>
<<if _playerGender == "Female">>
<<set _msg = _candName + " gets on their knees and begins demonstrating on the worker...">>
<<ChatMessage _msg>>
<<else>>
<<set _msg = _candName + " gets on their knees and begins the demonstration...">>
<<ChatMessage _msg>>
<</if>>
<</if>>
/* Performance reaction based on throat size AND personality */
<<if _throatSize >= 30>>
<<ChatMessage "They take it deep without any trouble. Clearly experienced at this.">>
<<switch _personality>>
<<case "shy">>
<<set _afterResponse = [
"*wipes mouth, blushing* W-was that okay...? *avoids eye contact*",
"*breathless, face red* I... I hope that was good enough...",
"*quietly* I practiced a lot... *embarrassed smile*"
].random()>>
<<case "confident">>
<<set _afterResponse = [
"*stands up gracefully* As expected. No gag reflex whatsoever.",
"That's just a preview. Hire me and see what else I can do.",
"*wipes lips with satisfaction* Perfect technique, as always."
].random()>>
<<case "flirty">>
<<set _afterResponse = [
"*licks lips* Mmm, delicious. I could do this all day. *winks*",
"*giggles* That was fun! Want me to go again? Pretty please?",
"How was that, baby? *runs tongue over lips seductively* I love this part..."
].random()>>
<<case "desperate">>
<<set _afterResponse = [
"*eagerly* Was that good? I can do better! Let me try again!",
"Please tell me that was impressive! I worked so hard on this skill!",
"*hopeful eyes* Did I do well? I really want this job!"
].random()>>
<<case "arrogant">>
<<set _afterResponse = [
"*stands, unimpressed* Obviously. Did you expect anything less?",
"Naturally. Years of perfecting my craft. You're welcome.",
"*flips hair* Child's play. The real question is can your clients handle me?"
].random()>>
<<case "submissive">>
<<set _afterResponse = [
"*kneeling* Was my service pleasing, sir? I exist only to satisfy.",
"*head bowed* Please tell me if I did well. Your approval means everything.",
"Thank you for allowing me to serve. *looks up with devoted eyes* Shall I continue?"
].random()>>
<<case "cynical">>
<<set _afterResponse = [
"*stands, businesslike* Deep throat. Not everyone can do it. Now you know I can.",
"*shrugs* Years of practice. It's just a skill like any other.",
"There. Proof of ability delivered. Can we move on?"
].random()>>
<<default>>
<<set _afterResponse = "How was that? I can go even deeper if you want...">>
<</switch>>
<<elseif _throatSize >= 20>>
<<ChatMessage "They handle it well, showing decent technique.">>
<<switch _personality>>
<<case "shy">>
<<set _afterResponse = [
"*coughing slightly* I... I hope that was okay? *nervously*",
"*embarrassed* S-sorry if it wasn't perfect... I tried my best...",
"*quietly* Did I do alright...? *fidgets with hands*"
].random()>>
<<case "confident">>
<<set _afterResponse = [
"Solid performance. I know my technique is reliable.",
"That was good, but I can do better with more practice.",
"Not my absolute best, but clearly above average."
].random()>>
<<case "flirty">>
<<set _afterResponse = [
"*playful smile* Not bad, right? I'm still warming up though...",
"*giggles* That was pretty good! With practice it gets even better.",
"*winks* I have other skills that are even better, you know..."
].random()>>
<<case "desperate">>
<<set _afterResponse = [
"That was decent, right? I'll practice more! I'll get even better!",
"Please, that was okay, wasn't it? I'll improve, I promise!",
"*anxiously* I hope that showed my potential! I can learn more!"
].random()>>
<<case "arrogant">>
<<set _afterResponse = [
"*brushes off* Adequate. I wasn't really trying my hardest.",
"That was restrained. I don't give my all for free tests.",
"*dismissive* Good enough for an interview, I suppose."
].random()>>
<<case "submissive">>
<<set _afterResponse = [
"*apologetically* I'm sorry if it wasn't perfect, sir. I'll do better.",
"*head down* I tried to please you. Please forgive any shortcomings.",
"Was my service acceptable? I want only to satisfy..."
].random()>>
<<case "cynical">>
<<set _afterResponse = [
"Decent performance. Not my best, not my worst.",
"*matter-of-fact* Standard blowjob. Gets the job done.",
"There. Competent, if not spectacular. Hire me if you want."
].random()>>
<<default>>
<<set _afterResponse = "I hope that was satisfactory...">>
<</switch>>
<<else>>
<<ChatMessage "They struggle a bit but try their best.">>
<<switch _personality>>
<<case "shy">>
<<set _afterResponse = [
"*coughing, tears in eyes* I-I'm so sorry... I tried... *voice breaking*",
"*embarrassed and upset* I'm not very good at this yet... I'm sorry...",
"*nearly crying* Please don't reject me... I'll practice, I promise..."
].random()>>
<<case "confident">>
<<set _afterResponse = [
"*clearing throat* I admit that could have gone better. I'll improve.",
"Not my finest moment, but everyone has room for growth.",
"*composed* That was... a learning experience. I'll work on it."
].random()>>
<<case "flirty">>
<<set _afterResponse = [
"*coughing cutely* Oops! *giggles* I guess I need more practice...",
"*pouts* That wasn't my best... but practice makes perfect, right?",
"*winks despite struggling* I'm better at other things, I promise!"
].random()>>
<<case "desperate">>
<<set _afterResponse = [
"*coughing, panicking* I'm sorry! I'll get better! Please don't reject me!",
"*tears forming* I know that was bad... please, give me a chance to improve!",
"*desperately* I'll practice every day! Just please hire me anyway!"
].random()>>
<<case "arrogant">>
<<set _afterResponse = [
"*coughing* That was... *composes self* ...an unusual angle. Not my fault.",
"*defensive* I was caught off guard. Normally I'm much better.",
"*irritated* This testing environment isn't fair. Under normal conditions..."
].random()>>
<<case "submissive">>
<<set _afterResponse = [
"*coughing, apologetic* I'm so sorry, sir... I failed you... please forgive me...",
"*head bowed in shame* I wasn't good enough... I deserve punishment...",
"*tearfully* Please let me try again... I want to please you properly..."
].random()>>
<<case "cynical">>
<<set _afterResponse = [
"*coughing* Look, I never claimed deep throat was my specialty.",
"*shrugs while recovering* Can't be good at everything. Moving on.",
"*matter-of-fact* Not my strongest skill. At least I'm honest about it."
].random()>>
<<default>>
<<set _afterResponse = "*cough* Sorry... I'm still learning...">>
<</switch>>
<</if>>
<<Chat _candidate _afterResponse>>
<<SpendTimeWithoutUpdate 15>>
<<SpendEnergy $player 5>>
/* Increase lust for male/shemale player */
<<if _playerGender != "Female">>
<<set _hornyIncrease = Random(15, 30)>>
<<run $player.status.horny.increase(_hornyIncrease)>>
<</if>>
<div class="brothel-btn-container padding-top">
<<if _playerGender != "Female" && $player.status.horny.value >= $player.status.horny.max>>
<span class="brothel-btn danger"><<button "💦 Cum" "BrothelCasting_CumScene">>
<<set $castingCumType = "Oral">>
<</button>></span>
<<else>>
<span class="brothel-btn secondary"><<button "→ Continue interview" "BrothelCasting_Interview">><</button>></span>
<</if>>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _candidate = $selectedCandidate>>
<<ShowNpcIcon _candidate>>
<<set _corruption = _candidate.attributes.corruption.value>>
<<set _candName = _candidate.info.firstName>>
<<set _personality = _candidate.saveData.get("personality")>>
<<set _requiredCorruption = 4>>
<<set _msg = "You ask " + _candName + " if they would demonstrate their skills in bed...">>
<<ChatMessage _msg>>
<<if _corruption >= _requiredCorruption>>
/* Agreed - personality-based responses */
<<switch _personality>>
<<case "shy">>
<<set _agreeResponse = [
"*blushes intensely* I... okay... if you really need me to... *starts undressing slowly*",
"*heart racing* This is embarrassing but... I'll do it... for the job...",
"*trembling slightly* O-okay... just... please be gentle with me..."
].random()>>
<<case "confident">>
<<set _agreeResponse = [
"Absolutely. This is where I truly shine. Prepare yourself.",
"Of course. A proper demonstration will remove any doubts.",
"Gladly. You'll see exactly why clients will pay premium for me."
].random()>>
<<case "flirty">>
<<set _agreeResponse = [
"*eyes light up* Mmm, finally! I've been waiting for this part! *bites lip*",
"*starts undressing seductively* Oh yes... this is my favorite kind of interview...",
"*giggles excitedly* I thought you'd never ask! Let's have some real fun..."
].random()>>
<<case "desperate">>
<<set _agreeResponse = [
"Yes! Anything! I'll show you I'm worth it! I'll be amazing!",
"Of course! Whatever it takes! I need this job so badly!",
"Absolutely! Let me prove myself! You won't regret it!"
].random()>>
<<case "arrogant">>
<<set _agreeResponse = [
"*sighs* Fine. But remember this is a privilege, not a right.",
"Very well. Try to keep up. Not everyone can handle me.",
"If you insist. Don't blame me if you become... attached."
].random()>>
<<case "submissive">>
<<set _agreeResponse = [
"*obediently undresses* Yes, sir. Use my body as you see fit.",
"I'm yours to test. Do whatever you need to do to me.",
"*lies down submissively* Please take me. I exist to be used."
].random()>>
<<case "cynical">>
<<set _agreeResponse = [
"*starts undressing* Sure. Figured this was coming. Let's get it over with.",
"Alright. It's the most honest part of any interview, really.",
"*shrugs* Fine. At least this is straightforward. No more games."
].random()>>
<<default>>
<<set _agreeResponse = "Sure, let's do it.">>
<</switch>>
<<Chat _candidate _agreeResponse>>
<<set _msg = _candName + " agrees to the test.">>
<<ChatMessage _msg>>
<div class="btn-container padding-top">
<span class="brothel-btn primary"><<button "✓ Proceed with test" "BrothelCasting_TestVaginal_Scene">><</button>></span>
<span class="brothel-btn neutral"><<button "← That won't be necessary" "BrothelCasting_Interview">><</button>></span>
</div>
<<elseif _corruption >= 2>>
/* Hesitant - personality-based responses */
<<switch _personality>>
<<case "shy">>
<<set _hesitantResponse = [
"*shakes head quickly* I-I can't... not during an interview... it's too much...",
"*covers face* Please... that's too intimate... I'm not ready for that yet...",
"*voice cracking* I want the job but... this is too fast for me..."
].random()>>
<<case "confident">>
<<set _hesitantResponse = [
"That's a significant request for an interview. I'd prefer to establish terms first.",
"I could, but I'd rather discuss compensation before that level of demonstration.",
"Interesting request. I'm capable, but prefer to save the full experience for employment."
].random()>>
<<case "flirty">>
<<set _hesitantResponse = [
"*teasing pout* Mmm, jumping straight to the main event? Shouldn't we warm up first?",
"*playfully* Eager, aren't you? I like that... but maybe after you hire me?",
"*bites lip* Tempting... very tempting... but I like to be wined and dined first."
].random()>>
<<case "desperate">>
<<set _hesitantResponse = [
"I... *conflicted* I want to say yes... I need this job... but...",
"*torn* Maybe? I'm just... can you promise you'll hire me if I do?",
"*nervously* I'm not sure... but if it's the only way... maybe..."
].random()>>
<<case "arrogant">>
<<set _hesitantResponse = [
"*offended* Excuse me? I don't audition like some cheap escort.",
"That's presumptuous. My skills in bed are for paying customers only.",
"*coldly* Perhaps after you've proven YOUR worth as an employer."
].random()>>
<<case "submissive">>
<<set _hesitantResponse = [
"*conflicted* I want to obey, but... this feels wrong without commitment...",
"*hesitantly* I... if you command me to... but I'm scared...",
"*uncertain* Should I? I want to please you but... this is a lot to ask..."
].random()>>
<<case "cynical">>
<<set _hesitantResponse = [
"*raises eyebrow* Free sample? I know how this usually ends. Pass for now.",
"Ah, the classic 'test' that magically doesn't lead to hiring. I've seen this before.",
"Tell you what - hire me first, then you can test all you want. Fair's fair."
].random()>>
<<default>>
<<set _hesitantResponse = "I... that's a big ask for an interview. Are you sure it's necessary?">>
<</switch>>
<<Chat _candidate _hesitantResponse>>
<<set _msg = _candName + " seems hesitant. Maybe with more corruption they would agree.">>
<<ChatMessage _msg>>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn secondary"><<button "→ Continue interview" "BrothelCasting_Interview">><</button>></span>
</div>
<<else>>
/* Refused - personality-based responses */
<<switch _personality>>
<<case "shy">>
<<set _refuseResponse = [
"*backs away, scared* No! Please, I can't... not like this... *nearly in tears*",
"*covers body protectively* I'm sorry, I just can't... it's too much...",
"*shaking head rapidly* No, no, no... please don't make me... I'm not ready..."
].random()>>
<<case "confident">>
<<set _refuseResponse = [
"Absolutely not. I have standards for how I enter professional relationships.",
"That's a firm no. If you want that service, hire me first. Simple.",
"I don't do auditions of that nature. It's unprofessional on both our parts."
].random()>>
<<case "flirty">>
<<set _refuseResponse = [
"*pouts dramatically* Aww, naughty! But no, not until there's a ring... I mean, a contract.",
"*playfully shakes finger* Nice try, but I save the best for actual clients!",
"*teasing* You'll have to work harder than that to get into my panties, boss."
].random()>>
<<case "desperate">>
<<set _refuseResponse = [
"*crying* I want to say yes so badly, but... I can't... please understand...",
"*conflicted and upset* I need this job, but I can't give that for free... please...",
"*tears streaming* Please don't make that a requirement... I'll do anything else..."
].random()>>
<<case "arrogant">>
<<set _refuseResponse = [
"*furious* How DARE you! I'm not some desperate street whore!",
"*stands up angrily* This interview is over if that's what you expect.",
"*scoffs loudly* Absolutely not. I deserve better than this treatment."
].random()>>
<<case "submissive">>
<<set _refuseResponse = [
"*trembling* I want to obey... but I can't... please forgive me, sir...",
"*head bowed in shame* I'm sorry I can't comply... I'm too scared...",
"*crying softly* Please don't hate me for refusing... I just can't..."
].random()>>
<<case "cynical">>
<<set _refuseResponse = [
"*laughs bitterly* Oh, of course. The 'free test' scam. Not falling for that.",
"*cold stare* I've seen this trick a hundred times. Hard pass.",
"Save it. I know exactly where this 'interview' is going. The answer is no."
].random()>>
<<default>>
<<set _refuseResponse = "No! That's too much. I'm not doing that until I'm officially hired.">>
<</switch>>
<<Chat _candidate _refuseResponse>>
<<set _msg = _candName + " firmly refuses.">>
<<ChatMessage _msg>>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn secondary"><<button "→ Continue interview" "BrothelCasting_Interview">><</button>></span>
</div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _candidate = $selectedCandidate>>
<<set _vaginaSize = _candidate.body.vaginaSize.value>>
<<set _candName = _candidate.info.firstName>>
<<set _candGender = _candidate.gender()>>
<<set _playerGender = $player.gender()>>
<<set _personality = _candidate.saveData.get("personality")>>
/* Determine who is the tester (dom) */
<<if _playerGender == "Female">>
/* Female player - use a brothel worker as tester */
<<set _testerGender = "Male">>
<<set _testerName = "brothel worker">>
<<set _msg = "You call one of your brothel workers to test " + _candName + "'s skills in bed.">>
<<ChatMessage _msg>>
<<else>>
/* Male/Shemale player tests directly */
<<set _testerGender = _playerGender>>
<<set _testerName = "you">>
<</if>>
/* Set video - tester fucks candidate's vagina */
<<SetVagPick _testerGender _candGender>>
<<Video _pick>>
/* Personality-based start */
<<switch _personality>>
<<case "shy">>
<<if _playerGender == "Female">>
<<set _msg = _candName + " nervously undresses, blushing as the worker approaches...">>
<<ChatMessage _msg>>
<<else>>
<<set _msg = _candName + " shyly removes their clothes, avoiding eye contact...">>
<<ChatMessage _msg>>
<</if>>
<<case "confident">>
<<if _playerGender == "Female">>
<<set _msg = _candName + " confidently undresses, beckoning the worker with a commanding look...">>
<<ChatMessage _msg>>
<<else>>
<<set _msg = _candName + " smoothly removes their clothes, meeting your gaze with confidence...">>
<<ChatMessage _msg>>
<</if>>
<<case "flirty">>
<<if _playerGender == "Female">>
<<set _msg = _candName + " does a little striptease for the worker, giggling playfully...">>
<<ChatMessage _msg>>
<<else>>
<<set _msg = _candName + " slowly peels off their clothes, putting on a show just for you...">>
<<ChatMessage _msg>>
<</if>>
<<case "desperate">>
<<if _playerGender == "Female">>
<<set _msg = _candName + " quickly undresses, eager to prove themselves to the worker...">>
<<ChatMessage _msg>>
<<else>>
<<set _msg = _candName + " hurriedly strips, desperate to show you they're worth hiring...">>
<<ChatMessage _msg>>
<</if>>
<<case "arrogant">>
<<if _playerGender == "Female">>
<<set _msg = _candName + " undresses with an air of superiority, as if gracing the worker with a gift...">>
<<ChatMessage _msg>>
<<else>>
<<set _msg = _candName + " leisurely removes their clothes, acting like they're doing you a favor...">>
<<ChatMessage _msg>>
<</if>>
<<case "submissive">>
<<if _playerGender == "Female">>
<<set _msg = _candName + " obediently strips and presents themselves to the worker...">>
<<ChatMessage _msg>>
<<else>>
<<set _msg = _candName + " submissively undresses and awaits your command...">>
<<ChatMessage _msg>>
<</if>>
<<case "cynical">>
<<if _playerGender == "Female">>
<<set _msg = _candName + " matter-of-factly undresses as the worker prepares...">>
<<ChatMessage _msg>>
<<else>>
<<set _msg = _candName + " efficiently removes their clothes without ceremony...">>
<<ChatMessage _msg>>
<</if>>
<<default>>
<<if _playerGender == "Female">>
<<set _msg = _candName + " undresses as the worker approaches...">>
<<ChatMessage _msg>>
<<else>>
<<set _msg = _candName + " undresses and leads you to the couch...">>
<<ChatMessage _msg>>
<</if>>
<</switch>>
/* Performance reaction based on vagina size AND personality */
<<if _vaginaSize >= 30>>
<<ChatMessage "They know exactly how to move. Experienced and skilled.">>
<<switch _personality>>
<<case "shy">>
<<set _afterResponse = [
"*panting, face flushed* Was that... was that good...? *embarrassed smile*",
"*catching breath* I hope... I hope you liked it... *looks away shyly*",
"*quietly* I... I enjoyed that... is that okay to say...?"
].random()>>
<<case "confident">>
<<set _afterResponse = [
"*smiles knowingly* As expected. I know exactly what I'm doing.",
"That was just a sample. Hire me and experience the full service.",
"*stretches luxuriously* Perfect technique, as always. Any questions?"
].random()>>
<<case "flirty">>
<<set _afterResponse = [
"*moaning softly* Mmm, that was SO good... can we do it again?",
"*giggles breathlessly* Did you enjoy that as much as I did?",
"*winks while panting* Now THAT's what I call an interview..."
].random()>>
<<case "desperate">>
<<set _afterResponse = [
"*eagerly* Was that good? Tell me it was good! Please hire me!",
"*hopeful* I was amazing, right? Right?! I need this job!",
"*anxiously* That was my best! Did it work? Will you hire me?!"
].random()>>
<<case "arrogant">>
<<set _afterResponse = [
"*languidly* You're welcome. Not everyone gets that experience.",
"*smirks* Obviously that was exceptional. I don't do mediocre.",
"*stretches* Now you understand why I'm overqualified."
].random()>>
<<case "submissive">>
<<set _afterResponse = [
"*breathlessly* Thank you for using me, sir. Did I please you?",
"*devotedly* I hope my body satisfied you. I live to serve.",
"*submissively* Was my performance acceptable? I exist for your pleasure."
].random()>>
<<case "cynical">>
<<set _afterResponse = [
"*matter-of-fact* There. Proof of competence. Hire me or don't.",
"*shrugs while dressing* Standard excellent performance. As expected.",
"That's what experience looks like. Now you know what you'd be getting."
].random()>>
<<default>>
<<set _afterResponse = "Mmm... was that good enough for you, boss?">>
<</switch>>
<<elseif _vaginaSize >= 20>>
<<ChatMessage "They perform well, with good rhythm and technique.">>
<<switch _personality>>
<<case "shy">>
<<set _afterResponse = [
"*blushing deeply* I... I hope that was okay... *voice quiet*",
"*embarrassed* Sorry if I wasn't perfect... I tried my best...",
"*timidly* Did you... did you like it...?"
].random()>>
<<case "confident">>
<<set _afterResponse = [
"That was a solid performance. I can do even better with time.",
"Good demonstration. I have room to improve, and I will.",
"Reliable technique. You'd be getting consistent quality."
].random()>>
<<case "flirty">>
<<set _afterResponse = [
"*playfully* Not bad, right? I get better with practice...",
"*winks* That was fun! Imagine what I can do with more time...",
"*giggles* Pretty good for an interview, don't you think?"
].random()>>
<<case "desperate">>
<<set _afterResponse = [
"That was good, right? I can improve! I promise I'll get better!",
"*anxiously* Please tell me that was enough! I'll practice every day!",
"I know I can do better! Just give me a chance to prove it!"
].random()>>
<<case "arrogant">>
<<set _afterResponse = [
"*dismissive* That was adequate. I wasn't trying my hardest.",
"Decent performance given the circumstances.",
"*brushes off* Better than most, I'm sure. Good enough for here."
].random()>>
<<case "submissive">>
<<set _afterResponse = [
"*apologetic* I tried to please you, sir. Was it acceptable?",
"*head bowed* I hope I didn't disappoint. I'll do better next time.",
"*quietly* Please tell me if I need to improve. I want to serve better."
].random()>>
<<case "cynical">>
<<set _afterResponse = [
"Decent performance. Not my best, not my worst. Hire accordingly.",
"*shrugs* Solid work. You know what you'd be getting.",
"Average-plus performance. Consistent, reliable. That's worth something."
].random()>>
<<default>>
<<set _afterResponse = "I hope that demonstrated my abilities...">>
<</switch>>
<<else>>
<<ChatMessage "They're a bit tight and inexperienced, but enthusiastic.">>
<<switch _personality>>
<<case "shy">>
<<set _afterResponse = [
"*tearful* I-I'm sorry... I'm not very experienced... please don't reject me...",
"*embarrassed and upset* That was my first time... I'll get better, I promise...",
"*voice breaking* I'm so embarrassed... I know that wasn't good..."
].random()>>
<<case "confident">>
<<set _afterResponse = [
"*composes self* I admit that could have gone better. I'll improve quickly.",
"Not my finest moment, but everyone starts somewhere. I learn fast.",
"*determined* That wasn't representative. Give me time to develop."
].random()>>
<<case "flirty">>
<<set _afterResponse = [
"*pouts cutely* Oops... I guess I need more practice. Wanna help?",
"*giggles nervously* That wasn't my best... but I'm a quick learner!",
"*playfully embarrassed* I'm better at other things, I swear!"
].random()>>
<<case "desperate">>
<<set _afterResponse = [
"*panicking* I'm sorry! I'll get better! Please don't reject me because of that!",
"*crying* I know that was bad... please, I need this job... I'll practice!",
"*desperately* Give me another chance! I'll improve, I swear!"
].random()>>
<<case "arrogant">>
<<set _afterResponse = [
"*defensive* The conditions weren't ideal. Normally I'm much better.",
"*irritated* That was an off performance. Don't judge me by that.",
"*making excuses* The position was awkward. Under normal circumstances..."
].random()>>
<<case "submissive">>
<<set _afterResponse = [
"*ashamed* I failed you, sir... I'm sorry... please punish me if needed...",
"*crying softly* I wanted to please you so much... I'm so sorry...",
"*begging* Please forgive me... I'll train harder... I'll be better..."
].random()>>
<<case "cynical">>
<<set _afterResponse = [
"*shrugs* Not my specialty, clearly. At least I'm honest about it.",
"Well, that could have gone better. Can't be good at everything.",
"*matter-of-fact* Yeah, that wasn't great. Moving on."
].random()>>
<<default>>
<<set _afterResponse = "Was... was that okay? I can do better with practice...">>
<</switch>>
<</if>>
<<Chat _candidate _afterResponse>>
<<SpendTimeWithoutUpdate 30>>
<<SpendEnergy $player 10>>
/* Increase lust for male/shemale player */
<<if _playerGender != "Female">>
<<set _hornyIncrease = Random(25, 45)>>
<<run $player.status.horny.increase(_hornyIncrease)>>
<</if>>
<div class="brothel-btn-container padding-top">
<<if _playerGender != "Female" && $player.status.horny.value >= $player.status.horny.max>>
<span class="brothel-btn danger"><<button "💦 Cum" "BrothelCasting_CumScene">>
<<set $castingCumType = "Vag">>
<</button>></span>
<<else>>
<span class="brothel-btn secondary"><<button "→ Continue interview" "BrothelCasting_Interview">><</button>></span>
<</if>>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _candidate = $selectedCandidate>>
<<ShowNpcIcon _candidate>>
<<set _corruption = _candidate.attributes.corruption.value>>
<<set _candName = _candidate.info.firstName>>
<<set _personality = _candidate.saveData.get("personality")>>
<<set _requiredCorruption = 6>>
<<set _msg = "You ask " + _candName + " if they would be willing to demonstrate anal...">>
<<ChatMessage _msg>>
<<if _corruption >= _requiredCorruption>>
/* Agreed - personality-based responses */
<<switch _personality>>
<<case "shy">>
<<set _agreeResponse = [
"*blushes deeply but nods* O-okay... if that's what you need to see... *nervously prepares*",
"*face crimson* I... I can do that... just please be gentle...",
"*quietly* Anal? *gulps* ...okay. I'll try my best..."
].random()>>
<<case "confident">>
<<set _agreeResponse = [
"Anal? No problem. I'm trained for everything. Let me show you.",
"Certainly. This is one of my premium skills. Observe.",
"Of course. Comprehensive service requires comprehensive abilities."
].random()>>
<<case "flirty">>
<<set _agreeResponse = [
"*eyes sparkle* Ooh, you're naughty! I like that. *turns and presents* Take a look at this...",
"*giggles excitedly* Mmm, going straight for the back door? I love it!",
"*bites lip seductively* My favorite... let's do this, baby."
].random()>>
<<case "desperate">>
<<set _agreeResponse = [
"Yes! Anal! Whatever you want! I'll prove I can do it all!",
"Of course! Anything! I'll show you I'm worth hiring!",
"Absolutely! I can handle it! Just watch!"
].random()>>
<<case "arrogant">>
<<set _agreeResponse = [
"*sighs dramatically* Fine. But don't think everyone gets this privilege.",
"Very well. You should consider yourself fortunate.",
"I suppose I can demonstrate. Try to appreciate the skill you're about to witness."
].random()>>
<<case "submissive">>
<<set _agreeResponse = [
"Yes, sir. *presents self obediently* Use me as you wish.",
"Of course, master. My body is yours to test however you please.",
"*eagerly positions self* Please take me. I submit completely."
].random()>>
<<case "cynical">>
<<set _agreeResponse = [
"Sure, why not. Anal's just another skill. Let's get it done.",
"*shrugs* Fine. At this point, modesty is just inefficient.",
"Alright. Might as well test everything while we're at it."
].random()>>
<<default>>
<<set _agreeResponse = "Anal? Sure, I don't mind. Let me get ready...">>
<</switch>>
<<Chat _candidate _agreeResponse>>
<<set _msg = _candName + " agrees without hesitation.">>
<<ChatMessage _msg>>
<div class="btn-container padding-top">
<span class="brothel-btn primary"><<button "✓ Proceed with test" "BrothelCasting_TestAnal_Scene">><</button>></span>
<span class="brothel-btn neutral"><<button "← That won't be necessary" "BrothelCasting_Interview">><</button>></span>
</div>
<<elseif _corruption >= 4>>
/* Hesitant - personality-based responses */
<<switch _personality>>
<<case "shy">>
<<set _hesitantResponse = [
"*backs away, terrified* A-anal?! I... I don't know if I can... *trembling*",
"*covers face* That's so embarrassing to ask... I'm not sure...",
"*voice shaking* I've never... I mean... maybe after you hire me...?"
].random()>>
<<case "confident">>
<<set _hesitantResponse = [
"Anal is a specialized service. I'd prefer to discuss terms before demonstrating.",
"That's a significant request. I'm capable, but let's formalize things first.",
"I can do anal, but I don't give premium services for free interviews."
].random()>>
<<case "flirty">>
<<set _hesitantResponse = [
"*pouts* Mmm, anal? That's my special treat... usually saved for after the first date.",
"*teasing* Eager to explore the back entrance? Maybe if you hire me first...",
"*playfully* That's third base, honey. We're still on first. Hire me?"
].random()>>
<<case "desperate">>
<<set _hesitantResponse = [
"*conflicted* I... anal is hard for me... but if it's the only way... maybe?",
"*torn* I want to say yes... I need this job... but it's so much...",
"*nervously* Can... can we try something else first? Please?"
].random()>>
<<case "arrogant">>
<<set _hesitantResponse = [
"*offended* Anal? During an INTERVIEW? What kind of establishment is this?",
"*coldly* That service is for premium clients, not auditions.",
"*scoffs* I don't give that away for free. Have some class."
].random()>>
<<case "submissive">>
<<set _hesitantResponse = [
"*conflicted* I want to obey... but anal scares me a little... I'm sorry...",
"*hesitantly* If you command it, I... I'll try... but please be gentle...",
"*uncertain* I... I'm scared, but... if you really need me to..."
].random()>>
<<case "cynical">>
<<set _hesitantResponse = [
"*suspicious* Anal for a free interview? That's a lot to ask.",
"Let me guess - this 'test' doesn't guarantee a job either. Pass.",
"*raised eyebrow* That's premium service territory. Contract first."
].random()>>
<<default>>
<<set _hesitantResponse = "Anal during an interview? That's... I don't know...">>
<</switch>>
<<Chat _candidate _hesitantResponse>>
<<set _msg = _candName + " is uncomfortable with the request.">>
<<ChatMessage _msg>>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn secondary"><<button "→ Continue interview" "BrothelCasting_Interview">><</button>></span>
</div>
<<else>>
/* Refused - personality-based responses */
<<switch _personality>>
<<case "shy">>
<<set _refuseResponse = [
"*backs away in terror* NO! Please, no... that's... I can't... *starts crying*",
"*shaking uncontrollably* I can't do that... please don't ask me... please...",
"*covers self protectively* That's too much... I'm sorry... I just can't..."
].random()>>
<<case "confident">>
<<set _refuseResponse = [
"Absolutely not. That request is inappropriate for this stage.",
"That's a firm no. I maintain standards regardless of how much I want the job.",
"Not happening. If that's a requirement, I'll find employment elsewhere."
].random()>>
<<case "flirty">>
<<set _refuseResponse = [
"*shakes head playfully* Sorry sweetie, that's WAY too advanced for an interview!",
"*giggles nervously* Nice try! But that exit is for VIP clients only.",
"*winks but firm* The back door is locked until there's a contract, honey."
].random()>>
<<case "desperate">>
<<set _refuseResponse = [
"*sobbing* I want to say yes... I need this job so badly... but I just can't do that...",
"*crying* Please don't make that a requirement... anything else... please...",
"*tears streaming* I'm so sorry... I wish I could... but I can't..."
].random()>>
<<case "arrogant">>
<<set _refuseResponse = [
"*furious* How DARE you?! I'm leaving. This interview is over!",
"*stands up angrily* Absolutely not! This is degrading and unprofessional!",
"*coldly* Consider this interaction terminated. I deserve better."
].random()>>
<<case "submissive">>
<<set _refuseResponse = [
"*cowering* Please... I want to obey... but I'm too scared... forgive me...",
"*crying softly* I can't... I'm so sorry I can't submit to that...",
"*trembling* Please don't hate me for refusing... I just can't..."
].random()>>
<<case "cynical">>
<<set _refuseResponse = [
"*laughs coldly* And there it is. The classic exploitation attempt. Hard no.",
"*stands up* I've seen enough. This 'interview' is a scam. Goodbye.",
"*sarcastically* Sure, free anal for a job that probably doesn't exist. Pass."
].random()>>
<<default>>
<<set _refuseResponse = "Absolutely not! I don't do that, especially not in an interview!">>
<</switch>>
<<Chat _candidate _refuseResponse>>
<<set _msg = _candName + " refuses firmly.">>
<<ChatMessage _msg>>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn secondary"><<button "→ Continue interview" "BrothelCasting_Interview">><</button>></span>
</div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _candidate = $selectedCandidate>>
<<set _anusSize = _candidate.body.anusSize.value>>
<<set _candName = _candidate.info.firstName>>
<<set _candGender = _candidate.gender()>>
<<set _playerGender = $player.gender()>>
<<set _personality = _candidate.saveData.get("personality")>>
/* Determine who is the tester (dom) */
<<if _playerGender == "Female">>
/* Female player - use a brothel worker as tester */
<<set _testerGender = "Male">>
<<set _testerName = "brothel worker">>
<<set _msg = "You call one of your brothel workers to test " + _candName + "'s anal skills.">>
<<ChatMessage _msg>>
<<else>>
/* Male/Shemale player tests directly */
<<set _testerGender = _playerGender>>
<<set _testerName = "you">>
<</if>>
/* Set video - tester fucks candidate's ass */
<<SetAnalPick _testerGender _candGender>>
<<Video _pick>>
/* Personality-based start */
<<switch _personality>>
<<case "shy">>
<<if _playerGender == "Female">>
<<set _msg = _candName + " nervously bends over, trembling as the worker approaches...">>
<<ChatMessage _msg>>
<<else>>
<<set _msg = _candName + " shyly positions themselves, face red with embarrassment...">>
<<ChatMessage _msg>>
<</if>>
<<case "confident">>
<<if _playerGender == "Female">>
<<set _msg = _candName + " confidently assumes the position, ready for the worker...">>
<<ChatMessage _msg>>
<<else>>
<<set _msg = _candName + " smoothly gets into position, completely at ease...">>
<<ChatMessage _msg>>
<</if>>
<<case "flirty">>
<<if _playerGender == "Female">>
<<set _msg = _candName + " wiggles their ass playfully at the worker, beckoning...">>
<<ChatMessage _msg>>
<<else>>
<<set _msg = _candName + " bends over seductively, looking back with a teasing smile...">>
<<ChatMessage _msg>>
<</if>>
<<case "desperate">>
<<if _playerGender == "Female">>
<<set _msg = _candName + " quickly gets into position, eager to prove themselves...">>
<<ChatMessage _msg>>
<<else>>
<<set _msg = _candName + " hurries to position, determined to impress you...">>
<<ChatMessage _msg>>
<</if>>
<<case "arrogant">>
<<if _playerGender == "Female">>
<<set _msg = _candName + " positions themselves with an air of superiority...">>
<<ChatMessage _msg>>
<<else>>
<<set _msg = _candName + " gets into position like they're doing you a favor...">>
<<ChatMessage _msg>>
<</if>>
<<case "submissive">>
<<if _playerGender == "Female">>
<<set _msg = _candName + " obediently presents themselves to the worker...">>
<<ChatMessage _msg>>
<<else>>
<<set _msg = _candName + " submissively offers their body for your use...">>
<<ChatMessage _msg>>
<</if>>
<<case "cynical">>
<<if _playerGender == "Female">>
<<set _msg = _candName + " gets into position without ceremony, ready to proceed...">>
<<ChatMessage _msg>>
<<else>>
<<set _msg = _candName + " positions themselves matter-of-factly...">>
<<ChatMessage _msg>>
<</if>>
<<default>>
<<if _playerGender == "Female">>
<<set _msg = _candName + " bends over the desk as the worker approaches...">>
<<ChatMessage _msg>>
<<else>>
<<set _msg = _candName + " bends over the desk, ready for the test...">>
<<ChatMessage _msg>>
<</if>>
<</switch>>
/* Performance reaction based on anus size AND personality */
<<if _anusSize >= 30>>
<<ChatMessage "They take it easily, moaning with pleasure. Very experienced.">>
<<switch _personality>>
<<case "shy">>
<<set _afterResponse = [
"*panting, blushing furiously* I... I actually liked that... *whispers* a lot...",
"*breathless* Was that good...? *embarrassed but pleased*",
"*quietly moaning* Mmm... I'm surprised how good that felt..."
].random()>>
<<case "confident">>
<<set _afterResponse = [
"*stands gracefully* As demonstrated, I have no limitations.",
"That was barely challenging. Hire me for the advanced experience.",
"*satisfied smile* Perfect technique, even anally. I'm the complete package."
].random()>>
<<case "flirty">>
<<set _afterResponse = [
"*moans happily* Mmm, that was AMAZING! I love it back there...",
"*giggles breathlessly* Can we go again? That was so good!",
"*bites lip* Best part of the interview... hire me and there's more of that..."
].random()>>
<<case "desperate">>
<<set _afterResponse = [
"*eagerly* Was that good?! I can do anal anytime! Hire me!",
"*excitedly* See? I can take it! I'm worth hiring!",
"*hopeful* That proves I'm experienced, right? Right?!"
].random()>>
<<case "arrogant">>
<<set _afterResponse = [
"*smugly* Obviously I excelled. Did you expect less?",
"Natural talent. Not everyone can perform like that.",
"*flips hair* You're welcome for that demonstration."
].random()>>
<<case "submissive">>
<<set _afterResponse = [
"*devotedly* Thank you for using me, sir. My body is yours.",
"*blissfully* I love being taken like that. Please use me more.",
"*submissive gaze* Did my body please you? I exist for your pleasure."
].random()>>
<<case "cynical">>
<<set _afterResponse = [
"*catches breath* There. Anal proficiency confirmed. Hire or don't.",
"*matter-of-fact* Years of practice. That's what experience looks like.",
"Proof delivered. Any more tests or can we move on?"
].random()>>
<<default>>
<<set _afterResponse = "Mmm... I love it. Hire me and you can do this anytime...">>
<</switch>>
<<elseif _anusSize >= 20>>
<<ChatMessage "They handle it reasonably well after some initial adjustment.">>
<<switch _personality>>
<<case "shy">>
<<set _afterResponse = [
"*wincing but smiling* That was... intense... but okay... *blushes*",
"*breathless* It hurt a little... but I think I did okay...?",
"*quietly* It's getting easier... I just need more practice..."
].random()>>
<<case "confident">>
<<set _afterResponse = [
"Not my strongest skill, but certainly adequate. I'll improve.",
"That was competent. With more practice, I'll master it.",
"Reasonable performance. Room for growth, which I'll achieve."
].random()>>
<<case "flirty">>
<<set _afterResponse = [
"*playfully* Whew! That was intense! Practice makes perfect though...",
"*giggles* Not bad, right? I'll get even better with time!",
"*winks* A few more sessions and I'll be a pro back there!"
].random()>>
<<case "desperate">>
<<set _afterResponse = [
"That was okay, right? I'll improve! I promise I'll practice!",
"*anxiously* I know I can do better! Just give me a chance!",
"I handled it! Please, that shows potential, right?!"
].random()>>
<<case "arrogant">>
<<set _afterResponse = [
"*dismissive* That was adequate given the circumstances.",
"Not my fault it wasn't perfect - better conditions would help.",
"*brushes off* Decent enough. I was holding back anyway."
].random()>>
<<case "submissive">>
<<set _afterResponse = [
"*apologetic* I tried my best, sir. Was it acceptable?",
"*head bowed* I hope I pleased you. I'll train harder.",
"Thank you for using me. I'll improve for you, I promise."
].random()>>
<<case "cynical">>
<<set _afterResponse = [
"Decent performance. Not my specialty but I manage.",
"*shrugs* Average-plus. Good enough for most clients.",
"There. Proof I can handle it. Not spectacular, but solid."
].random()>>
<<default>>
<<set _afterResponse = "Ahh... that was intense but good...">>
<</switch>>
<<else>>
<<ChatMessage "It's clearly uncomfortable for them, but they endure it.">>
<<switch _personality>>
<<case "shy">>
<<set _afterResponse = [
"*crying softly* Ow... that really hurt... I'm so sorry I'm not better...",
"*tearful* I tried... I really tried... please don't reject me...",
"*sobbing quietly* It's okay... I'll learn... I'll get used to it..."
].random()>>
<<case "confident">>
<<set _afterResponse = [
"*composed despite discomfort* That was challenging. I'll work on it.",
"Admittedly not my best area. I'm committed to improvement.",
"*recovering* That needs work. I acknowledge my weaknesses and address them."
].random()>>
<<case "flirty">>
<<set _afterResponse = [
"*wincing cutely* Ouch! Okay, that one needs practice...",
"*laughs through discomfort* Bigger than I expected! I'll adapt!",
"*pouts* That wasn't my best... but I'll get the hang of it!"
].random()>>
<<case "desperate">>
<<set _afterResponse = [
"*crying in pain* I'm sorry! I know that was bad! Please give me a chance to improve!",
"*sobbing* It hurt so much... but I'll practice! I promise!",
"*desperately through tears* Don't reject me for this! I'll get better!"
].random()>>
<<case "arrogant">>
<<set _afterResponse = [
"*in pain but defensive* That was... the angle was wrong. Normally I'm better.",
"*irritated* Unprepared conditions. That wasn't a fair test.",
"*grimacing* I wasn't ready. Under proper circumstances..."
].random()>>
<<case "submissive">>
<<set _afterResponse = [
"*crying* I'm so sorry, sir... I failed... please punish me...",
"*in pain* I disappointed you... I'm ashamed... please forgive me...",
"*sobbing* I'll train harder... I'll stretch myself... please don't reject me..."
].random()>>
<<case "cynical">>
<<set _afterResponse = [
"*grimaces* Look, anal isn't my strongest area. At least I'm honest.",
"*wincing* That wasn't great. Can't be good at everything.",
"*recovering* Not ideal. But most clients don't even ask for that."
].random()>>
<<default>>
<<set _afterResponse = "Ow... it's been a while... I'll get better at this...">>
<</switch>>
<<run _candidate.body.anusSize.increase(2)>>
<</if>>
<<Chat _candidate _afterResponse>>
<<SpendTimeWithoutUpdate 30>>
<<SpendEnergy $player 15>>
/* Increase lust for male/shemale player */
<<if _playerGender != "Female">>
<<set _hornyIncrease = Random(30, 50)>>
<<run $player.status.horny.increase(_hornyIncrease)>>
<</if>>
<div class="brothel-btn-container padding-top">
<<if _playerGender != "Female" && $player.status.horny.value >= $player.status.horny.max>>
<span class="brothel-btn danger"><<button "💦 Cum" "BrothelCasting_CumScene">>
<<set $castingCumType = "Anal">>
<</button>></span>
<<else>>
<span class="brothel-btn secondary"><<button "→ Continue interview" "BrothelCasting_Interview">><</button>></span>
<</if>>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _candidate = $selectedCandidate>>
<<ShowNpcIcon _candidate>>
<<set _corruption = _candidate.attributes.corruption.value>>
<<set _candName = _candidate.info.firstName>>
<<set _personality = _candidate.saveData.get("personality")>>
<<set _requiredCorruption = 3>>
<<set _msg = "You offer to let " + _candName + " demonstrate his skills on you...">>
<<ChatMessage _msg>>
<<if _corruption >= _requiredCorruption>>
<<switch _personality>>
<<case "shy">>
<<set _agreeResponse = "*blushes deeply* R-really? You want me to... with you? *nervously excited* O-okay...">>
<<case "confident">>
<<set _agreeResponse = "A hands-on test? Perfect. Prepare yourself - I don't hold back.">>
<<case "flirty">>
<<set _agreeResponse = "*grins eagerly* Mmm, now that's what I call a job perk! Come here, boss...">>
<<case "desperate">>
<<set _agreeResponse = "Yes! I'll show you exactly how good I am! You won't regret this!">>
<<case "arrogant">>
<<set _agreeResponse = "*smirks* Finally, a proper evaluation. Don't worry - I'll be gentle... or not.">>
<<case "submissive">>
<<set _agreeResponse = "If that's what you command... I'll do my best to please you, sir.">>
<<case "cynical">>
<<set _agreeResponse = "*raises eyebrow* The boss wants to test the merchandise personally? Alright, let's do this.">>
<<default>>
<<set _agreeResponse = "Sure, I'm ready to show you what I can do.">>
<</switch>>
<<Chat _candidate _agreeResponse>>
<div class="btn-container padding-top">
<span class="brothel-btn primary"><<button "✓ Proceed with test" "BrothelCasting_TestVaginal_ReceiveFromMale_Scene">><</button>></span>
<span class="brothel-btn neutral"><<button "← That won't be necessary" "BrothelCasting_Interview">><</button>></span>
</div>
<<else>>
<<switch _personality>>
<<case "shy">>
<<set _refuseResponse = "*shocked* W-what?! I... I couldn't... not like this... *backs away*">>
<<case "confident">>
<<set _refuseResponse = "I don't do that during interviews. Hire me first, then we can discuss benefits.">>
<<case "flirty">>
<<set _refuseResponse = "*winks* Tempting, but I save the good stuff for after I'm hired. Anticipation, you know?">>
<<case "desperate">>
<<set _refuseResponse = "*conflicted* I... I really want this job but... can we do this after you hire me? Please?">>
<<case "arrogant">>
<<set _refuseResponse = "*scoffs* You think I'd give that away for free? Hire me first.">>
<<case "submissive">>
<<set _refuseResponse = "*trembling* I want to obey but... I'm not ready yet... please forgive me...">>
<<case "cynical">>
<<set _refuseResponse = "Nice try. Sex comes after employment, not before. Basic business.">>
<<default>>
<<set _refuseResponse = "I'd prefer to save that for after I'm hired.">>
<</switch>>
<<Chat _candidate _refuseResponse>>
<<ChatMessage "They refused. Higher corruption might make them more willing.">>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn neutral"><<button "← Back to interview" "BrothelCasting_Interview">><</button>></span>
</div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _candidate = $selectedCandidate>>
<<set _penisSize = _candidate.body.penisSize.value>>
<<set _candName = _candidate.info.firstName>>
<<set _candGender = _candidate.gender()>>
<<set _playerGender = $player.gender()>>
<<set _personality = _candidate.saveData.get("personality")>>
/* Video - male candidate fucks player's vagina */
<<SetVagPick _candGender _playerGender>>
<<Video _pick>>
<<set _msg = _candName + " takes control and begins demonstrating his skills...">>
<<ChatMessage _msg>>
<<if _penisSize >= 30>>
<<ChatMessage "He's impressively well-endowed and knows how to use it.">>
<<elseif _penisSize >= 20>>
<<ChatMessage "He has good size and technique.">>
<<else>>
<<ChatMessage "What he lacks in size, he makes up for with enthusiasm.">>
<</if>>
<<SpendTimeWithoutUpdate 30>>
<<run $player.status.energy.decrease(15)>>
/* Increase player horny */
<<if $player.gender() != "Male">>
<<run $player.status.horny.increase(25)>>
<</if>>
<<switch _personality>>
<<case "shy">>
<<set _afterResponse = "*panting, embarrassed* W-was that... okay? I tried my best...">>
<<case "confident">>
<<set _afterResponse = "*satisfied grin* That's just a taste. Hire me and your clients will be begging for more.">>
<<case "flirty">>
<<set _afterResponse = "*breathless* Mmm, that was fun! Did I pass the test, boss? *winks*">>
<<case "desperate">>
<<set _afterResponse = "*hopeful* Was that good enough?! I can do better! Please hire me!">>
<<case "arrogant">>
<<set _afterResponse = "*smirks* Obviously impressive. You're welcome.">>
<<case "submissive">>
<<set _afterResponse = "*kneeling* Thank you for allowing me to serve you... Did I please you?">>
<<case "cynical">>
<<set _afterResponse = "There. Proof of ability. Now, about that job...">>
<<default>>
<<set _afterResponse = "How was that? I can definitely handle your clients.">>
<</switch>>
<<Chat _candidate _afterResponse>>
<div class="btn-container padding-top">
<span class="brothel-btn secondary"><<button "→ Continue interview" "BrothelCasting_Interview">><</button>></span>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _candidate = $selectedCandidate>>
<<ShowNpcIcon _candidate>>
<<set _corruption = _candidate.attributes.corruption.value>>
<<set _candName = _candidate.info.firstName>>
<<set _personality = _candidate.saveData.get("personality")>>
<<set _requiredCorruption = 5>>
<<set _msg = "You offer to let " + _candName + " test his anal skills on you...">>
<<ChatMessage _msg>>
<<if _corruption >= _requiredCorruption>>
<<switch _personality>>
<<case "shy">>
<<set _agreeResponse = "*eyes widen* Y-you want me to... there? *nervous but excited* I... I'll be careful...">>
<<case "confident">>
<<set _agreeResponse = "Anal? My specialty. Hope you're ready for an intense experience.">>
<<case "flirty">>
<<set _agreeResponse = "*licks lips* Ooh, the boss likes it rough? I can definitely deliver...">>
<<case "desperate">>
<<set _agreeResponse = "Yes! Anything you want! I'll prove I'm worth hiring!">>
<<case "arrogant">>
<<set _agreeResponse = "*smirks* Going for the advanced test? Bold. I like it.">>
<<case "submissive">>
<<set _agreeResponse = "If you wish to use your body to test me... I am honored to serve.">>
<<case "cynical">>
<<set _agreeResponse = "Full service evaluation, huh? Alright, let's see what you can handle.">>
<<default>>
<<set _agreeResponse = "Sure, I'm ready to demonstrate my full capabilities.">>
<</switch>>
<<Chat _candidate _agreeResponse>>
<div class="btn-container padding-top">
<span class="brothel-btn primary"><<button "✓ Proceed with test" "BrothelCasting_TestAnal_ReceiveFromMale_Scene">><</button>></span>
<span class="brothel-btn neutral"><<button "← That won't be necessary" "BrothelCasting_Interview">><</button>></span>
</div>
<<else>>
<<switch _personality>>
<<case "shy">>
<<set _refuseResponse = "*shakes head rapidly* N-no! That's... that's too much! I can't!">>
<<case "confident">>
<<set _refuseResponse = "That's a premium service. Hire me first if you want that level of demonstration.">>
<<case "flirty">>
<<set _refuseResponse = "*playful pout* That's my special move - save it for when I'm officially employed.">>
<<case "desperate">>
<<set _refuseResponse = "*tears up* I want to please you but... I'm not ready for that yet...">>
<<case "arrogant">>
<<set _refuseResponse = "*coldly* Absolutely not. That privilege is earned, not given in interviews.">>
<<case "submissive">>
<<set _refuseResponse = "*trembling* Forgive me... I'm too scared to do that right now...">>
<<case "cynical">>
<<set _refuseResponse = "No way. Anal is post-employment only. I have standards.">>
<<default>>
<<set _refuseResponse = "I'm not comfortable with that during an interview.">>
<</switch>>
<<Chat _candidate _refuseResponse>>
<<ChatMessage "They refused. Higher corruption might make them more willing.">>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn neutral"><<button "← Back to interview" "BrothelCasting_Interview">><</button>></span>
</div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _candidate = $selectedCandidate>>
<<set _penisSize = _candidate.body.penisSize.value>>
<<set _candName = _candidate.info.firstName>>
<<set _candGender = _candidate.gender()>>
<<set _playerGender = $player.gender()>>
<<set _personality = _candidate.saveData.get("personality")>>
/* Video - male candidate fucks player's ass */
<<SetAnalPick _candGender _playerGender>>
<<Video _pick>>
<<set _msg = _candName + " positions himself and begins the demonstration...">>
<<ChatMessage _msg>>
<<if _penisSize >= 30>>
<<ChatMessage "His impressive size makes the experience intense.">>
<<elseif _penisSize >= 20>>
<<ChatMessage "He knows exactly how to use what he has.">>
<<else>>
<<ChatMessage "He focuses on technique and rhythm.">>
<</if>>
<<SpendTimeWithoutUpdate 30>>
<<run $player.status.energy.decrease(20)>>
/* Increase player horny */
<<run $player.status.horny.increase(30)>>
<<switch _personality>>
<<case "shy">>
<<set _afterResponse = "*panting heavily, blushing* I... I hope that was... good? *avoids eye contact*">>
<<case "confident">>
<<set _afterResponse = "*satisfied* That's what I bring to the table. Your clients will be very happy.">>
<<case "flirty">>
<<set _afterResponse = "*wipes sweat* Mmm, that was hot! You really know how to evaluate talent, boss~">>
<<case "desperate">>
<<set _afterResponse = "*gasping* Did I do well?! Please say yes! I need this job!">>
<<case "arrogant">>
<<set _afterResponse = "*smirks* Impressed? Of course you are. I'm the best at what I do.">>
<<case "submissive">>
<<set _afterResponse = "*kneeling* Thank you for letting me serve you so intimately... Was it pleasing?">>
<<case "cynical">>
<<set _afterResponse = "*catching breath* Full demonstration complete. So, do I get the job?">>
<<default>>
<<set _afterResponse = "That's what I can offer. Your clients will love it.">>
<</switch>>
<<Chat _candidate _afterResponse>>
<div class="btn-container padding-top">
<span class="brothel-btn secondary"><<button "→ Continue interview" "BrothelCasting_Interview">><</button>></span>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _candidate = $selectedCandidate>>
<<ShowNpcIcon _candidate>>
<<set _candName = _candidate.info.firstName>>
<<set _corruption = _candidate.attributes.corruption.value>>
<<set _submission = _candidate.saveData.get("submission") || 3>>
<<set _personality = _candidate.saveData.get("personality")>>
/* Calculate acceptance chance */
/* Higher corruption and submission = more likely to accept */
<<set _acceptChance = (_corruption * 5) + (_submission * 10)>>
/* Max 80% chance */
<<set _acceptChance = Math.min(80, _acceptChance)>>
<<set _msg = "You explain to " + _candName + " that while you appreciate his application, your clientele primarily desires feminine workers. However, you could offer him a feminization procedure...">>
<<ChatMessage _msg>>
<<set _roll = Random(1, 100)>>
<<if _roll <= _acceptChance>>
/* Accepted - personality based response */
<<switch _personality>>
<<case "shy">>
<<set _acceptResponse = "*looks down, conflicted* I... I've actually thought about this before... *quietly* Maybe it wouldn't be so bad...">>
<<case "confident">>
<<set _acceptResponse = "Interesting proposition. If that's what's required to succeed here, I'm willing to adapt.">>
<<case "flirty">>
<<set _acceptResponse = "*giggles* Become a pretty girl? That actually sounds kind of exciting! I'm in!">>
<<case "desperate">>
<<set _acceptResponse = "*nodding eagerly* Yes! Anything! If that's what it takes, I'll do it! I need this job!">>
<<case "arrogant">>
<<set _acceptResponse = "*sighs* If you think that's what will make me more valuable... fine. I'll be the best at being feminine too.">>
<<case "submissive">>
<<set _acceptResponse = "*kneeling* If that is your wish for me, I will obey. Transform me however you desire.">>
<<case "cynical">>
<<set _acceptResponse = "*considers* It's a big change... but if that's what the market demands, I can adapt.">>
<<default>>
<<set _acceptResponse = "Alright... if that's what you need, I'm willing to try it.">>
<</switch>>
<<Chat _candidate _acceptResponse>>
<fieldset style="background: rgba(233, 30, 99, 0.15); border: 1px solid #e91e63; margin-top: 15px;">
<legend style="color: #f48fb1;">Choose Transformation Level</legend>
<p style="color: #aaa; font-size: 11px; margin-bottom: 10px;">💰 Your money: $<<print $player.money>></p>
<div class="brothel-btn-container" style="flex-direction: column;">
<<if $player.money >= 500>>
<span class="brothel-btn secondary" style="width: 100%;"><<button "🍆➡️🍑 Transform to Shemale ($500)">>
<<set $feminizationLevel = "shemale">>
<<goto "BrothelCasting_Feminization_Confirm">>
<</button>></span>
<<else>>
<span class="brothel-btn disabled" style="width: 100%;"><<button "🍆➡️🍑 Transform to Shemale ($500) - Not enough money">><</button>></span>
<</if>>
<<if $player.money >= 1000>>
<span class="brothel-btn primary" style="width: 100%;"><<button "🍆➡️💕 Transform to Female ($1000)">>
<<set $feminizationLevel = "female">>
<<goto "BrothelCasting_Feminization_Confirm">>
<</button>></span>
<<else>>
<span class="brothel-btn disabled" style="width: 100%;"><<button "🍆➡️💕 Transform to Female ($1000) - Not enough money">><</button>></span>
<</if>>
<span class="brothel-btn neutral" style="width: 100%;"><<button "← Maybe later" "BrothelCasting_Interview">><</button>></span>
</div>
</fieldset>
<<else>>
/* Refused */
<<switch _personality>>
<<case "shy">>
<<set _refuseResponse = "*shakes head fearfully* N-no! I... I can't change who I am! That's too scary!">>
<<case "confident">>
<<set _refuseResponse = "No. I am who I am. If you can't use me as a man, find someone else.">>
<<case "flirty">>
<<set _refuseResponse = "*pouts* Aww, but I like being a guy! Can't you make an exception?">>
<<case "desperate">>
<<set _refuseResponse = "*tears up* I... I want the job but... I can't... I just can't do that...">>
<<case "arrogant">>
<<set _refuseResponse = "*scoffs* Change myself to suit your business? Absolutely not. Take me as I am or not at all.">>
<<case "submissive">>
<<set _refuseResponse = "*trembling* I want to obey but... this is too much... I'm sorry, I can't...">>
<<case "cynical">>
<<set _refuseResponse = "That's a permanent change. Not worth any job. I'll find work elsewhere.">>
<<default>>
<<set _refuseResponse = "No, I'm not willing to go that far. I'll look for other opportunities.">>
<</switch>>
<<Chat _candidate _refuseResponse>>
<<ChatMessage "They firmly refused the feminization offer. Perhaps a candidate with higher corruption or submission would be more open to it.">>
/* Mark that feminization was attempted and refused */
<<run _candidate.saveData.set("feminizationAttempted", true)>>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn neutral"><<button "← Back to interview" "BrothelCasting_Interview">><</button>></span>
</div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
/* Feminization costs */
<<set _shemaleCost = 500>>
<<set _femaleCost = 1000>>
<<if $feminizationLevel == "shemale">>
<<set _cost = _shemaleCost>>
<<else>>
<<set _cost = _femaleCost>>
<</if>>
<<if $player.money < _cost>>
<<ChatMessage "You don't have enough money for this procedure!">>
<<set _costMsg = "Cost: $" + _cost + " | Your money: $" + $player.money>>
<<ChatMessage _costMsg>>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn neutral"><<button "← Back" "BrothelCasting_OfferFeminization">><</button>>
</div>
<<else>>
/* Deduct cost */
<<set $player.money -= _cost>>
<<ShowNpcIcon $selectedCandidate>>
<<set _candName = $selectedCandidate.info.firstName>>
<<set _personality = $selectedCandidate.saveData.get("personality")>>
<<set _candId = $selectedCandidate.info.id>>
<<if $feminizationLevel == "shemale">>
<<set _costMsg = "You pay $" + _shemaleCost + " for the shemale transformation procedure.">>
<<ChatMessage _costMsg>>
<<set _transformMsg = "You prepare to transform " + _candName + " into a shemale - adding feminine features while keeping the penis.">>
<<ChatMessage _transformMsg>>
/* Apply transformation - femininity = breastSize + buttSize + face, need > 4 for Shemale */
<<set _newBreast = Random(2, 4)>>
<<set _newButt = Random(2, 3)>>
<<set _newFace = Random(5, 7)>>
/* Find and update character in $Characters array directly */
<<for _i = 0; _i < $Characters.length; _i++>>
<<if $Characters[_i].info.id == _candId>>
<<set $Characters[_i].info.originGender = "Trans">>
<<set $Characters[_i].body.breastSize.value = _newBreast>>
<<set $Characters[_i].body.buttSize.value = _newButt>>
<<set $Characters[_i].body.face.value = _newFace>>
<<set $Characters[_i].body.vaginaSize.value = 0>>
<<run $Characters[_i].saveData.set("feminized", "shemale")>>
<<run $Characters[_i].saveData.set("feminizedByPlayer", true)>>
/* Update $selectedCandidate reference */
<<set $selectedCandidate = $Characters[_i]>>
<<break>>
<</if>>
<</for>>
<<switch _personality>>
<<case "shy">>
<<set _transformResponse = "*looks at new body in wonder* Oh my... I... I have breasts now... *touches them shyly*">>
<<case "confident">>
<<set _transformResponse = "*examines new curves* Impressive work. I think I can work with this.">>
<<case "flirty">>
<<set _transformResponse = "*giggles excitedly* Ooh! Look at these! *bounces* This is actually really fun!">>
<<case "desperate">>
<<set _transformResponse = "*relieved* Thank you! Thank you so much! I'll be the best shemale worker you have!">>
<<case "arrogant">>
<<set _transformResponse = "*studies reflection* Hmm. Not bad. I make an attractive shemale, as expected.">>
<<case "submissive">>
<<set _transformResponse = "*kneeling* Thank you for reshaping me to serve you better, master...">>
<<case "cynical">>
<<set _transformResponse = "*looks down at chest* Well... that's different. I suppose it could be worse.">>
<<default>>
<<set _transformResponse = "Wow... this is quite a change. I think I can get used to it.">>
<</switch>>
<<else>>
<<set _costMsg = "You pay $" + _femaleCost + " for the full female transformation procedure.">>
<<ChatMessage _costMsg>>
<<set _transformMsg = "You prepare to fully transform " + _candName + " into a woman.">>
<<ChatMessage _transformMsg>>
/* Apply full transformation - add vagina to make Female */
<<set _newBreast = Random(2, 5)>>
<<set _newButt = Random(2, 4)>>
<<set _newVagina = Random(15, 35)>>
<<set _newFace = Random(5, 8)>>
/* Find and update character in $Characters array directly */
<<for _i = 0; _i < $Characters.length; _i++>>
<<if $Characters[_i].info.id == _candId>>
<<set $Characters[_i].info.originGender = "Female">>
<<set $Characters[_i].body.breastSize.value = _newBreast>>
<<set $Characters[_i].body.buttSize.value = _newButt>>
<<set $Characters[_i].body.vaginaSize.value = _newVagina>>
<<set $Characters[_i].body.penisSize.value = 0>>
<<set $Characters[_i].body.face.value = _newFace>>
<<run $Characters[_i].saveData.set("feminized", "female")>>
<<run $Characters[_i].saveData.set("feminizedByPlayer", true)>>
/* Update $selectedCandidate reference */
<<set $selectedCandidate = $Characters[_i]>>
<<break>>
<</if>>
<</for>>
<<switch _personality>>
<<case "shy">>
<<set _transformResponse = "*gasps, looking at completely transformed body* I'm... I'm really a woman now... *voice now feminine* This is so strange...">>
<<case "confident">>
<<set _transformResponse = "*examines new body* Complete transformation. I can adapt. Watch me become the best.">>
<<case "flirty">>
<<set _transformResponse = "*twirls excitedly* Oh my god! I'm a real girl now! *giggles in new voice* This is amazing!">>
<<case "desperate">>
<<set _transformResponse = "*crying happy tears* Thank you! I'll be the best woman worker! I promise!">>
<<case "arrogant">>
<<set _transformResponse = "*admiring new figure* Well... I do make a stunning woman. As expected of me.">>
<<case "submissive">>
<<set _transformResponse = "*bowing in new body* You have remade me completely. I am yours in this new form.">>
<<case "cynical">>
<<set _transformResponse = "*looking at reflection* This is... definitely not what I expected from today. But I guess this is my life now.">>
<<default>>
<<set _transformResponse = "I'm... completely different now. It'll take some getting used to.">>
<</switch>>
<</if>>
<<Chat $selectedCandidate _transformResponse>>
<<set _msg = _candName + " has been successfully transformed! Their appearance is now more appealing for your clientele.">>
<<ChatMessage _msg>>
<div class="btn-container padding-top">
<span class="brothel-btn secondary"><<button "→ Continue interview" "BrothelCasting_Interview">><</button>></span>
</div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _candidate = $selectedCandidate>>
<<ShowNpcIcon _candidate>>
<<set _candName = _candidate.info.firstName>>
<<set _personality = _candidate.saveData.get("personality")>>
<<set _originalCost = $candidateHiringCost>>
/* Mark as haggled */
<<run _candidate.saveData.set("haggled", true)>>
/* Success chance based on speech */
<<set _successChance = 40 + ($player.attributes.speech.value * 5)>>
<<set _roll = random(1, 100)>>
<<if _roll <= _successChance>>
/* Success - reduce price by 30% */
<<set _discount = Math.floor(_originalCost * 0.3)>>
<<set $candidateHiringCost = _originalCost - _discount>>
<<switch _personality>>
<<case "shy">>
<<Chat _candidate "*fidgets nervously* W-well... I suppose I could accept a bit less...">>
<<case "confident">>
<<Chat _candidate "*sighs* You drive a hard bargain. Fine, I'll take the lower offer.">>
<<case "flirty">>
<<Chat _candidate "*winks* Alright handsome, just for you I'll lower my price~">>
<<case "submissive">>
<<Chat _candidate "*bows head* Of course... whatever you think is fair...">>
<<case "aggressive">>
<<Chat _candidate "*grumbles* Ugh, fine. But you better treat me well for this.">>
<<default>>
<<Chat _candidate "Alright, I'll accept your offer.">>
<</switch>>
<<set _successMsg = "Success! The price has been reduced from $" + _originalCost + " to $" + $candidateHiringCost + " (-$" + _discount + ")!">>
<<ChatMessage _successMsg>>
<<else>>
/* Failure */
<<switch _personality>>
<<case "shy">>
<<Chat _candidate "*shakes head timidly* I-I'm sorry, but I really can't go lower...">>
<<case "confident">>
<<Chat _candidate "*crosses arms* Absolutely not. My skills are worth every penny.">>
<<case "flirty">>
<<Chat _candidate "*pouts* Aww, nice try sweetie, but no~">>
<<case "submissive">>
<<Chat _candidate "*looks away sadly* I'm sorry, but I really need that amount...">>
<<case "aggressive">>
<<Chat _candidate "*glares* Don't insult me with lowball offers. Take it or leave it.">>
<<default>>
<<Chat _candidate "I can't accept that. The original price stands.">>
<</switch>>
<<set _negFailMsg = "Negotiation failed. The price remains $" + _originalCost + ".">>
<<ChatMessage _negFailMsg>>
<</if>>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn secondary"><<button "→ Continue" "BrothelCasting_Interview">><</button>></span>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _candidate = $selectedCandidate>>
<<ShowNpcIcon _candidate>>
<<set _candName = _candidate.info.firstName>>
<<set _personality = _candidate.saveData.get("personality")>>
/* Rejection reaction based on personality */
<<switch _personality>>
<<case "shy">>
<<set _rejectResponse = [
"*tears welling up* Oh... I see... *voice breaks* I'm sorry I wasn't good enough...",
"*looks down, crying softly* I understand... thank you for... for seeing me...",
"*sniffles* I knew I wasn't right for this... *wipes eyes* goodbye..."
].random()>>
<<case "confident">>
<<set _rejectResponse = [
"*nods professionally* I understand. Perhaps we're not the right fit. Good luck.",
"Very well. It's your loss, but I respect the decision. Farewell.",
"I appreciate your time. I'll find a better opportunity elsewhere."
].random()>>
<<case "flirty">>
<<set _rejectResponse = [
"*pouts* Aww, really? *sighs* Well, you know where to find me if you change your mind...",
"*disappointed but playful* Your loss, handsome. Call me if you reconsider?",
"*winks sadly* Too bad. We could have had so much fun together..."
].random()>>
<<case "desperate">>
<<set _rejectResponse = [
"*breaks down crying* No! Please! I'll do anything! Don't send me away!",
"*sobbing* Please reconsider! I need this job! I'll do whatever you want!",
"*grabs your arm* Wait! Please! Give me another chance! I'm begging you!"
].random()>>
<<case "arrogant">>
<<set _rejectResponse = [
"*scoffs* YOUR loss. This place couldn't handle someone like me anyway.",
"*laughs coldly* Please. I was doing YOU a favor by showing up. Goodbye.",
"*stands angrily* Fine! You'll regret this when you see me at a better establishment!"
].random()>>
<<case "submissive">>
<<set _rejectResponse = [
"*head bowed* I understand, sir. I wasn't worthy. *leaves quietly*",
"*sadly* I'm sorry I couldn't please you. I'll try to be better for someone else...",
"*crying softly* Thank you for considering me, master. I'm sorry I failed..."
].random()>>
<<case "cynical">>
<<set _rejectResponse = [
"*shrugs* Expected as much. Thanks for wasting my time, I guess.",
"*coldly* Right. Another interview that goes nowhere. Classic.",
"*sarcastically* Great. Glad I came all this way for nothing. Bye."
].random()>>
<<default>>
<<set _rejectResponse = "Oh... I understand. Thank you for your time.">>
<</switch>>
<<Chat _candidate _rejectResponse>>
<<set _msg = "You reject " + _candName + ". They leave.">>
<<ChatMessage _msg>>
/* Remove candidate from list and game */
<<set _candIndex = $castingCandidates.indexOf(_candidate.info.id)>>
<<if _candIndex > -1>>
<<run $castingCandidates.splice(_candIndex, 1)>>
<</if>>
<<set _charIndex = $Characters.indexOf(_candidate)>>
<<if _charIndex > -1>>
<<run $Characters.splice(_charIndex, 1)>>
<</if>>
<<unset $selectedCandidate $candidateHiringCost>>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn secondary"><<button "→ Continue" "BrothelCasting_ViewCandidates">><</button>></span>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _candidate = $selectedCandidate>>
<<set _cost = $candidateHiringCost>>
<<ShowNpcIcon _candidate>>
/* Deduct money */
<<set $player.money -= _cost>>
/* Add to brothel */
<<run $playerBrothel.prostitutes.push(_candidate.info.id)>>
/* Update candidate's work status */
<<run SetNpcScriptedRole(_candidate, "Brothel Worker")>>
<<run _candidate.info.currentLocation = "PlayerBrothel_Rooms">>
/* Initialize brothel worker stats */
<<set _baseSubmission = Random(1, 3)>>
<<set _baseAffection = Random(1, 3)>>
<<set _baseFear = Random(0, 2)>>
/* Adjust based on personality */
<<set _personality = _candidate.saveData.get("personality")>>
<<switch _personality>>
<<case "shy">>
<<set _baseSubmission += 2>>
<<set _baseFear += 1>>
<<case "confident">>
<<set _baseSubmission -= 1>>
<<case "submissive">>
<<set _baseSubmission += 4>>
<<set _baseAffection += 1>>
<<case "arrogant">>
<<set _baseSubmission -= 2>>
<<case "desperate">>
<<set _baseSubmission += 2>>
<<set _baseAffection += 2>>
<<case "flirty">>
<<set _baseAffection += 2>>
<</switch>>
/* Clamp values */
<<set _baseSubmission = Math.max(0, Math.min(10, _baseSubmission))>>
<<set _baseAffection = Math.max(0, Math.min(10, _baseAffection))>>
<<set _baseFear = Math.max(0, Math.min(10, _baseFear))>>
/* Store stats in saveData */
<<run _candidate.saveData.set("submission", _baseSubmission)>>
<<run _candidate.saveData.set("affection", _baseAffection)>>
<<run _candidate.saveData.set("fear", _baseFear)>>
<<run _candidate.saveData.set("weeklySalary", _cost)>>
/* Remove from casting candidates list */
<<set _candIndex = $castingCandidates.indexOf(_candidate.info.id)>>
<<if _candIndex > -1>>
<<run $castingCandidates.splice(_candIndex, 1)>>
<</if>>
<<set _candName = _candidate.info.firstName>>
<<set _personality = _candidate.saveData.get("personality")>>
/* Hire reaction based on personality */
<<switch _personality>>
<<case "shy">>
<<set _hireResponse = [
"*eyes wide with joy* R-really?! *tears of happiness* Thank you so much! I'll work so hard!",
"*gasps* You're... you're hiring me? *trembling with happiness* I won't disappoint you!",
"*crying happy tears* Thank you, thank you! *bows repeatedly* I'll do my very best!"
].random()>>
<<case "confident">>
<<set _hireResponse = [
"Excellent choice. You won't regret this decision. I'll be your best worker.",
"Smart move. I knew you'd recognize quality when you saw it. Let's get to work.",
"Thank you for making the right decision. I'll exceed all your expectations."
].random()>>
<<case "flirty">>
<<set _hireResponse = [
"*jumps excitedly* Yay! This is going to be so much fun! *hugs you* Thank you!",
"*squeals happily* I knew you'd pick me! *kisses your cheek* We're going to be amazing together!",
"*giggles joyfully* Best decision ever! I promise to make this place extra... exciting."
].random()>>
<<case "desperate">>
<<set _hireResponse = [
"*bursts into tears of relief* Thank you! Thank you so much! You saved me!",
"*falls to knees crying* I can't believe it! Thank you! I'll work harder than anyone!",
"*sobbing with joy* You won't regret this! I promise! I'll give everything I have!"
].random()>>
<<case "arrogant">>
<<set _hireResponse = [
"*smirks* Finally, recognition. Don't worry, you made the right choice. I'll make this place famous.",
"About time. I expect proper compensation for my talents. You won't be disappointed.",
"*nods approvingly* Good. At least you can recognize quality. Let's discuss my schedule."
].random()>>
<<case "submissive">>
<<set _hireResponse = [
"*kneels gratefully* Thank you, master. I am yours to command. Use me as you wish.",
"*head bowed* I'm so grateful, sir. I'll obey every order and serve perfectly.",
"*devotedly* Thank you for accepting me. My body and service belong to you now."
].random()>>
<<case "cynical">>
<<set _hireResponse = [
"*slightly surprised* Huh. You actually hired me. Well... thanks. I'll do good work.",
"*small smile* Fair enough. I'll earn my keep. At least this place seems legitimate.",
"Alright then. Thanks for the opportunity. Let's see how this goes."
].random()>>
<<default>>
<<set _hireResponse = "Thank you so much! I won't let you down!">>
<</switch>>
<<Chat _candidate _hireResponse>>
<<set _msg = "You hired " + _candName + " for $" + _cost + ".">>
<<ChatMessage _msg>>
<<ChatMessage "They are now working in your brothel and will generate income daily.">>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn success"><<button "→ Continue" "BrothelCasting_ViewCandidates">>
<<unset $selectedCandidate $candidateHiringCost>>
<</button>></span>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _candidate = $selectedCandidate>>
<<set _candName = _candidate.info.firstName>>
<<set _candGender = _candidate.gender()>>
<<set _playerGender = $player.gender()>>
<<set _personality = _candidate.saveData.get("personality")>>
<<ChatMessage "You feel yourself reaching the edge...">>
/* Set cumshot video based on the type of sex */
<<set _cumInside = Random(0, 100) > 50>>
<<switch $castingCumType>>
<<case "Oral">>
/* Cumming in/on mouth */
<<if _cumInside>>
<<SetOralCumInPick _playerGender _candGender>>
<<set _cumMsg = "You cum in " + _candName + "'s mouth.">>
<<else>>
<<SetOralCumOutPick _playerGender _candGender>>
<<set _cumMsg = "You pull out and cum all over " + _candName + "'s face.">>
<</if>>
<<case "Vag">>
/* Cumming in/on pussy */
<<if _cumInside>>
<<SetVagCumInPick _playerGender _candGender>>
<<set _cumMsg = "You cum deep inside " + _candName + "'s pussy.">>
<<else>>
<<SetVagCumOutPick _playerGender _candGender>>
<<set _cumMsg = "You pull out and cum all over " + _candName + "'s body.">>
<</if>>
<<case "Anal">>
/* Cumming in/on ass */
<<if _cumInside>>
<<SetAnalCumInPick _playerGender _candGender>>
<<set _cumMsg = "You cum deep inside " + _candName + "'s ass.">>
<<else>>
<<SetAnalCumOutPick _playerGender _candGender>>
<<set _cumMsg = "You pull out and cum all over " + _candName + "'s ass.">>
<</if>>
<</switch>>
<<Video _pick>>
<<ChatMessage _cumMsg>>
/* Personality-based cum reaction */
<<switch _personality>>
<<case "shy">>
<<if _cumInside>>
<<set _cumResponse = [
"*gasps and blushes* Oh! I... I can feel it inside me... *trembles*",
"*squeaks in surprise* S-so warm... *face turns crimson*",
"*whimpers softly* That felt... strange... but not bad..."
].random()>>
<<else>>
<<set _cumResponse = [
"*covers face in embarrassment* Oh my... there's so much... *blushes furiously*",
"*gasps* I... I'm all messy now... *shy smile*",
"*trembling* I've never had anyone... *voice trails off*"
].random()>>
<</if>>
<<case "confident">>
<<if _cumInside>>
<<set _cumResponse = [
"*satisfied smile* Mmm, exactly as planned. I know how to finish a man properly.",
"Good. I aim to bring clients to completion efficiently. Test passed.",
"*nods approvingly* That's what a professional does. Delivers results."
].random()>>
<<else>>
<<set _cumResponse = [
"*wipes face gracefully* A satisfying conclusion. Did I pass your test?",
"*professionally* Well, that demonstrates my ability to please. Hire me?",
"*stands with poise despite the mess* Quality service, as expected."
].random()>>
<</if>>
<<case "flirty">>
<<if _cumInside>>
<<set _cumResponse = [
"*moans happily* Mmm, I love it! Fill me up anytime, boss...",
"*giggles* That felt AMAZING! Can we do this every interview?",
"*purrs with pleasure* So good... hire me and you can do this whenever you want..."
].random()>>
<<else>>
<<set _cumResponse = [
"*giggles and licks lips* Mmm, delicious! I love being covered...",
"*playfully* You marked your territory! Does that mean I'm hired?",
"*winks while wiping face* Such a naughty boss... I like it!"
].random()>>
<</if>>
<<case "desperate">>
<<if _cumInside>>
<<set _cumResponse = [
"*eagerly* Did you enjoy that?! Please tell me I did good! Please hire me!",
"*hopeful* I made you cum! That means I pass, right? RIGHT?!",
"*anxiously* I felt you finish! Does this mean I get the job?!"
].random()>>
<<else>>
<<set _cumResponse = [
"*covered but hopeful* I did it! I made you cum! Please hire me now!",
"*desperately* See? I'm good at this! Please give me the job!",
"*begging* I proved myself! I can make clients happy! Please!"
].random()>>
<</if>>
<<case "arrogant">>
<<if _cumInside>>
<<set _cumResponse = [
"*smugly* You're welcome. Not everyone can make that happen so quickly.",
"*superior smirk* See? That's the premium experience. Now hire me.",
"*proudly* That's what real talent looks like. Any questions?"
].random()>>
<<else>>
<<set _cumResponse = [
"*unimpressed while cleaning* There. Satisfied? Of course you are.",
"*dismissive* That was clearly overwhelming for you. You're welcome.",
"*arrogantly* I have that effect on people. Make your decision."
].random()>>
<</if>>
<<case "submissive">>
<<if _cumInside>>
<<set _cumResponse = [
"*gratefully* Thank you for filling me, sir. I'm yours to use...",
"*devoted* I'm so happy to receive your seed. Did I please you?",
"*blissfully* Use me however you want. I exist for your pleasure..."
].random()>>
<<else>>
<<set _cumResponse = [
"*kneeling, covered* Thank you for marking me, sir. I belong to you.",
"*submissively* Your cum on my body feels right. I'm yours.",
"*devotedly* Please claim me like this always. I'm your property..."
].random()>>
<</if>>
<<case "cynical">>
<<if _cumInside>>
<<set _cumResponse = [
"*matter-of-fact* Alright, you finished. Test complete. Moving on?",
"*shrugs* There we go. Job well done, I guess. Hiring me?",
"*businesslike* Okay, that happened. Can we get back to the interview?"
].random()>>
<<else>>
<<set _cumResponse = [
"*grabs tissue* Right. That happened. So, do I get the job?",
"*cleans up calmly* Interview by orgasm. At least it's honest.",
"*unemotionally* There. Proof of service. Make your decision."
].random()>>
<</if>>
<<default>>
<<set _cumResponse = "Mmm... that was intense. Did I pass the test?">>
<</switch>>
<<Chat _candidate _cumResponse>>
/* Reset player's lust */
<<run $player.status.horny.value = 0>>
<<run $player.status.potency.decrease(1)>>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn secondary"><<button "→ Continue interview" "BrothelCasting_Interview">>
<<unset $castingCumType>>
<</button>></span>
</div>
<</nobr>><<nobr>>
<<include "PlayerBrothel_InitCheck">>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Locations/City/RedLightDistrict/Brothel/Dungeon.jpg">>
<<timed 0.2s>>
<div class="centre-text" style="color: #9c27b0; font-size: 22px; text-shadow: 0 0 10px rgba(156, 39, 176, 0.5);">⛓️ The Dungeon</div>
<div class="centre-text" style="font-size: 14px; color: #666;">A dark prison for troublesome clients...</div>
<div class="centre-text" style="font-size: 14px; color: #ba68c8; margin-top: 5px;">📍 Cells: <<print $playerBrothel.prisoners.length>> / <<print $playerBrothel.dungeonCells>></div>
<<ChatMessage "You descend into the cold, dark dungeon beneath your brothel. The stone walls are lined with chains and cells.">>
<fieldset class="brothel-fieldset dark">
<legend>⛓️ Prisoners (<<print $playerBrothel.prisoners.length>>/<<print $playerBrothel.dungeonCells>>)</legend>
<<if $playerBrothel.prisoners.length == 0>>
<div style="padding: 20px; text-align: center; color: #888;">
<p>No prisoners currently held.</p>
<p style="font-size: 12px; color: #666;">Capture troublesome clients from brothel events to imprison them here.</p>
</div>
<<else>>
<div class="characters-grid" style="padding: 15px;">
<<for _i = 0; _i < $playerBrothel.prisoners.length; _i++>>
<<set _prisonerId = $playerBrothel.prisoners[_i]>>
<<set _prisoner = $Characters.find(c => c.info.id == _prisonerId)>>
<<if _prisoner>>
<<set _prisonerIcon = _prisoner.getPhotoImage()>>
<<set _prisonerName = _prisoner.info.firstName>>
<<set _submission = _prisoner.saveData.get("dungeonSubmission") || 0>>
<<set _subWidth = _submission * 10>>
<<set _cardHTML = '<div class="brothel-prisoner-card">'>>
<<set _cardHTML += '<div class="brothel-prisoner-card__avatar-wrapper"><img class="brothel-prisoner-card__avatar" src="' + _prisonerIcon + '" alt=""></div>'>>
<<set _cardHTML += '<div class="brothel-prisoner-card__name">' + _prisonerName + '</div>'>>
<<set _cardHTML += '<div class="brothel-prisoner-card__submission-bar"><div class="brothel-prisoner-card__submission-fill" style="width: ' + _subWidth + '%;"></div></div>'>>
<<set _cardHTML += '<div class="brothel-prisoner-card__submission-text">Submission: ' + _submission + '/10</div>'>>
<<set _cardHTML += '</div>'>>
<<capture _prisoner _cardHTML>>
<<button _cardHTML "BrothelDungeon_Prisoner">>
<<set $dungeonPrisoner = _prisoner>>
<</button>>
<</capture>>
<<else>>
/* Remove invalid prisoner */
<<run $playerBrothel.prisoners.splice(_i, 1)>>
<<set _i -= 1>>
<</if>>
<</for>>
</div>
<</if>>
</fieldset>
/* Show debt workers if any */
<<if $playerBrothel.debtWorkers && $playerBrothel.debtWorkers.length > 0>>
<fieldset class="brothel-fieldset">
<legend>💸 Debt Workers</legend>
<div style="padding: 10px;">
<<for _i = 0; _i < $playerBrothel.debtWorkers.length; _i++>>
<<set _debtWorkerId = $playerBrothel.debtWorkers[_i]>>
<<set _debtWorker = $Characters.find(c => c.info.id == _debtWorkerId)>>
<<if _debtWorker>>
<<set _debtRemaining = _debtWorker.saveData.get("debtRemaining") || 0>>
<<set _debtProgress = Math.floor((1 - (_debtRemaining / 2500)) * 100)>>
<<set _debtWorkerIcon = _debtWorker.getPhotoImage()>>
<<set _debtWorkerName = _debtWorker.info.firstName>>
<div class="brothel-debt-card">
<div class="brothel-debt-card__avatar-wrapper">
<img class="brothel-debt-card__avatar" @src="_debtWorkerIcon" alt="">
</div>
<div class="brothel-debt-card__info">
<div class="brothel-debt-card__name"><<print _debtWorkerName>></div>
<div class="brothel-debt-card__debt">Debt remaining: $<<print _debtRemaining>> (<<print _debtProgress>>% complete)</div>
<div class="brothel-debt-card__progress-bar">
<div class="brothel-debt-card__progress-fill" style="width: <<print _debtProgress>>%;"></div>
</div>
</div>
</div>
<</if>>
<</for>>
</div>
</fieldset>
<</if>>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn neutral"><<button "← Return to Hall" "PlayerBrothel_Main">><</button>></span>
</div>
<<PeopleAround>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _prisonerId = $dungeonPrisoner.info.id>>
<<set _prisoner = $Characters.find(c => c.info.id == _prisonerId)>>
<<if !_prisoner>>
<<ChatMessage "That prisoner is no longer in the dungeon.">>
<<goto "BrothelDungeon_Main">>
<</if>>
<<ShowNpcIcon _prisoner>>
<<set _prisonerName = _prisoner.info.firstName>>
<<set _submission = _prisoner.saveData.get("dungeonSubmission") || 0>>
<<set _prisonerGender = _prisoner.gender()>>
<<set _whippedToday = _prisoner.saveData.get("whippedToday") || false>>
<<set _convincedToday = _prisoner.saveData.get("convincedToday") || false>>
/* Initial reaction */
<<set _fearLevel = _submission >= 7 ? "broken" : (_submission >= 4 ? "fearful" : "defiant")>>
<<switch _fearLevel>>
<<case "broken">>
<<set _reaction = [
"*kneels immediately* P-please... I'll do anything... just don't hurt me again...",
"*trembles* M-master... I'm sorry... I'll obey...",
"*broken gaze* Whatever you want... I'm yours..."
].random()>>
<<case "fearful">>
<<set _reaction = [
"*flinches* W-what do you want from me...?",
"*backs away* Please... no more punishment...",
"*nervously* I-I'll cooperate... just tell me what you want..."
].random()>>
<<default>>
<<set _reaction = [
"*glares* You can't keep me here forever!",
"*angrily* This is illegal! Let me go!",
"*defiant* You'll pay for this!"
].random()>>
<</switch>>
<<Chat _prisoner _reaction>>
<fieldset class="brothel-fieldset dark">
<legend><<print _prisonerName>> - Status</legend>
<div style="padding: 15px;">
/* Submission bar */
<<set _subWidth = _submission * 10>>
<<set _subBarStyle = "background: linear-gradient(90deg, #9c27b0, #e91e63); height: 100%; border-radius: 6px; width: " + _subWidth + "%; transition: width 0.3s;">>
<div style="margin-bottom: 15px;">
<div style="display: flex; justify-content: space-between; font-size: 12px; color: #aaa; margin-bottom: 5px;">
<span>⛓️ Submission</span>
<span><<print _submission>>/10</span>
</div>
<div style="background: rgba(255,255,255,0.1); height: 12px; border-radius: 6px; overflow: hidden;">
<div @style="_subBarStyle"></div>
</div>
<<if _submission >= 10>>
<div style="color: #4CAF50; font-size: 11px; margin-top: 5px; text-align: center;">✓ Fully broken - ready to accept debt work</div>
<<elseif _submission >= 7>>
<div style="color: #ff9800; font-size: 11px; margin-top: 5px; text-align: center;">Almost broken...</div>
<</if>>
</div>
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px; font-size: 12px;">
<div><b>Gender:</b> <span style="color: #e91e63;"><<print _prisonerGender>></span></div>
<div><b>Health:</b> <span style="color: #4CAF50;"><<print _prisoner.status.health.value>>/<<print _prisoner.status.health.max>></span></div>
</div>
</div>
</fieldset>
<fieldset class="brothel-fieldset">
<legend>Actions</legend>
<div class="brothel-btn-container">
/* Whip action */
<<if _whippedToday>>
<span class="brothel-btn disabled"><<button "🔱 Whip (Already done today)">><</button>></span>
<<else>>
<span class="brothel-btn danger"><<button "🔱 Whip" "BrothelDungeon_Whip">><</button>></span>
<</if>>
/* Sex action */
<<set _hasEnergy = $player.status.energy.value >= 20>>
<<set _hasPotency = $player.genitalia() != "Penis" || $player.status.potency.value > $player.status.potency.min>>
<<if _hasEnergy && _hasPotency>>
<span class="brothel-btn special"><<button "💋 Have Sex" "BrothelDungeon_Sex">><</button>></span>
<<else>>
<span class="brothel-btn disabled"><<button "💋 Have Sex (No energy/stamina)">><</button>></span>
<</if>>
/* Convince to work off debt */
<<set _hasRoomSpace = $playerBrothel.prostitutes.length < $playerBrothel.rooms>>
<<if _convincedToday>>
<span class="brothel-btn disabled"><<button "💬 Convince (Already tried today)">><</button>></span>
<<elseif _submission < 7>>
<span class="brothel-btn disabled"><<button "💬 Convince (Submission too low)">><</button>></span>
<<elseif !_hasRoomSpace>>
<span class="brothel-btn disabled"><<button "💬 Convince (No free rooms)">><</button>></span>
<<else>>
<span class="brothel-btn success"><<button "💬 Convince to Work Off Debt" "BrothelDungeon_Convince">><</button>></span>
<</if>>
</div>
</fieldset>
/* Surgery options for males */
<<if _prisonerGender == "Male">>
<fieldset class="brothel-fieldset">
<legend>💉 Forced Transformation</legend>
<p style="color: #aaa; font-size: 12px;">Force surgical changes on this prisoner.</p>
<div class="brothel-btn-container">
<<if $player.money >= 500>>
<span class="brothel-btn secondary"><<button "🍆➡️🍑 Make Shemale ($500)" "BrothelDungeon_Surgery_Shemale">><</button>></span>
<<else>>
<span class="brothel-btn disabled"><<button "🍆➡️🍑 Make Shemale ($500)">><</button>></span>
<</if>>
<<if $player.money >= 1000>>
<span class="brothel-btn primary"><<button "🍆➡️💕 Make Female ($1000)" "BrothelDungeon_Surgery_Female">><</button>></span>
<<else>>
<span class="brothel-btn disabled"><<button "🍆➡️💕 Make Female ($1000)">><</button>></span>
<</if>>
</div>
</fieldset>
<</if>>
<fieldset class="brothel-fieldset">
<legend>⚙️ Management</legend>
<div class="brothel-btn-container">
<span class="brothel-btn danger"><<button "🚪 Release" "BrothelDungeon_Release">><</button>></span>
<span class="brothel-btn neutral"><<button "← Back" "BrothelDungeon_Main">><<unset $dungeonPrisoner>><</button>></span>
</div>
</fieldset>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _prisonerId = $dungeonPrisoner.info.id>>
<<set _prisoner = $Characters.find(c => c.info.id == _prisonerId)>>
<<if !_prisoner>>
<<ChatMessage "That prisoner is no longer in the dungeon.">>
<<goto "BrothelDungeon_Main">>
<</if>>
<<ShowNpcIcon _prisoner>>
<<set _prisonerName = _prisoner.info.firstName>>
<<set _submission = _prisoner.saveData.get("dungeonSubmission") || 0>>
<<SpendTimeWithoutUpdate 15>>
<<ChatMessage "You take the whip and approach the chained prisoner...">>
/* Whipping increases submission */
<<set _submissionGain = Random(1, 3)>>
<<set _newSubmission = Math.min(10, _submission + _submissionGain)>>
<<run _prisoner.saveData.set("dungeonSubmission", _newSubmission)>>
<<run _prisoner.saveData.set("whippedToday", true)>>
/* Health damage */
<<run _prisoner.status.health.decrease(Random(5, 10))>>
/* Reaction based on submission level */
<<if _newSubmission >= 8>>
<<set _response = [
"*screams* THANK YOU MASTER! I DESERVE THIS!",
"*sobbing* Y-yes... punish me... I was bad...",
"*broken* I'm sorry... I'm sorry... I'll be good..."
].random()>>
<<elseif _newSubmission >= 5>>
<<set _response = [
"*cries out in pain* STOP! PLEASE! I'LL DO ANYTHING!",
"*screams* OKAY! OKAY! I GIVE UP!",
"*sobbing* Please... no more... I'll cooperate..."
].random()>>
<<else>>
<<set _response = [
"*screams defiantly* IS THAT ALL YOU'VE GOT?!",
"*grits teeth* You'll... regret this...",
"*groans* You think this will break me?!"
].random()>>
<</if>>
<<Chat _prisoner _response>>
<<set _msg = "The whipping was effective. (Submission +" + _submissionGain + ")">>
<<ChatMessage _msg>>
<<if _newSubmission >= 10>>
<<ChatMessage "The prisoner seems completely broken now. They might be willing to work off their debt.">>
<</if>>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn secondary"><<button "→ Continue" "BrothelDungeon_Prisoner">><</button>></span>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _prisonerId = $dungeonPrisoner.info.id>>
<<set _prisoner = $Characters.find(c => c.info.id == _prisonerId)>>
<<if !_prisoner>>
<<ChatMessage "That prisoner is no longer in the dungeon.">>
<<goto "BrothelDungeon_Main">>
<</if>>
/* Set up sex interaction - get fresh reference from $Characters */
<<set $interactionNpc = _prisoner>>
<<set $indexNPC = $Characters.indexOf(_prisoner)>>
<<set $sexType = "dungeonSex">>
<<set $playerDom = true>>
<<set $passiveSex = false>>
<<set $canShowStatsBtn = false>>
<<set $gameSettings.allowSaves = false>>
/* Increase submission slightly from sex */
<<set _submission = _prisoner.saveData.get("dungeonSubmission") || 0>>
<<run _prisoner.saveData.set("dungeonSubmission", Math.min(10, _submission + 1))>>
<<goto "Sex">>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _prisonerId = $dungeonPrisoner.info.id>>
<<set _prisoner = $Characters.find(c => c.info.id == _prisonerId)>>
<<if !_prisoner>>
<<ChatMessage "That prisoner is no longer in the dungeon.">>
<<goto "BrothelDungeon_Main">>
<</if>>
/* Check for available rooms */
<<if $playerBrothel.prostitutes.length >= $playerBrothel.rooms>>
<<ChatMessage "You don't have any free rooms for new workers. Build more rooms first.">>
<<goto "BrothelDungeon_Prisoner">>
<</if>>
<<ShowNpcIcon _prisoner>>
<<set _prisonerName = _prisoner.info.firstName>>
<<set _submission = _prisoner.saveData.get("dungeonSubmission") || 0>>
<<SpendTimeWithoutUpdate 15>>
/* Mark as tried today */
<<run _prisoner.saveData.set("convincedToday", true)>>
/* Success chance based on submission */
<<set _successChance = (_submission - 6) * 25>> /* 7=25%, 8=50%, 9=75%, 10=100% */
<<set _roll = Random(1, 100)>>
<<set _msg = "You explain to " + _prisonerName + " that they can earn their freedom by working off a $2500 debt...">>
<<ChatMessage _msg>>
<<if _roll <= _successChance>>
/* Success */
<<set _response = [
"*defeated* Fine... I'll do it. Just... let me out of these chains.",
"*broken* Yes... I'll work for you. I have no choice...",
"*sobbing* Okay... anything to get out of here..."
].random()>>
<<Chat _prisoner _response>>
<<ChatMessage "They agree to work off their debt! They will work as a prostitute until they earn $2500.">>
/* Move from prisoners to debtWorkers and prostitutes */
<<set _index = $playerBrothel.prisoners.indexOf(_prisoner.info.id)>>
<<if _index > -1>>
<<run $playerBrothel.prisoners.splice(_index, 1)>>
<</if>>
<<run $playerBrothel.debtWorkers.push(_prisoner.info.id)>>
<<run $playerBrothel.prostitutes.push(_prisoner.info.id)>>
/* Set debt amount */
<<run _prisoner.saveData.set("debtRemaining", 2500)>>
<<run _prisoner.saveData.set("isDebtWorker", true)>>
<<run _prisoner.saveData.set("weeklySalary", 0)>> /* No salary for debt workers */
/* Set default assignment */
<<set $playerBrothel.workerAssignments[_prisoner.info.id] = "work">>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn success"><<button "→ Send to Work" "BrothelDungeon_Main">><<unset $dungeonPrisoner>><</button>></span>
</div>
<<else>>
/* Failure */
<<set _response = [
"*shakes head* No... I won't be your whore... I'd rather rot here...",
"*defiant* I'll never agree to that!",
"*glares* Find someone else to sell..."
].random()>>
<<Chat _prisoner _response>>
<<ChatMessage "They refused. Try again tomorrow, or break them further.">>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn secondary"><<button "→ Continue" "BrothelDungeon_Prisoner">><</button>></span>
</div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _prisonerId = $dungeonPrisoner.info.id>>
<<set _prisoner = $Characters.find(c => c.info.id == _prisonerId)>>
<<if !_prisoner>>
<<ChatMessage "That prisoner is no longer in the dungeon.">>
<<goto "BrothelDungeon_Main">>
<</if>>
<<ShowNpcIcon _prisoner>>
<<set _prisonerName = _prisoner.info.firstName>>
<<set _cost = 500>>
<<if $player.money < _cost>>
<<ChatMessage "You don't have enough money!">>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn neutral"><<button "← Back" "BrothelDungeon_Prisoner">><</button>></span>
</div>
<<else>>
<<set $player.money -= _cost>>
<<SpendTimeWithoutUpdate 120>>
<<ChatMessage "You arrange for the forced transformation surgery...">>
<<set _response = [
"*screams in terror* NO! PLEASE! DON'T DO THIS TO ME!",
"*struggles against chains* YOU CAN'T! THIS IS INSANE!",
"*crying hysterically* PLEASE! I'LL DO ANYTHING ELSE!"
].random()>>
<<Chat _prisoner _response>>
/* Apply transformation - _prisoner is a reference from $Characters.find() */
<<set _newBreast = Random(2, 4)>>
<<set _newButt = Random(2, 3)>>
<<set _newFace = Random(5, 7)>>
<<set _prisoner.info.originGender = "Trans">>
<<set _prisoner.body.breastSize.value = _newBreast>>
<<set _prisoner.body.buttSize.value = _newButt>>
<<set _prisoner.body.face.value = _newFace>>
/* Increase submission from trauma */
<<set _submission = _prisoner.saveData.get("dungeonSubmission") || 0>>
<<run _prisoner.saveData.set("dungeonSubmission", Math.min(10, _submission + 3))>>
<<ChatMessage "The surgery is complete. The prisoner has been transformed into a shemale.">>
<<ChatMessage "The trauma has increased their submission significantly. (+3 Submission)">>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn secondary"><<button "→ Continue" "BrothelDungeon_Prisoner">><</button>></span>
</div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _prisonerId = $dungeonPrisoner.info.id>>
<<set _prisoner = $Characters.find(c => c.info.id == _prisonerId)>>
<<if !_prisoner>>
<<ChatMessage "That prisoner is no longer in the dungeon.">>
<<goto "BrothelDungeon_Main">>
<</if>>
<<ShowNpcIcon _prisoner>>
<<set _prisonerName = _prisoner.info.firstName>>
<<set _cost = 1000>>
<<if $player.money < _cost>>
<<ChatMessage "You don't have enough money!">>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn neutral"><<button "← Back" "BrothelDungeon_Prisoner">><</button>></span>
</div>
<<else>>
<<set $player.money -= _cost>>
<<SpendTimeWithoutUpdate 180>>
<<ChatMessage "You arrange for the complete transformation surgery...">>
<<set _response = [
"*screaming* NO! NO! NO! PLEASE! I BEG YOU!",
"*hysterical* YOU MONSTER! DON'T TAKE THAT FROM ME!",
"*broken sobs* Why... why are you doing this..."
].random()>>
<<Chat _prisoner _response>>
/* Apply complete transformation - _prisoner is a reference from $Characters.find() */
<<set _newBreast = Random(3, 5)>>
<<set _newButt = Random(3, 4)>>
<<set _newFace = Random(6, 8)>>
<<set _newVagina = Random(15, 35)>>
<<set _prisoner.info.originGender = "Female">>
<<set _prisoner.body.breastSize.value = _newBreast>>
<<set _prisoner.body.buttSize.value = _newButt>>
<<set _prisoner.body.face.value = _newFace>>
<<set _prisoner.body.penisSize.value = 0>>
<<set _prisoner.body.vaginaSize.value = _newVagina>>
/* Major submission increase from trauma */
<<set _submission = _prisoner.saveData.get("dungeonSubmission") || 0>>
<<run _prisoner.saveData.set("dungeonSubmission", Math.min(10, _submission + 5))>>
<<ChatMessage "The surgery is complete. The prisoner has been fully transformed into a female.">>
<<ChatMessage "The traumatic experience has completely broken them. (+5 Submission)">>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn secondary"><<button "→ Continue" "BrothelDungeon_Prisoner">><</button>></span>
</div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _prisonerId = $dungeonPrisoner.info.id>>
<<set _prisoner = $Characters.find(c => c.info.id == _prisonerId)>>
<<if !_prisoner>>
<<ChatMessage "That prisoner is no longer in the dungeon.">>
<<goto "BrothelDungeon_Main">>
<</if>>
<<ShowNpcIcon _prisoner>>
<<set _prisonerName = _prisoner.info.firstName>>
<<ChatMessage "You release the prisoner from the dungeon...">>
/* Remove from prisoners array */
<<set _index = $playerBrothel.prisoners.indexOf(_prisoner.info.id)>>
<<if _index > -1>>
<<run $playerBrothel.prisoners.splice(_index, 1)>>
<</if>>
/* Delete the character */
<<DeleteCharacter _prisoner>>
<<set _msg = _prisonerName + " has been released and flees into the night.">>
<<ChatMessage _msg>>
<<unset $dungeonPrisoner>>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn secondary"><<button "→ Continue" "BrothelDungeon_Main">><</button>></span>
</div>
<</nobr>><<widget "AddPrisonerToDungeon">>
<<nobr>>
/* Widget to add an NPC to the dungeon as a prisoner */
/* Usage: <<AddPrisonerToDungeon _npcObject>> */
<<set _npc = $args[0]>>
<<if _npc && _npc.info>>
/* Initialize prisoner data */
<<run _npc.saveData.set("dungeonSubmission", 0)>>
<<run _npc.saveData.set("whippedToday", false)>>
<<run _npc.saveData.set("convincedToday", false)>>
/* Add to prisoners array */
<<run $playerBrothel.prisoners.push(_npc.info.id)>>
<</if>>
<</nobr>>
<</widget>>/* Random events for the brothel */
/* Check if random event should trigger (20% chance when walking around) */
/* Combined system: includes both basic events and advanced events (VIP, raids, inspections, scandals) */
<<widget "BrothelRandomEventCheck">>
<<nobr>>
<<if $playerBrothel && $playerBrothel.prostitutes && $playerBrothel.prostitutes.length > 0>>
<<set _eventChance = Random(1, 100)>>
<<if _eventChance <= 18>>
/* 18% chance for an event (slightly increased to accommodate more event types) */
<<set _eventType = Random(1, 10)>>
<<switch _eventType>>
/* Basic Events (60% of events - cases 1-6) */
<<case 1>>
<<goto "BrothelEvent_RowdyClient">>
<<case 2>>
<<goto "BrothelEvent_NonPayingClient">>
<<case 3>>
<<goto "BrothelEvent_RoughSexRequest">>
<<case 4>>
<<goto "BrothelEvent_Nymphomaniac">>
<<case 5>>
/* Repeat of common events for balance */
<<goto "BrothelEvent_RoughSexRequest">>
<<case 6>>
<<goto "BrothelEvent_NonPayingClient">>
/* Advanced Events (40% of events - cases 7-10) */
<<case 7>>
/* Police Raid - rare and dangerous (5% chance within events) */
<<if Random(1, 100) <= 50>>
<<goto "BrothelEvent_PoliceRaid">>
<</if>>
<<case 8>>
/* Health Inspection - requires some reputation */
<<if $playerBrothel.reputation >= 20>>
<<goto "BrothelEvent_HealthInspection">>
<</if>>
<<case 9>>
/* VIP Client - requires moderate reputation */
<<if $playerBrothel.reputation >= 50>>
<<goto "BrothelEvent_VIPClient">>
<<else>>
/* Fallback to basic event if reputation too low */
<<goto "BrothelEvent_RoughSexRequest">>
<</if>>
<<case 10>>
/* Celebrity Scandal - requires high reputation */
<<if $playerBrothel.reputation >= 70>>
<<goto "BrothelEvent_CelebrityScandal">>
<<else>>
/* Fallback to VIP if reputation moderate, or basic event if low */
<<if $playerBrothel.reputation >= 50>>
<<goto "BrothelEvent_VIPClient">>
<<else>>
<<goto "BrothelEvent_Nymphomaniac">>
<</if>>
<</if>>
<</switch>>
<</if>>
<</if>>
<</nobr>>
<</widget>><<nobr>>
<<include "PlayerBrothel_InitCheck">>
<<SetBackground "Media/Locations/City/RedLightDistrict/Brothel/Hall.jpg">>
/* Pick a random worker */
<<set _workerId = $playerBrothel.prostitutes.random()>>
<<set _worker = $Characters.find(c => c.info.id == _workerId)>>
<<if !_worker>>
<<goto "PlayerBrothel_Main">>
<</if>>
<<set _workerName = _worker.info.firstName>>
<div class="centre-text" style="font-size: 22px; color: #f44336; text-shadow: 0 0 15px rgba(244, 67, 54, 0.5);">⚠️ Incident!</div>
<fieldset style="background: linear-gradient(135deg, rgba(244, 67, 54, 0.2) 0%, rgba(33, 33, 33, 0.95) 100%); border: 2px solid #f44336;">
<legend style="color: #ef9a9a;">🔥 Rowdy Client</legend>
<<set _eventMsg = "You hear shouting from one of the rooms. A drunk client is causing trouble with " + _workerName + "!">>
<<ChatMessage _eventMsg>>
<<if $playerBrothel.upgrades && $playerBrothel.upgrades.security == true>>
/* Security handles it */
<<ChatMessage "Your security guards quickly rush to the scene and restrain the troublemaker.">>
<div style="margin-top: 15px; padding: 15px; background: rgba(76, 175, 80, 0.2); border-radius: 10px; border: 1px solid #4CAF50;">
<p style="color: #81c784;">🛡️ The guards are holding the client. What do you want to do with him?</p>
</div>
<div class="brothel-btn-container" style="margin-top: 15px;">
<<set $brothelEventWorkerId = _workerId>>
<span class="brothel-btn danger"><<button "🚪 Throw him out">>
<<ChatMessage "You order the guards to throw him out. He won't be coming back anytime soon.">>
<<set $playerBrothel.reputation = Math.max(0, $playerBrothel.reputation - 2)>>
<<goto "PlayerBrothel_Main">>
<</button>></span>
<<if $playerBrothel.upgrades.dungeon == true>>
<<set _dungeonFull = $playerBrothel.prisoners.length >= $playerBrothel.dungeonCells>>
<<if _dungeonFull>>
<span class="brothel-btn disabled"><<button "⛓️ Dungeon Full">><</button>></span>
<<else>>
<span class="brothel-btn dark"><<button "⛓️ Take them to the dungeon">>
/* Create a random client NPC using gender distribution */
<<include "CharactersData">>
<<set _clientNpc = CreateCharacter({
isPlayer: false,
characterWork: "None",
age: Random(25, 50),
gender: getWeightedRandomGender(),
sexualPreference: "Bi"
}, true)>>
<<unset $maleNames $femaleNames $surnames>>
<<run _clientNpc.saveData.set("dungeonSubmission", 0)>>
<<run _clientNpc.saveData.set("prisonerReason", "rowdy")>>
<<run $playerBrothel.prisoners.push(_clientNpc.info.id)>>
<<ChatMessage "The guards drag them down to the dungeon. They'll have time to think about their behavior...">>
<<goto "PlayerBrothel_Main">>
<</button>></span>
<</if>>
<</if>>
</div>
<<else>>
/* No security - player must handle it */
<<ChatMessage "You don't have security guards. You'll have to deal with this yourself!">>
<div style="margin-top: 15px; padding: 15px; background: rgba(255, 152, 0, 0.2); border-radius: 10px; border: 1px solid #ff9800;">
<p style="color: #ffcc80;">⚔️ The client is getting aggressive. What will you do?</p>
</div>
<div class="brothel-btn-container" style="margin-top: 15px;">
<<set $brothelEventWorkerId = _workerId>>
<span class="brothel-btn danger"><<button "👊 Fight him!" "BrothelEvent_RowdyClient_Fight">><</button>></span>
<span class="brothel-btn neutral"><<button "🏃 Back off and let him go">>
/* Worker gets hurt, reputation suffers */
<<set _worker = $Characters.find(c => c.info.id == $brothelEventWorkerId)>>
<<if _worker>>
<<run _worker.status.health.value = _worker.status.health.min>>
<</if>>
<<set $playerBrothel.reputation = Math.max(0, $playerBrothel.reputation - 15)>>
<<set _badMsg = "The client beats " + _workerName + " badly before storming out. Your reputation suffers greatly.">>
<<ChatMessage _badMsg>>
<<goto "PlayerBrothel_Main">>
<</button>></span>
</div>
<</if>>
</fieldset>
<</nobr>><<nobr>>
<<include "PlayerBrothel_InitCheck">>
<<SetBackground "Media/Locations/City/RedLightDistrict/Brothel/Hall.jpg">>
<<set _worker = $Characters.find(c => c.info.id == $brothelEventWorkerId)>>
<<set _workerName = _worker ? _worker.info.firstName : "the worker">>
/* Simple fight check based on player stats */
<<set _playerStrength = $player.status.health.value + $player.status.energy.value>>
<<set _clientStrength = Random(30, 80)>>
<<set _fightRoll = Random(1, 100)>>
/* Player wins if their strength + roll beats client */
<<set _playerWins = (_playerStrength + _fightRoll) > (_clientStrength + 50)>>
<div class="centre-text" style="font-size: 22px; color: #ff9800;">⚔️ Fight!</div>
<fieldset style="background: linear-gradient(135deg, rgba(255, 152, 0, 0.2) 0%, rgba(33, 33, 33, 0.95) 100%); border: 2px solid #ff9800;">
<legend style="color: #ffcc80;">Combat Result</legend>
<<if _playerWins>>
<<ChatMessage "You manage to overpower the drunk client! He's now at your mercy.">>
<<run $player.status.health.decrease(Random(5, 15))>>
<<run $player.status.energy.decrease(Random(10, 20))>>
<div style="margin-top: 15px; padding: 15px; background: rgba(76, 175, 80, 0.2); border-radius: 10px; border: 1px solid #4CAF50;">
<p style="color: #81c784;">✅ Victory! The client is subdued. What do you want to do with him?</p>
</div>
<div class="brothel-btn-container" style="margin-top: 15px;">
<span class="brothel-btn danger"><<button "🚪 Throw him out">>
<<ChatMessage "You drag him outside and toss him into the street.">>
<<goto "PlayerBrothel_Main">>
<</button>></span>
<<if $playerBrothel.upgrades && $playerBrothel.upgrades.dungeon == true>>
<<set _dungeonFull2 = $playerBrothel.prisoners.length >= $playerBrothel.dungeonCells>>
<<if _dungeonFull2>>
<span class="brothel-btn disabled"><<button "⛓️ Dungeon Full">><</button>></span>
<<else>>
<span class="brothel-btn dark"><<button "⛓️ Take them to the dungeon">>
/* Create a random client NPC using gender distribution */
<<include "CharactersData">>
<<set _clientNpc = CreateCharacter({
isPlayer: false,
characterWork: "None",
age: Random(25, 50),
gender: getWeightedRandomGender(),
sexualPreference: "Bi"
}, true)>>
<<unset $maleNames $femaleNames $surnames>>
<<run _clientNpc.saveData.set("dungeonSubmission", 0)>>
<<run _clientNpc.saveData.set("prisonerReason", "rowdy")>>
<<run $playerBrothel.prisoners.push(_clientNpc.info.id)>>
<<ChatMessage "You drag them down to the dungeon. They'll regret causing trouble here...">>
<<goto "PlayerBrothel_Main">>
<</button>></span>
<</if>>
<</if>>
</div>
<<else>>
/* Player loses */
<<run $player.status.health.decrease(Random(20, 40))>>
<<run $player.status.energy.decrease(Random(15, 25))>>
<<if _worker>>
<<run _worker.status.health.value = _worker.status.health.min>>
<</if>>
<<set $playerBrothel.reputation = Math.max(0, $playerBrothel.reputation - 20)>>
<<set _loseMsg = "The client overpowers you! He beats you and " + _workerName + " before fleeing. Your reputation takes a massive hit.">>
<<ChatMessage _loseMsg>>
<div style="margin-top: 15px; padding: 15px; background: rgba(244, 67, 54, 0.2); border-radius: 10px; border: 1px solid #f44336;">
<p style="color: #ef9a9a;">❌ Defeat! You need to recover...</p>
<p style="color: #888; font-size: 12px;">Consider hiring security guards to prevent this in the future.</p>
</div>
<div class="brothel-btn-container" style="margin-top: 15px;">
<span class="brothel-btn neutral"><<button "← Continue" "PlayerBrothel_Main">><</button>></span>
</div>
<</if>>
</fieldset>
<</nobr>><<nobr>>
<<include "PlayerBrothel_InitCheck">>
<<SetBackground "Media/Locations/City/RedLightDistrict/Brothel/Hall.jpg">>
/* Pick a random worker */
<<set _workerId = $playerBrothel.prostitutes.random()>>
<<set _worker = $Characters.find(c => c.info.id == _workerId)>>
<<if !_worker>>
<<goto "PlayerBrothel_Main">>
<</if>>
<<set _workerName = _worker.info.firstName>>
<<set _stolenAmount = Random(50, 200)>>
<div class="centre-text" style="font-size: 22px; color: #ff9800; text-shadow: 0 0 15px rgba(255, 152, 0, 0.5);">💸 Problem!</div>
<fieldset style="background: linear-gradient(135deg, rgba(255, 152, 0, 0.2) 0%, rgba(33, 33, 33, 0.95) 100%); border: 2px solid #ff9800;">
<legend style="color: #ffcc80;">💰 Non-Paying Client</legend>
<<set _eventMsg = _workerName + " runs up to you, upset. A client just left without paying $" + _stolenAmount + "!">>
<<ChatMessage _eventMsg>>
<<if $playerBrothel.upgrades && $playerBrothel.upgrades.security == true>>
/* Security catches him */
<<ChatMessage "Your security guards quickly catch the thief at the exit and drag him back to you.">>
<div style="margin-top: 15px; padding: 15px; background: rgba(76, 175, 80, 0.2); border-radius: 10px; border: 1px solid #4CAF50;">
<p style="color: #81c784;">🛡️ The guards are holding the client. He's begging for mercy. What do you want to do?</p>
</div>
<div class="brothel-btn-container" style="margin-top: 15px;">
<<set $brothelEventStolenAmount = _stolenAmount>>
<span class="brothel-btn success"><<button "💵 Make him pay double">>
<<set _payment = $brothelEventStolenAmount * 2>>
<<set $player.money += _payment>>
<<set _payMsg = "You force him to pay $" + _payment + " as compensation.">>
<<ChatMessage _payMsg>>
<<goto "PlayerBrothel_Main">>
<</button>></span>
<span class="brothel-btn danger"><<button "🚪 Take the money and throw him out">>
<<set $player.money += $brothelEventStolenAmount>>
<<set _payMsg = "You take back the $" + $brothelEventStolenAmount + " and have him thrown out.">>
<<ChatMessage _payMsg>>
<<goto "PlayerBrothel_Main">>
<</button>></span>
<<if $playerBrothel.upgrades.dungeon == true>>
<<set _dungeonFull3 = $playerBrothel.prisoners.length >= $playerBrothel.dungeonCells>>
<<if _dungeonFull3>>
<span class="brothel-btn disabled"><<button "⛓️ Dungeon Full">><</button>></span>
<<else>>
<span class="brothel-btn dark"><<button "⛓️ Take them to the dungeon">>
<<set $player.money += $brothelEventStolenAmount>>
/* Create a random client NPC using gender distribution */
<<include "CharactersData">>
<<set _clientNpc = CreateCharacter({
isPlayer: false,
characterWork: "None",
age: Random(25, 50),
gender: getWeightedRandomGender(),
sexualPreference: "Bi"
}, true)>>
<<unset $maleNames $femaleNames $surnames>>
<<run _clientNpc.saveData.set("dungeonSubmission", 0)>>
<<run _clientNpc.saveData.set("prisonerReason", "thief")>>
<<run $playerBrothel.prisoners.push(_clientNpc.info.id)>>
<<set _payMsg = "You take back the $" + $brothelEventStolenAmount + " and send them to the dungeon to work off their crime...">>
<<ChatMessage _payMsg>>
<<goto "PlayerBrothel_Main">>
<</button>></span>
<</if>>
<</if>>
</div>
<<else>>
/* No security - client escapes */
<<ChatMessage "Without security guards, the thief has already fled into the streets.">>
<<set $playerBrothel.reputation = Math.max(0, $playerBrothel.reputation - 5)>>
<div style="margin-top: 15px; padding: 15px; background: rgba(244, 67, 54, 0.2); border-radius: 10px; border: 1px solid #f44336;">
<<set _lossMsg = "You lost $" + _stolenAmount + ". Consider hiring security guards to prevent theft.">>
<p style="color: #ef9a9a;"><<print _lossMsg>></p>
</div>
<div class="brothel-btn-container" style="margin-top: 15px;">
<span class="brothel-btn neutral"><<button "← Continue" "PlayerBrothel_Main">><</button>></span>
</div>
<</if>>
</fieldset>
<</nobr>><<nobr>>
<<include "PlayerBrothel_InitCheck">>
<<SetBackground "Media/Locations/City/RedLightDistrict/Brothel/Hall.jpg">>
/* Pick a random worker */
<<set _workerId = $playerBrothel.prostitutes.random()>>
<<set _worker = $Characters.find(c => c.info.id == _workerId)>>
<<if !_worker>>
<<goto "PlayerBrothel_Main">>
<</if>>
<<set _workerName = _worker.info.firstName>>
<<set _bonusAmount = Random(100, 500)>>
<<set $brothelEventWorkerId = _workerId>>
<<set $brothelEventBonus = _bonusAmount>>
<div class="centre-text" style="font-size: 22px; color: #9c27b0; text-shadow: 0 0 15px rgba(156, 39, 176, 0.5);">💋 Special Request</div>
<fieldset style="background: linear-gradient(135deg, rgba(156, 39, 176, 0.2) 0%, rgba(33, 33, 33, 0.95) 100%); border: 2px solid #9c27b0;">
<legend style="color: #ce93d8;">🔥 Rough Sex Request</legend>
<<set _eventMsg = "A wealthy-looking client approaches you. He wants to have rough, intense sex with " + _workerName + " and is willing to pay extra.">>
<<ChatMessage _eventMsg>>
<div style="margin-top: 15px; padding: 15px; background: rgba(76, 175, 80, 0.2); border-radius: 10px; border: 1px solid #4CAF50;">
<<set _offerMsg = "He's offering an additional $" + _bonusAmount + " on top of the regular fee.">>
<p style="color: #81c784;">💰 <<print _offerMsg>></p>
</div>
<div style="margin-top: 10px; padding: 10px; background: rgba(255, 152, 0, 0.1); border-radius: 8px;">
<p style="color: #ffcc80; font-size: 12px;">⚠️ Warning: This may affect the worker's health and energy.</p>
</div>
<div class="brothel-btn-container" style="margin-top: 15px;">
<span class="brothel-btn success"><<button "✅ Accept the offer">>
<<set $player.money += $brothelEventBonus>>
<<set _worker = $Characters.find(c => c.info.id == $brothelEventWorkerId)>>
<<if _worker>>
<<run _worker.status.health.decrease(Random(10, 25))>>
<<run _worker.status.energy.decrease(Random(15, 30))>>
<</if>>
<<set _acceptMsg = "You accept the offer. The client pays $" + $brothelEventBonus + " extra. " + _workerName + " looks a bit worn out afterwards, but the money is good.">>
<<ChatMessage _acceptMsg>>
<<goto "PlayerBrothel_Main">>
<</button>></span>
<span class="brothel-btn danger"><<button "❌ Refuse">>
<<ChatMessage "You politely decline. The client looks disappointed but accepts your decision.">>
<<goto "PlayerBrothel_Main">>
<</button>></span>
</div>
</fieldset>
<</nobr>><<nobr>>
<<include "PlayerBrothel_InitCheck">>
<<include "CharactersData">>
<<SetBackground "Media/Locations/City/RedLightDistrict/Brothel/Hall.jpg">>
/* Create a random nymphomaniac NPC */
<<set _nymphoGender = Random(0, 1) == 0 ? "Female" : "Male">>
<<if Random(1, 100) <= 15>>
<<set _nymphoGender = "Shemale">>
<</if>>
<<set _breastSize = _nymphoGender == "Male" ? 0 : Random(2, 5)>>
<<set _buttSize = Random(1, 4)>>
<<set _faceValue = _nymphoGender == "Male" ? 0 : Random(3, 5)>>
<<set _vaginaSize = _nymphoGender == "Male" ? 0 : Random(10, 30)>>
<<set _penisSize = _nymphoGender == "Female" ? 0 : Random(10, 25)>>
<<set _nympho = CreateCharacter({
isPlayer: false,
characterWork: "Nymphomaniac",
gender: _nymphoGender,
sexualPreference: "Bi",
clothesPreference: (_nymphoGender == "Male" ? "men" : "women"),
age: Random(20, 35),
face: _faceValue,
breastSize: _breastSize,
buttSize: _buttSize,
vaginaSize: _vaginaSize,
penisSize: _penisSize,
throatSize: Random(20, 40),
anusSize: Random(15, 35)
}, true)>>
<<unset $maleNames $femaleNames $surnames>>
<<if !_nympho>>
<<goto "PlayerBrothel_Main">>
<</if>>
<<set $brothelEventNympho = _nympho>>
<<set _nymphoName = _nympho.info.firstName>>
<<set _nymphoGenderText = _nympho.gender()>>
<div class="centre-text" style="font-size: 22px; color: #e91e63; text-shadow: 0 0 15px rgba(233, 30, 99, 0.5);">💕 Unexpected Visitor</div>
<fieldset style="background: linear-gradient(135deg, rgba(233, 30, 99, 0.2) 0%, rgba(33, 33, 33, 0.95) 100%); border: 2px solid #e91e63;">
<legend style="color: #f48fb1;">😍 Nymphomaniac</legend>
/* Photo centered at top */
<div style="text-align: center; margin-bottom: 15px;">
<<ShowNpcIcon _nympho>>
</div>
/* Text and dialogue below */
<<set _arrivalMsg = "A desperate-looking " + _nymphoGenderText.toLowerCase() + " rushes up to you. " + _nymphoName + " seems extremely aroused and barely able to contain themselves.">>
<<ChatMessage _arrivalMsg>>
<<set _pleadings = [
"Please! I need this so badly! Let me work here just once, I'll do anything!",
"I'm burning up inside! Just one client, please! I need it!",
"You have to help me! I can't take it anymore! Let me service someone!",
"I'll work for free! Just please let me have sex with someone here!"
]>>
<<Chat _nympho _pleadings.random()>>
<div style="margin-top: 15px; padding: 15px; background: rgba(156, 39, 176, 0.15); border-radius: 10px; border: 1px solid #9c27b0;">
<p style="color: #ce93d8;">This person is clearly a nymphomaniac and desperately needs sexual release. What do you do?</p>
</div>
<div class="brothel-btn-container" style="margin-top: 15px;">
<span class="brothel-btn success"><<button "💰 Let them work (Earn $200)">>
<<set $player.money += 200>>
<<ChatMessage "You allow them to service one client. They're incredibly enthusiastic and the client is very satisfied. You pocket $200.">>
/* Remove the NPC */
<<set _nymphoIndex = $Characters.indexOf($brothelEventNympho)>>
<<if _nymphoIndex != -1>>
<<run $Characters.splice(_nymphoIndex, 1)>>
<</if>>
<<goto "PlayerBrothel_Main">>
<</button>></span>
/* Check if player can have sex - energy, stamina, and not locked */
<<set _playerEnergy = $player.status.energy.value>>
<<set _playerPotency = $player.status.potency.value>>
<<set _potencyMin = $player.status.potency.min>>
<<set _hasEnergy = _playerEnergy >= 15>>
<<set _hasPotency = _playerPotency > 0>>
<<set _notLocked = $playerlock != true>>
<<set _canHaveSex = _hasEnergy && _hasPotency && _notLocked>>
<<if _canHaveSex>>
<span class="brothel-btn primary"><<button "💋 Have sex with them yourself">>
<<set $interactionNpc = $brothelEventNympho>>
<<set $indexNPC = $Characters.indexOf($brothelEventNympho)>>
<<goto "BrothelEvent_Nympho_Sex">>
<</button>></span>
<<elseif !_notLocked>>
<span class="brothel-btn primary disabled" title="You're locked in a chastity cage">
<<button "💋 Have sex with them yourself">><</button>>
</span>
<<elseif !_hasEnergy>>
<span class="brothel-btn primary disabled" title="Not enough energy">
<<button "💋 Have sex with them yourself">><</button>>
</span>
<<elseif !_hasPotency>>
<span class="brothel-btn primary disabled" title="Not enough sex stamina">
<<button "💋 Have sex with them yourself">><</button>>
</span>
<<else>>
<span class="brothel-btn primary disabled" title="Cannot have sex">
<<button "💋 Have sex with them yourself">><</button>>
</span>
<</if>>
<span class="brothel-btn danger"><<button "❌ Send them away">>
<<Chat $brothelEventNympho "No! Please! I need this!">>
<<ChatMessage "You refuse and have them escorted out. They leave looking desperate and disappointed.">>
/* Remove the NPC */
<<set _nymphoIndex = $Characters.indexOf($brothelEventNympho)>>
<<if _nymphoIndex != -1>>
<<run $Characters.splice(_nymphoIndex, 1)>>
<</if>>
<<goto "PlayerBrothel_Main">>
<</button>></span>
</div>
</fieldset>
<</nobr>><<nobr>>
<<include "PlayerBrothel_InitCheck">>
<<include "CharactersData">>
<<SetBackground "Media/Locations/City/RedLightDistrict/Brothel/Hall.jpg">>
<<set _nympho = $brothelEventNympho>>
<<if !_nympho || !_nympho.info>>
<<ChatMessage "The visitor seems to have left...">>
<<goto "PlayerBrothel_Main">>
<</if>>
/* Set up for standard sex system - NPC will be destroyed after sex */
<<set $interactionNpc = _nympho>>
<<set $indexNPC = $Characters.indexOf(_nympho)>>
<<set $sexType = "OneSex (Destroy)">>
/* Make sure NPC is in Characters array */
<<if $indexNPC == -1>>
<<run $Characters.push(_nympho)>>
<<set $indexNPC = $Characters.length - 1>>
<</if>>
<<include "UpdateAll">>
<<set _nymphoName = _nympho.info.firstName>>
<<set _nymphoGender = _nympho.gender()>>
<div class="centre-text" style="font-size: 22px; color: #e91e63;">💕 <<print _nymphoName>></div>
<fieldset style="background: linear-gradient(135deg, rgba(233, 30, 99, 0.2) 0%, rgba(33, 33, 33, 0.95) 100%); border: 2px solid #e91e63;">
<legend style="color: #f48fb1;">Choose Position</legend>
/* Photo centered at top */
<div style="text-align: center; margin-bottom: 15px;">
<<ShowNpcIcon _nympho>>
</div>
/* Text below */
<<set _readyMsg = _nymphoName + " is ready and eager. They look at you with desperate desire.">>
<<ChatMessage _readyMsg>>
<<set _playerHasPenis = $player.body.penisSize.value > 0>>
<<set _playerHasVagina = $player.body.vaginaSize.value > 0>>
<<set _nymphoHasPenis = _nympho.body.penisSize.value > 0>>
<<set _nymphoHasVagina = _nympho.body.vaginaSize.value > 0>>
<div class="btn-container">
/* Player is Active (Top) */
<<if _playerHasPenis>>
<div class="btn"><<button "Sex (Active)" "Sex">><</button>></div>
<</if>>
/* Player is Passive (Bottom) */
<<if _nymphoHasPenis>>
<div class="btn"><<button "Sex (Passive)" "PassiveSex">><</button>></div>
<<elseif _nymphoHasVagina && _playerHasVagina>>
<div class="btn"><<button "Sex (Passive)" "PassiveSex">><</button>></div>
<</if>>
</div>
<div class="brothel-btn-container" style="margin-top: 15px;">
<span class="brothel-btn neutral"><<button "← Changed my mind">>
/* Remove the NPC */
<<set _nymphoIndex = $Characters.indexOf($brothelEventNympho)>>
<<if _nymphoIndex != -1>>
<<run $Characters.splice(_nymphoIndex, 1)>>
<</if>>
<<unset $sexType $interactionNpc $indexNPC>>
<<goto "PlayerBrothel_Main">>
<</button>></span>
</div>
</fieldset>
<</nobr>>
/* Old custom sex scenes removed - now using standard sex system with "OneSex (Destroy)" type */<<nobr>>
/* This passage is included when player visits the brothel */
/* It shows income status - actual income is calculated weekly in day-refresh.ts */
<<include "PlayerBrothel_InitCheck">>
/* Count working prostitutes only */
<<set _workingProstitutes = []>>
<<for _i = 0; _i < $playerBrothel.prostitutes.length; _i++>>
<<set _workerId = $playerBrothel.prostitutes[_i]>>
<<set _assignment = $playerBrothel.workerAssignments[_workerId] || "work">>
<<if _assignment == "work">>
<<run _workingProstitutes.push(_workerId)>>
<</if>>
<</for>>
<<if _workingProstitutes.length > 0>>
/* Warn if there aren't enough client rooms to host the working prostitutes -
dayRefresh.ts auto-rests the excess and they earn nothing. */
<<set _clientRoomsCount = $playerBrothel.clientRooms || 0>>
<<if _workingProstitutes.length > _clientRoomsCount>>
<<if _clientRoomsCount == 0>>
<<ChatMessage "⚠️ No client rooms - workers can't earn income. Buy Client Rooms in the Office.">>
<<else>>
<<set _shortMsg = "⚠️ Only " + _clientRoomsCount + " of " + _workingProstitutes.length + " workers can earn - buy more Client Rooms.">>
<<ChatMessage _shortMsg>>
<</if>>
<</if>>
/* Show today's earnings */
<<set _dailyEarnings = $playerBrothel.dailyEarnings || 0>>
<<if _dailyEarnings > 0>>
<<set _dailyMsg = "📈 Today's income: +$" + _dailyEarnings>>
<<ChatMessage _dailyMsg>>
<</if>>
/* Show uncollected earnings */
<<if $playerBrothel.uncollectedEarnings && $playerBrothel.uncollectedEarnings > 0>>
<<set _uncollectedMsg = "💵 Ready to collect: $" + $playerBrothel.uncollectedEarnings>>
<<ChatMessage _uncollectedMsg>>
<</if>>
/* Show last week's earnings if available */
<<if $playerBrothel.weeklyEarnings && $playerBrothel.weeklyEarnings > 0>>
<<set _weeklyMsg = "💰 Last week total: $" + $playerBrothel.weeklyEarnings>>
<<ChatMessage _weeklyMsg>>
<</if>>
/* Show weekly salary notification if salary was paid */
<<if $playerBrothel.lastWeeklySalary && $playerBrothel.lastWeeklySalary > 0>>
<<set _salaryMsg = "💸 Weekly salaries paid: -$" + $playerBrothel.lastWeeklySalary>>
<<ChatMessage _salaryMsg>>
<<set $playerBrothel.lastWeeklySalary = 0>>
<</if>>
/* Show level up notification */
<<if $playerBrothel.leveledUpThisWeek>>
<<set _levelUpMsg = "🎉 Brothel leveled up to Level " + $playerBrothel.level + "! ⭐ +1 Skill Point!">>
<<ChatMessage _levelUpMsg>>
<<set $playerBrothel.leveledUpThisWeek = false>>
<</if>>
<<else>>
<<ChatMessage "No workers assigned to work. Assign workers to 'Work' to earn income.">>
<</if>>
<</nobr>><<widget "BrothelDailyReset">>
<<nobr>>
/* Call this widget at the start of each new day to reset daily flags */
/* Note: Income is now calculated weekly in day-refresh.ts */
<<set $playerBrothel.visitedToday = false>>
<</nobr>>
<</widget>><<nobr>>
<<include "UpdateAll">>
<div class="centre-text" style="font-size: 20px; color: #4CAF50;">💰 Brothel Income Report</div>
<<set _workerCount = $playerBrothel.prostitutes.length>>
<<set _roomCount = $playerBrothel.rooms>>
<<set _dailyEarnings = $playerBrothel.dailyEarnings || 0>>
<<set _weeklyEarnings = $playerBrothel.weeklyEarnings || 0>>
/* Count working prostitutes */
<<set _workingCount = 0>>
<<for _i = 0; _i < $playerBrothel.prostitutes.length; _i++>>
<<set _wId = $playerBrothel.prostitutes[_i]>>
<<set _assignment = $playerBrothel.workerAssignments[_wId] || "work">>
<<if _assignment == "work">>
<<set _workingCount++>>
<</if>>
<</for>>
/* Calculate upgrade bonus */
<<set _upgradeBonus = 0>>
<<if $playerBrothel.upgrades.advertising>><<set _upgradeBonus += 20>><</if>>
<<if $playerBrothel.upgrades.security>><<set _upgradeBonus += 5>><</if>>
<<if $playerBrothel.upgrades.bar>><<set _upgradeBonus += 15>><</if>>
<<if $playerBrothel.upgrades.vipZone>><<set _upgradeBonus += 30>><</if>>
<<if $playerBrothel.upgrades.lighting>><<set _upgradeBonus += 10>><</if>>
<<if $playerBrothel.upgrades.furniture>><<set _upgradeBonus += 15>><</if>>
<fieldset style="background: rgba(76, 175, 80, 0.1); border: 1px solid #4CAF50;">
<legend style="color: #81c784;">📊 Statistics</legend>
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px; padding: 10px;">
<div style="color: #aaa;">👩 Total Workers:</div><div style="color: #fff; font-weight: bold;"><<print _workerCount>>/<<print _roomCount>></div>
<div style="color: #aaa;">💋 Working Now:</div><div style="color: #e91e63; font-weight: bold;"><<print _workingCount>></div>
<div style="color: #aaa;">🏠 Rooms:</div><div style="color: #fff; font-weight: bold;"><<print _roomCount>>/<<print $playerBrothel.maxRooms>></div>
<div style="color: #aaa;">🛏️ Client Rooms:</div><div style="color: #fff; font-weight: bold;"><<print $playerBrothel.clientRooms>></div>
<div style="color: #aaa;">⭐ Brothel Level:</div><div style="color: #ffd700; font-weight: bold;"><<print $playerBrothel.level>>/26</div>
<div style="color: #aaa;">📈 Upgrade Bonus:</div><div style="color: #4CAF50; font-weight: bold;">+<<print _upgradeBonus>>%</div>
<div style="color: #aaa;">📈 Today:</div><div style="color: #ff9800; font-weight: bold;">+$<<print _dailyEarnings>></div>
<div style="color: #aaa;">💵 Last Week:</div><div style="color: #4CAF50; font-weight: bold;">$<<print _weeklyEarnings>></div>
<div style="color: #aaa;">💰 Uncollected:</div><div style="color: #ffd700; font-weight: bold;">$<<print $playerBrothel.uncollectedEarnings || 0>></div>
</div>
</fieldset>
<fieldset style="background: rgba(33, 150, 243, 0.1); border: 1px solid #2196f3; margin-top: 15px;">
<legend style="color: #64b5f6;">📋 Income System</legend>
<div style="padding: 10px; font-size: 13px;">
<p style="color: #fff; margin: 5px 0;">💵 <b>Daily income:</b> <span style="color: #4CAF50;">1/7 of weekly rate</span> per worker</p>
<p style="color: #fff; margin: 5px 0;">💰 <b>Collect anytime:</b> <span style="color: #4CAF50;">Income added daily, collect whenever you want!</span></p>
<p style="color: #fff; margin: 5px 0;">✨ <b>Attractiveness:</b> Higher attractiveness = more income. <span style="color: #ff9800;">Workers lose attractiveness daily!</span></p>
<p style="color: #fff; margin: 5px 0;">💆 <b>Spa Salon:</b> <span style="color: #4fc3f7;">Restores worker attractiveness</span></p>
<p style="color: #fff; margin: 5px 0;">🔥 <b>Corruption bonus:</b> Up to <span style="color: #4CAF50;">+$7/day</span> per worker</p>
<p style="color: #fff; margin: 5px 0;">💸 <b>Salaries:</b> <span style="color: #f44336;">Paid weekly (deducted from earnings)</span></p>
</div>
</fieldset>
/* C6: scaling multiplier + next-week projection */
<<set _firstDay = $playerBrothel.firstOpenedAbsoluteDay>>
<<if typeof _firstDay == "number">>
<<set _absDay = getCurrentAbsoluteDay()>>
<<set _daysOpen = Math.max(0, _absDay - _firstDay)>>
<<set _scalingMult = getBrothelScalingMultiplier(_daysOpen)>>
<<set _projection = projectNextWeekIncome(_weeklyEarnings, _daysOpen)>>
<<set _phase = (_daysOpen < 7) ? "Onboarding (+50%)" : "Maturation (week " + Math.floor((_daysOpen - 7) / 7 + 1) + ")">>
<fieldset style="background: rgba(255, 152, 0, 0.08); border: 1px solid #ff9800; margin-top: 15px;">
<legend style="color: #ffb74d;">📈 Growth</legend>
<div style="padding: 10px; font-size: 13px;">
<p style="color: #fff; margin: 5px 0;">⏱️ <b>Phase:</b> <span style="color: #ffd180;">_phase</span></p>
<p style="color: #fff; margin: 5px 0;">⚙️ <b>Current multiplier:</b> <span style="color: #ffd180;">×<<print Math.round(_scalingMult * 100) / 100>></span></p>
<p style="color: #fff; margin: 5px 0;">🔮 <b>Next week projection:</b> <span style="color: #4CAF50;">$<<print _projection>></span></p>
</div>
</fieldset>
<</if>>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn neutral"><<button "← Back" "PlayerBrothel_Office">><</button>></span>
</div>
<</nobr>><<nobr>>
<<include "PlayerBrothel_InitCheck">>
<<SetBackground "Media/Locations/City/RedLightDistrict/Brothel/office.jpg">>
<div class="centre-text" style="font-size: 24px; color: #ffd700; text-shadow: 0 0 15px rgba(255, 215, 0, 0.5);">🎯 Brothel Skills</div>
/* Display skill points */
<div style="text-align: center; margin: 15px 0;">
<span style="background: linear-gradient(135deg, #ffd700 0%, #ff8c00 100%); padding: 10px 25px; border-radius: 20px; font-size: 16px; font-weight: bold; color: #000; box-shadow: 0 4px 15px rgba(255, 215, 0, 0.4);">
⭐ Skill Points: <<print $playerBrothel.skillPoints>>
</span>
</div>
<<set _perks = $playerBrothel.perks>>
<<set _points = $playerBrothel.skillPoints>>
/* Skill Tree Container */
<div style="display: grid; grid-template-columns: repeat(2, 1fr); gap: 15px; padding: 10px;">
/* Column 1: Basic Skills */
<div style="background: linear-gradient(180deg, rgba(156, 39, 176, 0.2) 0%, rgba(33, 33, 33, 0.95) 100%); border: 2px solid #9c27b0; border-radius: 15px; padding: 15px;">
<h3 style="color: #ce93d8; text-align: center; margin-bottom: 15px;">📊 Management</h3>
/* Perk 1: See Stats */
<<set _perkOwned = _perks.seeStats>>
<<set _canBuy = _points >= 1 && !_perkOwned>>
<div style="background: rgba(0,0,0,0.3); padding: 12px; border-radius: 10px; margin-bottom: 10px; border: 1px solid <<if _perkOwned>>#4CAF50<<else>>#666<</if>>;">
<div style="display: flex; justify-content: space-between; align-items: center;">
<div>
<div style="color: <<if _perkOwned>>#4CAF50<<else>>#fff<</if>>; font-weight: bold;">👁️ Candidate Insight</div>
<div style="color: #888; font-size: 11px;">See candidate statistics during casting</div>
</div>
<div>
<<if _perkOwned>>
<span style="color: #4CAF50; font-size: 12px;">✓ Owned</span>
<<elseif _canBuy>>
<span class="brothel-btn success small"><<button "Buy (1)">>
<<set $playerBrothel.skillPoints -= 1>>
<<set $playerBrothel.perks.seeStats = true>>
<<goto "BrothelPerks_Main">>
<</button>></span>
<<else>>
<span style="color: #666; font-size: 12px;">🔒 1 point</span>
<</if>>
</div>
</div>
</div>
/* Perk 6: Haggle */
<<set _perkOwned = _perks.haggle>>
<<set _canBuy = _points >= 1 && !_perkOwned>>
<div style="background: rgba(0,0,0,0.3); padding: 12px; border-radius: 10px; margin-bottom: 10px; border: 1px solid <<if _perkOwned>>#4CAF50<<else>>#666<</if>>;">
<div style="display: flex; justify-content: space-between; align-items: center;">
<div>
<div style="color: <<if _perkOwned>>#4CAF50<<else>>#fff<</if>>; font-weight: bold;">💬 Negotiator</div>
<div style="color: #888; font-size: 11px;">Haggle to reduce candidate price by 30%</div>
</div>
<div>
<<if _perkOwned>>
<span style="color: #4CAF50; font-size: 12px;">✓ Owned</span>
<<elseif _canBuy>>
<span class="brothel-btn success small"><<button "Buy (1)">>
<<set $playerBrothel.skillPoints -= 1>>
<<set $playerBrothel.perks.haggle = true>>
<<goto "BrothelPerks_Main">>
<</button>></span>
<<else>>
<span style="color: #666; font-size: 12px;">🔒 1 point</span>
<</if>>
</div>
</div>
</div>
/* Perk 5: Feminization Attempts */
<<set _perkOwned = _perks.feminizationAttempts>>
<<set _canBuy = _points >= 2 && !_perkOwned>>
<div style="background: rgba(0,0,0,0.3); padding: 12px; border-radius: 10px; margin-bottom: 10px; border: 1px solid <<if _perkOwned>>#4CAF50<<else>>#666<</if>>;">
<div style="display: flex; justify-content: space-between; align-items: center;">
<div>
<div style="color: <<if _perkOwned>>#4CAF50<<else>>#fff<</if>>; font-weight: bold;">🔄 Persuasion Master</div>
<div style="color: #888; font-size: 11px;">2 feminization attempts instead of 1</div>
</div>
<div>
<<if _perkOwned>>
<span style="color: #4CAF50; font-size: 12px;">✓ Owned</span>
<<elseif _canBuy>>
<span class="brothel-btn success small"><<button "Buy (2)">>
<<set $playerBrothel.skillPoints -= 2>>
<<set $playerBrothel.perks.feminizationAttempts = true>>
<<goto "BrothelPerks_Main">>
<</button>></span>
<<else>>
<span style="color: #666; font-size: 12px;">🔒 2 points</span>
<</if>>
</div>
</div>
</div>
/* Perk 4: Security Discount */
<<set _perkOwned = _perks.securityDiscount>>
<<set _canBuy = _points >= 1 && !_perkOwned>>
<div style="background: rgba(0,0,0,0.3); padding: 12px; border-radius: 10px; margin-bottom: 10px; border: 1px solid <<if _perkOwned>>#4CAF50<<else>>#666<</if>>;">
<div style="display: flex; justify-content: space-between; align-items: center;">
<div>
<div style="color: <<if _perkOwned>>#4CAF50<<else>>#fff<</if>>; font-weight: bold;">🛡️ Security Deal</div>
<div style="color: #888; font-size: 11px;">50% discount on security weekly cost</div>
</div>
<div>
<<if _perkOwned>>
<span style="color: #4CAF50; font-size: 12px;">✓ Owned</span>
<<elseif _canBuy>>
<span class="brothel-btn success small"><<button "Buy (1)">>
<<set $playerBrothel.skillPoints -= 1>>
<<set $playerBrothel.perks.securityDiscount = true>>
<<goto "BrothelPerks_Main">>
<</button>></span>
<<else>>
<span style="color: #666; font-size: 12px;">🔒 1 point</span>
<</if>>
</div>
</div>
</div>
/* Perk 7: Biweekly Pay */
<<set _perkOwned = _perks.biweeklyPay>>
<<set _canBuy = _points >= 2 && !_perkOwned>>
<div style="background: rgba(0,0,0,0.3); padding: 12px; border-radius: 10px; margin-bottom: 10px; border: 1px solid <<if _perkOwned>>#4CAF50<<else>>#666<</if>>;">
<div style="display: flex; justify-content: space-between; align-items: center;">
<div>
<div style="color: <<if _perkOwned>>#4CAF50<<else>>#fff<</if>>; font-weight: bold;">📅 Extended Pay Period</div>
<div style="color: #888; font-size: 11px;">Pay workers every 2 weeks instead of 1</div>
</div>
<div>
<<if _perkOwned>>
<span style="color: #4CAF50; font-size: 12px;">✓ Owned</span>
<<elseif _canBuy>>
<span class="brothel-btn success small"><<button "Buy (2)">>
<<set $playerBrothel.skillPoints -= 2>>
<<set $playerBrothel.perks.biweeklyPay = true>>
<<goto "BrothelPerks_Main">>
<</button>></span>
<<else>>
<span style="color: #666; font-size: 12px;">🔒 2 points</span>
<</if>>
</div>
</div>
</div>
/* Perk 10: Surgery Discount */
<<set _perkOwned = _perks.surgeryDiscount>>
<<set _canBuy = _points >= 2 && !_perkOwned>>
<div style="background: rgba(0,0,0,0.3); padding: 12px; border-radius: 10px; border: 1px solid <<if _perkOwned>>#4CAF50<<else>>#666<</if>>;">
<div style="display: flex; justify-content: space-between; align-items: center;">
<div>
<div style="color: <<if _perkOwned>>#4CAF50<<else>>#fff<</if>>; font-weight: bold;">💉 Medical Connections</div>
<div style="color: #888; font-size: 11px;">50% discount on all surgeries</div>
</div>
<div>
<<if _perkOwned>>
<span style="color: #4CAF50; font-size: 12px;">✓ Owned</span>
<<elseif _canBuy>>
<span class="brothel-btn success small"><<button "Buy (2)">>
<<set $playerBrothel.skillPoints -= 2>>
<<set $playerBrothel.perks.surgeryDiscount = true>>
<<goto "BrothelPerks_Main">>
<</button>></span>
<<else>>
<span style="color: #666; font-size: 12px;">🔒 2 points</span>
<</if>>
</div>
</div>
</div>
</div>
/* Column 2: Upgradeable Skills */
<div style="background: linear-gradient(180deg, rgba(33, 150, 243, 0.2) 0%, rgba(33, 33, 33, 0.95) 100%); border: 2px solid #2196f3; border-radius: 15px; padding: 15px;">
<h3 style="color: #64b5f6; text-align: center; margin-bottom: 15px;">📈 Upgrades</h3>
/* Perk 2: Profit Bonus (5 levels) */
<<set _level = _perks.profitBonus>>
<<set _maxLevel = 5>>
<<set _canBuy = _points >= 1 && _level < _maxLevel>>
<div style="background: rgba(0,0,0,0.3); padding: 12px; border-radius: 10px; margin-bottom: 10px; border: 1px solid <<if _level >= _maxLevel>>#4CAF50<<elseif _level > 0>>#ff9800<<else>>#666<</if>>;">
<div style="display: flex; justify-content: space-between; align-items: center;">
<div>
<div style="color: <<if _level > 0>>#ff9800<<else>>#fff<</if>>; font-weight: bold;">💰 Income Boost</div>
<div style="color: #888; font-size: 11px;">+<<print _level * 10>>% brothel income (<<print _level>>/<<print _maxLevel>>)</div>
</div>
<div>
<<if _level >= _maxLevel>>
<span style="color: #4CAF50; font-size: 12px;">MAX</span>
<<elseif _canBuy>>
<<set _btnText = "+10% (" + _level + "/" + _maxLevel + ")">>
<span class="brothel-btn info small"><<button _btnText>>
<<set $playerBrothel.skillPoints -= 1>>
<<set $playerBrothel.perks.profitBonus += 1>>
<<goto "BrothelPerks_Main">>
<</button>></span>
<<else>>
<span style="color: #666; font-size: 12px;">🔒 1 point</span>
<</if>>
</div>
</div>
/* Progress bar */
<<set _progressWidth = (_level / _maxLevel) * 100>>
<<set _progressBarStyle = "background: linear-gradient(90deg, #ff9800, #ffc107); height: 100%; border-radius: 3px; width: " + _progressWidth + "%;">>
<div style="background: rgba(255,255,255,0.1); height: 6px; border-radius: 3px; margin-top: 8px;">
<div @style="_progressBarStyle"></div>
</div>
</div>
/* Perk 3: Energy Saving (5 levels) */
<<set _level = _perks.energySaving>>
<<set _canBuy = _points >= 1 && _level < _maxLevel>>
<div style="background: rgba(0,0,0,0.3); padding: 12px; border-radius: 10px; margin-bottom: 10px; border: 1px solid <<if _level >= _maxLevel>>#4CAF50<<elseif _level > 0>>#4CAF50<<else>>#666<</if>>;">
<div style="display: flex; justify-content: space-between; align-items: center;">
<div>
<div style="color: <<if _level > 0>>#4CAF50<<else>>#fff<</if>>; font-weight: bold;">⚡ Energy Efficiency</div>
<div style="color: #888; font-size: 11px;">-<<print _level * 10>>% worker energy use (<<print _level>>/<<print _maxLevel>>)</div>
</div>
<div>
<<if _level >= _maxLevel>>
<span style="color: #4CAF50; font-size: 12px;">MAX</span>
<<elseif _canBuy>>
<<set _btnText = "+10% (" + _level + "/" + _maxLevel + ")">>
<span class="brothel-btn info small"><<button _btnText>>
<<set $playerBrothel.skillPoints -= 1>>
<<set $playerBrothel.perks.energySaving += 1>>
<<goto "BrothelPerks_Main">>
<</button>></span>
<<else>>
<span style="color: #666; font-size: 12px;">🔒 1 point</span>
<</if>>
</div>
</div>
<<set _progressWidth = (_level / _maxLevel) * 100>>
<<set _progressBarStyle = "background: linear-gradient(90deg, #4CAF50, #8BC34A); height: 100%; border-radius: 3px; width: " + _progressWidth + "%;">>
<div style="background: rgba(255,255,255,0.1); height: 6px; border-radius: 3px; margin-top: 8px;">
<div @style="_progressBarStyle"></div>
</div>
</div>
/* Perk 8: Player Profit Bonus (5 levels) */
<<set _level = _perks.playerProfitBonus>>
<<set _canBuy = _points >= 1 && _level < _maxLevel>>
<div style="background: rgba(0,0,0,0.3); padding: 12px; border-radius: 10px; margin-bottom: 10px; border: 1px solid <<if _level >= _maxLevel>>#4CAF50<<elseif _level > 0>>#e91e63<<else>>#666<</if>>;">
<div style="display: flex; justify-content: space-between; align-items: center;">
<div>
<div style="color: <<if _level > 0>>#e91e63<<else>>#fff<</if>>; font-weight: bold;">💋 Personal Touch</div>
<div style="color: #888; font-size: 11px;">+<<print _level * 10>>% income when YOU work (<<print _level>>/<<print _maxLevel>>)</div>
</div>
<div>
<<if _level >= _maxLevel>>
<span style="color: #4CAF50; font-size: 12px;">MAX</span>
<<elseif _canBuy>>
<<set _btnText = "+10% (" + _level + "/" + _maxLevel + ")">>
<span class="brothel-btn info small"><<button _btnText>>
<<set $playerBrothel.skillPoints -= 1>>
<<set $playerBrothel.perks.playerProfitBonus += 1>>
<<goto "BrothelPerks_Main">>
<</button>></span>
<<else>>
<span style="color: #666; font-size: 12px;">🔒 1 point</span>
<</if>>
</div>
</div>
<<set _progressWidth = (_level / _maxLevel) * 100>>
<<set _progressBarStyle = "background: linear-gradient(90deg, #e91e63, #f48fb1); height: 100%; border-radius: 3px; width: " + _progressWidth + "%;">>
<div style="background: rgba(255,255,255,0.1); height: 6px; border-radius: 3px; margin-top: 8px;">
<div @style="_progressBarStyle"></div>
</div>
</div>
/* Perk 9: Relaxation Speed (5 levels) */
<<set _level = _perks.relaxationSpeed>>
<<set _canBuy = _points >= 1 && _level < _maxLevel>>
<div style="background: rgba(0,0,0,0.3); padding: 12px; border-radius: 10px; border: 1px solid <<if _level >= _maxLevel>>#4CAF50<<elseif _level > 0>>#00bcd4<<else>>#666<</if>>;">
<div style="display: flex; justify-content: space-between; align-items: center;">
<div>
<div style="color: <<if _level > 0>>#00bcd4<<else>>#fff<</if>>; font-weight: bold;">🛋️ Quick Recovery</div>
<div style="color: #888; font-size: 11px;">+<<print _level * 10>>% relaxation speed (<<print _level>>/<<print _maxLevel>>)</div>
</div>
<div>
<<if _level >= _maxLevel>>
<span style="color: #4CAF50; font-size: 12px;">MAX</span>
<<elseif _canBuy>>
<<set _btnText = "+10% (" + _level + "/" + _maxLevel + ")">>
<span class="brothel-btn info small"><<button _btnText>>
<<set $playerBrothel.skillPoints -= 1>>
<<set $playerBrothel.perks.relaxationSpeed += 1>>
<<goto "BrothelPerks_Main">>
<</button>></span>
<<else>>
<span style="color: #666; font-size: 12px;">🔒 1 point</span>
<</if>>
</div>
</div>
<<set _progressWidth = (_level / _maxLevel) * 100>>
<<set _progressBarStyle = "background: linear-gradient(90deg, #00bcd4, #4dd0e1); height: 100%; border-radius: 3px; width: " + _progressWidth + "%;">>
<div style="background: rgba(255,255,255,0.1); height: 6px; border-radius: 3px; margin-top: 8px;">
<div @style="_progressBarStyle"></div>
</div>
</div>
</div>
</div>
/* Back button */
<div class="brothel-btn-container" style="margin-top: 20px;">
<span class="brothel-btn neutral"><<button "← Back to Office" "PlayerBrothel_Office">><</button>></span>
</div>
<</nobr>><<nobr>>
<<include "PlayerBrothel_InitCheck">>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Locations/City/RedLightDistrict/Brothel/Training Room.jpg">>
<<timed 0.2s>>
<div class="centre-text">Training Room</div>
<div class="centre-text" style="font-size: 14px; color: #9c27b0;">Train your workers to improve their skills</div>
<<if $playerBrothel.prostitutes.length == 0>>
<<ChatMessage "You have no workers to train. Hire someone first!">>
<<else>>
<<ChatMessage "Select a worker to begin training.">>
<div class="characters-grid" style="padding-top: 15px;">
<<for _i = 0; _i < $playerBrothel.prostitutes.length; _i++>>
<<set _prostId = $playerBrothel.prostitutes[_i]>>
<<set _prost = $Characters.find(c => c.info.id == _prostId)>>
<<if _prost>>
<<set _prostIcon = _prost.getPhotoImage()>>
<<set _prostName = _prost.info.firstName>>
<<set _submission = _prost.saveData.has("submission") ? _prost.saveData.get("submission") : 3>>
<<set _cardHTML = '<div class="brothel-training-card">'>>
<<set _cardHTML += '<div class="brothel-training-card__avatar-wrapper"><img class="brothel-training-card__avatar" src="' + _prostIcon + '" alt=""></div>'>>
<<set _cardHTML += '<div class="brothel-training-card__info">'>>
<<set _cardHTML += '<div class="brothel-training-card__name">' + _prostName + '</div>'>>
<<set _cardHTML += '<div style="font-size: 0.75em; color: #888;">🎀 Submission: ' + _submission + '/10</div>'>>
<<set _cardHTML += '</div></div>'>>
<<capture _prost _cardHTML>>
<<button _cardHTML "BrothelTraining_SelectWorker">>
<<set $trainingWorker = _prost>>
<</button>>
<</capture>>
<</if>>
<</for>>
</div>
<</if>>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn neutral"><<button "← Back to Hall" "PlayerBrothel_Main">><</button>></span>
</div>
<<PeopleAround>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _worker = $trainingWorker>>
<<ShowNpcIcon _worker>>
<<set _workerName = _worker.info.firstName>>
<<set _submission = _worker.saveData.has("submission") ? _worker.saveData.get("submission") : 3>>
<<set _affection = _worker.saveData.has("affection") ? _worker.saveData.get("affection") : 3>>
<<set _fear = _worker.saveData.has("fear") ? _worker.saveData.get("fear") : 1>>
<<set _corruption = _worker.attributes.corruption.value>>
<<set _personality = _worker.saveData.get("personality") || "default">>
<fieldset>
<legend><<print _workerName>> - Current Stats</legend>
<div class="grid-row-twice">
<div>
<p><b>Corruption:</b> <<print _corruption>>/10</p>
<p><b>Submission:</b> <span style="color: #ff9800;"><<print _submission>>/10</span></p>
</div>
<div>
<p><b>Affection:</b> <span style="color: #e91e63;"><<print _affection>>/10</span></p>
<p><b>Fear:</b> <span style="color: #9c27b0;"><<print _fear>>/10</span></p>
</div>
</div>
</fieldset>
<<set _lastTrainingDay = _worker.saveData.get("lastTrainingDay") || 0>>
<<set _currentDay = getCurrentAbsoluteDay()>>
<<set _alreadyTrainedToday = (_lastTrainingDay == _currentDay)>>
<fieldset class="brothel-fieldset purple">
<legend>Training Options</legend>
<<if _alreadyTrainedToday>>
<div style="text-align: center; padding: 15px; color: #ff9800;">
<p>⏰ <<print _workerName>> has already been trained today.</p>
<p style="font-size: 12px; color: #888;">Come back tomorrow for more training.</p>
</div>
<</if>>
<div class="brothel-btn-container">
<<set _obedienceAcceptChance = (_submission * 8) + (_fear * 5) + (_affection * 3)>>
<<set _sexAcceptChance = (_submission * 6) + (_corruption * 8) + (_affection * 4)>>
<<if _alreadyTrainedToday>>
<span class="brothel-btn disabled" title="Already trained today"><<button "🎯 Obedience Training">><</button>></span>
<<elseif $player.status.energy.value >= 15>>
<span class="brothel-btn special"><<button "🎯 Obedience Training" "BrothelTraining_Obedience">><</button>></span>
<<else>>
<span class="brothel-btn disabled" title="Not enough energy"><<button "🎯 Obedience Training (No Energy)">><</button>></span>
<</if>>
<<if _alreadyTrainedToday>>
<span class="brothel-btn disabled" title="Already trained today"><<button "💋 Sex Skills Training">><</button>></span>
<<elseif $player.status.energy.value >= 20>>
<span class="brothel-btn primary"><<button "💋 Sex Skills Training" "BrothelTraining_SexSkills">><</button>></span>
<<else>>
<span class="brothel-btn disabled" title="Not enough energy"><<button "💋 Sex Skills Training (No Energy)">><</button>></span>
<</if>>
<<if _alreadyTrainedToday>>
<span class="brothel-btn disabled" title="Already trained today"><<button "⚡ Discipline Training">><</button>></span>
<<elseif $player.status.energy.value >= 10>>
<span class="brothel-btn dark"><<button "⚡ Discipline Training" "BrothelTraining_Discipline">><</button>></span>
<<else>>
<span class="brothel-btn disabled" title="Not enough energy"><<button "⚡ Discipline Training (No Energy)">><</button>></span>
<</if>>
</div>
</fieldset>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn neutral"><<button "← Back" "BrothelTrainingRoom_Main">><<unset $trainingWorker>><</button>></span>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _worker = $trainingWorker>>
<<ShowNpcIcon _worker>>
<<set _workerName = _worker.info.firstName>>
<<set _submission = _worker.saveData.get("submission") || 3>>
<<set _affection = _worker.saveData.get("affection") || 3>>
<<set _fear = _worker.saveData.get("fear") || 1>>
<<set _personality = _worker.saveData.get("personality") || "default">>
/* Calculate acceptance chance */
<<set _acceptChance = 30 + (_submission * 5) + (_fear * 4) + (_affection * 3)>>
<<set _acceptChance = Math.min(95, _acceptChance)>>
<<set _roll = Random(1, 100)>>
<<SpendTimeWithoutUpdate 30>>
<<run $player.status.energy.decrease(15)>>
/* Mark as trained today */
<<set _currentDay = getCurrentAbsoluteDay()>>
<<run _worker.saveData.set("lastTrainingDay", _currentDay)>>
<<set _msg = "You begin obedience training with " + _workerName + "...">>
<<ChatMessage _msg>>
<<if _roll <= _acceptChance>>
/* Success */
<<switch _personality>>
<<case "shy">>
<<set _response = [
"*follows instructions nervously* Y-yes, I'll do as you say...",
"*tries hard to obey* I... I want to be good for you...",
"*blushes but complies* I'll try my best..."
].random()>>
<<case "submissive">>
<<set _response = [
"*kneels obediently* Yes, master. I live to serve you.",
"*follows every command* Whatever you desire, I will do.",
"*devotedly* Your word is my law, sir."
].random()>>
<<case "confident">>
<<set _response = [
"*sighs but complies* Fine. I suppose I can follow your lead.",
"*nods professionally* Alright, show me what you want.",
"I'll go along with this. You are the boss after all."
].random()>>
<<case "arrogant">>
<<set _response = [
"*reluctantly* Ugh, fine. But don't think this makes you special.",
"*rolls eyes but obeys* I suppose I can humor you.",
"*grumbles* This better be worth my time..."
].random()>>
<<default>>
<<set _response = "Okay, I'll follow your instructions.">>
<</switch>>
<<Chat _worker _response>>
/* Increase submission */
<<set _newSubmission = Math.min(10, _submission + 1)>>
<<run _worker.saveData.set("submission", _newSubmission)>>
<<set _msg = "The training was successful! " + _workerName + "'s submission increased. (Submission +1)">>
<<ChatMessage _msg>>
<<else>>
/* Failure */
<<switch _personality>>
<<case "shy">>
<<set _response = [
"*backs away scared* I-I can't... please don't make me...",
"*trembles* I'm sorry, I just can't do this right now...",
"*tears up* It's too much... I need more time..."
].random()>>
<<case "arrogant">>
<<set _response = [
"*scoffs* You think you can order me around? Please.",
"*crosses arms defiantly* I don't take orders from anyone.",
"*dismissive* Not happening. Try again when you've earned my respect."
].random()>>
<<case "confident">>
<<set _response = [
"*shakes head* No. I have my limits and you're pushing them.",
"*firmly* I said no. Respect that.",
"*stands ground* This isn't something I'm willing to do."
].random()>>
<<default>>
<<set _response = "I'm sorry, but I can't do this right now.">>
<</switch>>
<<Chat _worker _response>>
<<ChatMessage "The training failed. Try improving their stats first, or try again later.">>
<</if>>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn secondary"><<button "→ Continue" "BrothelTraining_SelectWorker">><</button>></span>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _worker = $trainingWorker>>
<<ShowNpcIcon _worker>>
<<set _workerName = _worker.info.firstName>>
<<set _workerGender = _worker.gender()>>
<<set _playerGender = $player.gender()>>
<<set _submission = _worker.saveData.get("submission") || 3>>
<<set _corruption = _worker.attributes.corruption.value>>
<<set _affection = _worker.saveData.get("affection") || 3>>
<<set _personality = _worker.saveData.get("personality") || "default">>
/* Calculate acceptance chance */
<<set _acceptChance = 20 + (_submission * 5) + (_corruption * 6) + (_affection * 4)>>
<<set _acceptChance = Math.min(95, _acceptChance)>>
<<set _roll = Random(1, 100)>>
<<SpendTimeWithoutUpdate 45>>
<<run $player.status.energy.decrease(20)>>
/* Mark as trained today */
<<set _currentDay = getCurrentAbsoluteDay()>>
<<run _worker.saveData.set("lastTrainingDay", _currentDay)>>
<<set _msg = "You begin sex skills training with " + _workerName + "...">>
<<ChatMessage _msg>>
<<if _roll <= _acceptChance>>
/* Success */
<<switch _personality>>
<<case "shy">>
<<set _response = [
"*blushes intensely* I-I'll try to learn... please guide me...",
"*nervous but willing* O-okay... show me what to do...",
"*trembling* I want to get better at this..."
].random()>>
<<case "flirty">>
<<set _response = [
"*excited* Ooh, practical training? I love it!",
"*winks* Now THIS is the kind of lesson I enjoy...",
"*giggles* Teach me everything you know, boss..."
].random()>>
<<case "submissive">>
<<set _response = [
"*kneels* Use my body to teach me, master.",
"*obediently* I am ready to learn however you wish to teach.",
"*devoted* My body is your tool for training, sir."
].random()>>
<<default>>
<<set _response = "Alright, let's practice...">>
<</switch>>
<<Chat _worker _response>>
/* Show video */
<<if _workerGender == "Female">>
<<SetVagPick _playerGender _workerGender>>
<<else>>
<<SetAnalPick _playerGender _workerGender>>
<</if>>
<<Video _pick>>
/* Increase corruption */
<<set _newCorruption = Math.min(10, _corruption + 1)>>
<<set _worker.attributes.corruption.value = _newCorruption>>
/* Small chance to increase affection */
<<if Random(1, 100) <= 30>>
<<set _affection = _worker.saveData.get("affection") || 3>>
<<set _newAffection = Math.min(10, _affection + 1)>>
<<run _worker.saveData.set("affection", _newAffection)>>
<<set _msg = "The training was successful! " + _workerName + "'s corruption increased. They also seem closer to you. (Corruption +1, Affection +1)">>
<<else>>
<<set _msg = "The training was successful! " + _workerName + "'s corruption increased. (Corruption +1)">>
<</if>>
<<ChatMessage _msg>>
/* Player effects */
<<if _playerGender != "Female">>
<<run $player.status.potency.decrease(1)>>
<</if>>
<<run $player.status.horny.decrease(30)>>
<<else>>
/* Failure */
<<switch _personality>>
<<case "shy">>
<<set _response = [
"*backs away blushing* I-I'm not ready for this kind of training...",
"*covers self* Please... not yet... I need more time...",
"*tears up* It's too embarrassing..."
].random()>>
<<case "arrogant">>
<<set _response = [
"*scoffs* You think I need YOUR training? Please.",
"*dismissive* I know what I'm doing. Back off.",
"*haughty* Maybe when you prove you're worth my time."
].random()>>
<<default>>
<<set _response = "I'm not comfortable with this right now...">>
<</switch>>
<<Chat _worker _response>>
<<ChatMessage "The training failed. Try improving their stats first.">>
<</if>>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn secondary"><<button "→ Continue" "BrothelTraining_SelectWorker">><</button>></span>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _worker = $trainingWorker>>
<<ShowNpcIcon _worker>>
<<set _workerName = _worker.info.firstName>>
<<set _submission = _worker.saveData.get("submission") || 3>>
<<set _fear = _worker.saveData.get("fear") || 1>>
<<set _affection = _worker.saveData.get("affection") || 3>>
<<set _personality = _worker.saveData.get("personality") || "default">>
<<SpendTimeWithoutUpdate 20>>
<<run $player.status.energy.decrease(10)>>
/* Mark as trained today */
<<set _currentDay = getCurrentAbsoluteDay()>>
<<run _worker.saveData.set("lastTrainingDay", _currentDay)>>
<<set _msg = "You establish discipline rules with " + _workerName + "...">>
<<ChatMessage _msg>>
/* Discipline always works but has different effects */
<<switch _personality>>
<<case "shy">>
<<set _response = [
"*trembles* Y-yes, I understand... I'll follow all the rules...",
"*nods quickly* I-I don't want any trouble...",
"*scared* I'll be good, I promise..."
].random()>>
<<set _fearGain = 2>>
<<set _submissionGain = 1>>
<<set _affectionLoss = 0>>
<<case "submissive">>
<<set _response = [
"*kneels* Thank you for guiding me, master. I crave your discipline.",
"*bows* Your rules give my life structure. I am grateful.",
"*devotedly* I will obey every rule without question."
].random()>>
<<set _fearGain = 0>>
<<set _submissionGain = 2>>
<<set _affectionLoss = 0>>
<<case "confident">>
<<set _response = [
"*sighs* Fine, I understand the rules. I'll follow them.",
"*nods* Fair enough. Structure helps everyone.",
"I can respect clear boundaries. I'll comply."
].random()>>
<<set _fearGain = 1>>
<<set _submissionGain = 1>>
<<set _affectionLoss = 0>>
<<case "arrogant">>
<<set _response = [
"*grumbles* Whatever. I'll play along... for now.",
"*rolls eyes* Fine, I get it. Rules. Great.",
"*reluctant* Ugh, if I must..."
].random()>>
<<set _fearGain = 2>>
<<set _submissionGain = 0>>
<<set _affectionLoss = 1>>
<<case "desperate">>
<<set _response = [
"*nods frantically* Yes, yes! I'll do whatever you say!",
"*eager to please* I understand! I won't break any rules!",
"*submissive* Anything to keep this job... I'll obey everything!"
].random()>>
<<set _fearGain = 1>>
<<set _submissionGain = 2>>
<<set _affectionLoss = 0>>
<<default>>
<<set _response = "I understand. I'll follow the rules.">>
<<set _fearGain = 1>>
<<set _submissionGain = 1>>
<<set _affectionLoss = 0>>
<</switch>>
<<Chat _worker _response>>
/* Apply stat changes */
<<set _newFear = Math.min(10, _fear + _fearGain)>>
<<set _newSubmission = Math.min(10, _submission + _submissionGain)>>
<<set _newAffection = Math.max(0, _affection - _affectionLoss)>>
<<run _worker.saveData.set("fear", _newFear)>>
<<run _worker.saveData.set("submission", _newSubmission)>>
<<run _worker.saveData.set("affection", _newAffection)>>
<<set _resultMsg = "Discipline established.">>
<<if _fearGain > 0>>
<<set _resultMsg = _resultMsg + " (Fear +" + _fearGain + ")">>
<</if>>
<<if _submissionGain > 0>>
<<set _resultMsg = _resultMsg + " (Submission +" + _submissionGain + ")">>
<</if>>
<<if _affectionLoss > 0>>
<<set _resultMsg = _resultMsg + " (Affection -" + _affectionLoss + ")">>
<</if>>
<<ChatMessage _resultMsg>>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn secondary"><<button "→ Continue" "BrothelTraining_SelectWorker">><</button>></span>
</div>
<</nobr>><<nobr>>
<<include "PlayerBrothel_InitCheck">>
<<include "UpdateAll">>
<<set _currentLevel = $playerBrothel.level>>
<div class="centre-text">Brothel Upgrades & Buildings</div>
<div class="centre-text" style="font-size: 14px; color: #ffd700; margin-bottom: 10px;">⭐ Level <<print _currentLevel>>/26</div>
<<ChatMessage "Purchase upgrades to increase your brothel's income and safety, or build new facilities.">>
<<ChatMessage "New upgrades and buildings unlock as your brothel level increases.">>
/* Define buildings (special constructions) with level requirements */
<<set _buildings = [
{
id: "masterRoom",
name: "Master Room",
description: "A private bedroom for the brothel owner. You can sleep here to restore energy and pass time.",
price: 2500,
icon: "🛏️",
levelRequired: 1
},
{
id: "trainingRoom",
name: "Training Room",
description: "A room to train your workers' skills. Allows improving submission and sex skills.",
price: 3000,
icon: "🎓",
levelRequired: 3
},
{
id: "spa",
name: "Spa Salon",
description: "A relaxing spa where workers can restore energy faster. Assigned workers recover +50% energy per day.",
price: 4000,
icon: "💆",
levelRequired: 5
},
{
id: "relaxation",
name: "Relaxation Room",
description: "A cozy room for workers to rest. Reduces stress and increases affection over time.",
price: 3500,
icon: "🛋️",
levelRequired: 6
},
{
id: "dungeon",
name: "Dungeon",
description: "A prison for troublesome clients. Imprison non-paying or violent customers and break their will until they agree to work off their debt.",
price: 5000,
icon: "⛓️",
levelRequired: 8
},
{
id: "medical",
name: "Medical Room",
description: "A medical facility for treating workers. Assigned workers recover health and can be cured of diseases.",
price: 6000,
icon: "🏥",
levelRequired: 10
}
]>>
/* Define upgrades with level requirements and weekly costs */
<<set _upgrades = [
{
id: "lighting",
name: "Premium Lighting",
description: "+10% attractiveness bonus",
price: 300,
incomeBonus: 0.10,
levelRequired: 1,
weeklyCost: 0
},
{
id: "advertising",
name: "Advertising",
description: "+20% more clients",
price: 500,
incomeBonus: 0.20,
levelRequired: 2,
weeklyCost: 0
},
{
id: "furniture",
name: "Luxury Furniture",
description: "+15% comfort bonus",
price: 600,
incomeBonus: 0.15,
levelRequired: 4,
weeklyCost: 0
},
{
id: "bar",
name: "Bar",
description: "+15% income from drinks (Weekly upkeep: $100)",
price: 800,
incomeBonus: 0.15,
levelRequired: 6,
weeklyCost: 100
},
{
id: "security",
name: "Security Guards",
description: "Reduces risk of problems (Weekly upkeep: $150)",
price: 1000,
incomeBonus: 0.05,
levelRequired: 7,
weeklyCost: 150
},
{
id: "vipZone",
name: "VIP Zone",
description: "+30% income from premium clients",
price: 2000,
incomeBonus: 0.30,
levelRequired: 12,
weeklyCost: 0
}
]>>
/* Client Rooms section */
<<set _clientRoomPrice = ($playerBrothel.clientRooms + 1) * 500>>
<<set _maxClientRooms = $playerBrothel.rooms * 3>>
<<set _roomProgress = Math.round(($playerBrothel.clientRooms / Math.max(1, _maxClientRooms)) * 100)>>
<<set _clientRoomBtnText = "🛏️ BUILD $" + _clientRoomPrice>>
<<set _roomProgressBarStyle = "background: linear-gradient(90deg, #e91e63, #f48fb1); width: " + _roomProgress + "%; height: 100%; border-radius: 4px; transition: width 0.3s;">>
<fieldset style="background: linear-gradient(135deg, rgba(233, 30, 99, 0.15) 0%, rgba(33, 33, 33, 0.95) 100%); border: 2px solid #e91e63; margin-bottom: 20px; border-radius: 12px;">
<legend style="color: #f48fb1; font-size: 18px; font-weight: bold;">🛏️ Client Rooms</legend>
<div style="padding: 15px;">
<div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 15px;">
<div>
<p style="color: #fff; font-size: 18px; margin: 0; font-weight: bold;"><<print $playerBrothel.clientRooms>> <span style="color: #888; font-weight: normal;">/ <<print _maxClientRooms>></span></p>
<p style="color: #aaa; font-size: 11px; margin: 3px 0 0;">Capacity for simultaneous clients</p>
</div>
<div style="text-align: right;">
<<if $playerBrothel.clientRooms >= _maxClientRooms>>
<div style="background: linear-gradient(135deg, #4CAF50 0%, #388E3C 100%); padding: 12px 24px; border-radius: 25px; box-shadow: 0 4px 15px rgba(76, 175, 80, 0.4);">
<span style="color: #fff; font-size: 13px; font-weight: bold;">✓ MAXIMUM</span>
</div>
<<elseif $player.money >= _clientRoomPrice>>
<span class="brothel-btn primary"><<button _clientRoomBtnText "BrothelUpgrades_BuyClientRoom">><</button>></span>
<<else>>
<<set _noBuyText = "💰 $" + _clientRoomPrice>>
<span class="brothel-btn disabled"><<button _noBuyText>><</button>></span>
<</if>>
</div>
</div>
<div style="background: rgba(0,0,0,0.3); height: 8px; border-radius: 4px; overflow: hidden;">
<div @style="_roomProgressBarStyle"></div>
</div>
</div>
</fieldset>
/* Dungeon Cells section - only show if dungeon is built */
<<if $playerBrothel.upgrades.dungeon == true>>
<<set _dungeonCellPrice = $playerBrothel.dungeonCells * 750>>
<<set _maxDungeonCells = 5>>
<<set _dungeonProgress = Math.round(($playerBrothel.dungeonCells / _maxDungeonCells) * 100)>>
<<set _dungeonCellBtnText = "⛓️ EXPAND $" + _dungeonCellPrice>>
<<set _dungeonProgressBarStyle = "background: linear-gradient(90deg, #9c27b0, #ba68c8); width: " + _dungeonProgress + "%; height: 100%; border-radius: 4px; transition: width 0.3s;">>
<fieldset style="background: linear-gradient(135deg, rgba(156, 39, 176, 0.15) 0%, rgba(33, 33, 33, 0.95) 100%); border: 2px solid #9c27b0; margin-top: 20px; border-radius: 12px;">
<legend style="color: #ce93d8; font-size: 18px; font-weight: bold;">⛓️ Dungeon Cells</legend>
<div style="padding: 15px;">
<div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 15px;">
<div>
<p style="color: #fff; font-size: 18px; margin: 0; font-weight: bold;"><<print $playerBrothel.dungeonCells>> <span style="color: #888; font-weight: normal;">/ <<print _maxDungeonCells>></span></p>
<p style="color: #aaa; font-size: 11px; margin: 3px 0 0;">Capacity for prisoners</p>
</div>
<div style="text-align: right;">
<<if $playerBrothel.dungeonCells >= _maxDungeonCells>>
<div style="background: linear-gradient(135deg, #4CAF50 0%, #388E3C 100%); padding: 12px 24px; border-radius: 25px; box-shadow: 0 4px 15px rgba(76, 175, 80, 0.4);">
<span style="color: #fff; font-size: 13px; font-weight: bold;">✓ MAXIMUM</span>
</div>
<<elseif $player.money >= _dungeonCellPrice>>
<span class="brothel-btn dark"><<button _dungeonCellBtnText "BrothelUpgrades_BuyDungeonCell">><</button>></span>
<<else>>
<<set _noBuyDungeonText = "💰 $" + _dungeonCellPrice>>
<span class="brothel-btn disabled"><<button _noBuyDungeonText>><</button>></span>
<</if>>
</div>
</div>
<div style="background: rgba(0,0,0,0.3); height: 8px; border-radius: 4px; overflow: hidden;">
<div @style="_dungeonProgressBarStyle"></div>
</div>
</div>
</fieldset>
<</if>>
/* Buildings section */
<fieldset style="background: linear-gradient(135deg, rgba(156, 39, 176, 0.15) 0%, rgba(33, 33, 33, 0.95) 100%); border: 2px solid #9c27b0; border-radius: 12px;">
<legend style="color: #ce93d8; font-size: 18px; font-weight: bold;">🏗️ Buildings</legend>
<div class="item-shop-container" style="gap: 15px; padding: 10px;">
<<for _i = 0; _i < _buildings.length; _i++>>
<<set _building = _buildings[_i]>>
<<set _owned = $playerBrothel.upgrades[_building.id]>>
<<set _levelReq = _building.levelRequired || 1>>
<<set _isLocked = _currentLevel < _levelReq>>
/* Set icon for building */
<<set _icon = _building.icon || "🏠">>
/* Pre-compute button text */
<<set _buildBtnText = "🔨 BUILD $" + _building.price>>
<<set _lockedText = "🔒 Level " + _levelReq>>
<<capture _building _owned _icon _buildBtnText _levelReq _isLocked _lockedText>>
<div class="shop-item" style="background: linear-gradient(180deg, rgba(156, 39, 176, 0.25) 0%, rgba(20, 20, 20, 0.95) 100%); border: 2px solid <<if _owned>>#4CAF50<<elseif _isLocked>>#555<<else>>#9c27b0<</if>>; border-radius: 16px; padding: 18px; display: flex; flex-direction: column; min-height: 300px; width: 100%; box-sizing: border-box; box-shadow: 0 6px 20px rgba(156, 39, 176, 0.25); position: relative; overflow: hidden; <<if _isLocked>>opacity: 0.6;<</if>>">
/* Status badge - only show for built items */
<<if _owned>>
<div style="position: absolute; top: 10px; right: 10px; background: linear-gradient(135deg, #4CAF50 0%, #388E3C 100%); padding: 4px 10px; border-radius: 10px;">
<span style="color: #fff; font-size: 10px; font-weight: bold;">✓ BUILT</span>
</div>
<</if>>
<div style="text-align: center; font-size: 40px; margin-bottom: 8px; filter: <<if _owned>>grayscale(0)<<elseif _isLocked>>grayscale(1)<<else>>grayscale(0.3)<</if>>;"><<print _icon>></div>
<h3 style="color: <<if _owned>>#4CAF50<<elseif _isLocked>>#666<<else>>#ce93d8<</if>>; text-align: center; margin: 5px 0; font-size: 14px; text-transform: uppercase; letter-spacing: 1px; font-weight: bold;"><<print _building.name>></h3>
<hr style="border-color: rgba(156, 39, 176, 0.3); margin: 10px 0;">
<p style="flex-grow: 1; color: <<if _isLocked>>#666<<else>>#999<</if>>; font-size: 11px; line-height: 1.5; text-align: center;"><<print _building.description>></p>
/* Level requirement */
<<if !_owned>>
<div style="text-align: center; font-size: 10px; color: <<if _isLocked>>#f44336<<else>>#4CAF50<</if>>; margin-bottom: 5px;">
Requires Level <<print _levelReq>>
</div>
<</if>>
/* Price and button */
<<if _owned>>
<div style="background: rgba(76, 175, 80, 0.2); padding: 12px; border-radius: 10px; text-align: center; margin-top: 10px;">
<span style="color: #4CAF50; font-size: 13px; font-weight: bold;">Constructed</span>
</div>
<<elseif _isLocked>>
<div style="margin-top: 10px;">
<span class="brothel-btn disabled small"><<button _lockedText>><</button>></span>
</div>
<<elseif $player.money >= _building.price>>
<div style="margin-top: 10px;">
<span class="brothel-btn secondary small"><<button _buildBtnText "BrothelUpgrades_Purchase">>
<<set $selectedUpgrade = _building>>
<</button>></span>
</div>
<<else>>
<<set _noBuildText = "💰 $" + _building.price>>
<div style="margin-top: 10px;">
<span class="brothel-btn disabled small"><<button _noBuildText>><</button>></span>
</div>
<</if>>
</div>
<</capture>>
<</for>>
</div>
</fieldset>
/* Regular upgrades section */
<fieldset style="background: linear-gradient(135deg, rgba(255, 152, 0, 0.15) 0%, rgba(33, 33, 33, 0.95) 100%); border: 2px solid #ff9800; margin-top: 20px; border-radius: 12px;">
<legend style="color: #ffb74d; font-size: 18px; font-weight: bold;">⬆️ Upgrades</legend>
<div class="item-shop-container" style="gap: 12px; padding: 10px;">
<<for _i = 0; _i < _upgrades.length; _i++>>
<<set _upgrade = _upgrades[_i]>>
<<set _owned = $playerBrothel.upgrades[_upgrade.id]>>
<<set _levelReq = _upgrade.levelRequired || 1>>
<<set _isLocked = _currentLevel < _levelReq>>
<<set _weeklyCost = _upgrade.weeklyCost || 0>>
/* Set icon for upgrade */
<<switch _upgrade.id>>
<<case "advertising">><<set _icon = "📢">>
<<case "security">><<set _icon = "🛡️">>
<<case "bar">><<set _icon = "🍸">>
<<case "vipZone">><<set _icon = "👑">>
<<case "lighting">><<set _icon = "💡">>
<<case "furniture">><<set _icon = "🛋️">>
<<default>><<set _icon = "📦">>
<</switch>>
/* Pre-compute button text */
<<set _upgradeBtnText = "⬆️ BUY $" + _upgrade.price>>
<<set _lockedText = "🔒 Level " + _levelReq>>
<<capture _upgrade _owned _icon _upgradeBtnText _levelReq _isLocked _lockedText _weeklyCost>>
<div class="shop-item" style="background: linear-gradient(180deg, rgba(255, 152, 0, 0.2) 0%, rgba(20, 20, 20, 0.95) 100%); border: 2px solid <<if _owned>>#4CAF50<<elseif _isLocked>>#555<<else>>#ff9800<</if>>; border-radius: 14px; padding: 15px; display: flex; flex-direction: column; min-height: 220px; width: 100%; box-sizing: border-box; box-shadow: 0 4px 15px rgba(255, 152, 0, 0.2); position: relative; <<if _isLocked>>opacity: 0.6;<</if>>">
/* Status indicator - only show for owned items */
<<if _owned>>
<div style="position: absolute; top: 8px; right: 8px; background: linear-gradient(135deg, #4CAF50 0%, #388E3C 100%); padding: 3px 8px; border-radius: 8px;">
<span style="color: #fff; font-size: 9px; font-weight: bold;">✓ OWNED</span>
</div>
<</if>>
<div style="display: flex; align-items: center; gap: 12px; margin-bottom: 8px;">
<div style="background: rgba(255, 152, 0, 0.2); padding: 8px; border-radius: 10px; <<if _isLocked>>filter: grayscale(1);<</if>>">
<span style="font-size: 26px;"><<print _icon>></span>
</div>
<h3 style="color: <<if _owned>>#4CAF50<<elseif _isLocked>>#666<<else>>#ffb74d<</if>>; margin: 0; font-size: 12px; text-transform: uppercase; font-weight: bold;"><<print _upgrade.name>></h3>
</div>
<p style="flex-grow: 1; color: <<if _isLocked>>#666<<else>>#999<</if>>; font-size: 10px; line-height: 1.4; margin: 0;"><<print _upgrade.description>></p>
/* Weekly cost indicator */
<<if _weeklyCost > 0>>
<div style="background: rgba(255, 193, 7, 0.2); padding: 5px 8px; border-radius: 6px; text-align: center; margin: 5px 0;">
<span style="color: #ffc107; font-size: 9px;">⚠️ Weekly: $<<print _weeklyCost>></span>
</div>
<</if>>
/* Level requirement */
<<if !_owned>>
<div style="text-align: center; font-size: 10px; color: <<if _isLocked>>#f44336<<else>>#4CAF50<</if>>; margin-bottom: 5px;">
Requires Level <<print _levelReq>>
</div>
<</if>>
/* Price and button */
<<if _owned == true>>
<div style="background: rgba(76, 175, 80, 0.15); padding: 10px; border-radius: 8px; text-align: center; margin-top: 5px;">
<span style="color: #4CAF50; font-size: 12px; font-weight: bold;">Active</span>
</div>
<<elseif _isLocked>>
<div style="margin-top: 5px;">
<span class="brothel-btn disabled small"><<button _lockedText>><</button>></span>
</div>
<<elseif $player.money >= _upgrade.price>>
<div style="margin-top: 5px;">
<span class="brothel-btn special small"><<button _upgradeBtnText "BrothelUpgrades_Purchase">>
<<set $selectedUpgrade = _upgrade>>
<</button>></span>
</div>
<<else>>
<<set _noUpgradeText = "💰 $" + _upgrade.price>>
<div style="margin-top: 5px;">
<span class="brothel-btn disabled small"><<button _noUpgradeText>><</button>></span>
</div>
<</if>>
</div>
<</capture>>
<</for>>
</div>
</fieldset>
/* Show total bonus */
<<set _totalBonus = 0>>
<<if $playerBrothel.upgrades.advertising>><<set _totalBonus += 0.20>><</if>>
<<if $playerBrothel.upgrades.security>><<set _totalBonus += 0.05>><</if>>
<<if $playerBrothel.upgrades.bar>><<set _totalBonus += 0.15>><</if>>
<<if $playerBrothel.upgrades.vipZone>><<set _totalBonus += 0.30>><</if>>
<<if $playerBrothel.upgrades.lighting>><<set _totalBonus += 0.10>><</if>>
<<if $playerBrothel.upgrades.furniture>><<set _totalBonus += 0.15>><</if>>
<<set _bonusPercent = Math.floor(_totalBonus * 100)>>
<<set _msg = "Current income bonus from upgrades: +" + _bonusPercent + "%">>
<<ChatMessage _msg>>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn neutral"><<button "← Back to Office" "PlayerBrothel_Office">><</button>></span>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _upgrade = $selectedUpgrade>>
<<set _msg = "Purchase " + _upgrade.name + " for $" + _upgrade.price + "?">>
<<ChatMessage _msg>>
<<ChatMessage _upgrade.description>>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn success"><<button "✓ Confirm Purchase" "BrothelUpgrades_Complete">><</button>></span>
<span class="brothel-btn neutral"><<button "✗ Cancel" "BrothelUpgrades_Main">><<unset $selectedUpgrade>><</button>></span>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _upgrade = $selectedUpgrade>>
/* Deduct money */
<<set $player.money -= _upgrade.price>>
/* Mark upgrade as owned */
<<set $playerBrothel.upgrades[_upgrade.id] = true>>
<<set _msg = "You purchased " + _upgrade.name + "!">>
<<ChatMessage _msg>>
<<ChatMessage "Brothel now has improved facilities.">>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn primary"><<button "→ Continue" "BrothelUpgrades_Main">><<unset $selectedUpgrade>><</button>></span>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _price = ($playerBrothel.clientRooms + 1) * 500>>
<<set _maxRooms = $playerBrothel.rooms * 3>>
<<if $playerBrothel.clientRooms >= _maxRooms>>
<<ChatMessage "You have reached the maximum number of client rooms for your current worker rooms.">>
<<elseif $player.money < _price>>
<<set _msg = "You don't have enough money. You need $" + _price>>
<<ChatMessage _msg>>
<<else>>
<<set $player.money -= _price>>
<<set $playerBrothel.clientRooms += 1>>
<<set _msg = "You built a new client room! You now have " + $playerBrothel.clientRooms + " client rooms.">>
<<ChatMessage _msg>>
<<ChatMessage "More client rooms means more customers can be served simultaneously, increasing daily income!">>
<</if>>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn secondary"><<button "→ Continue" "BrothelUpgrades_Main">><</button>></span>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _price = $playerBrothel.dungeonCells * 750>>
<<set _maxCells = 5>>
<<if $playerBrothel.dungeonCells >= _maxCells>>
<<ChatMessage "You have reached the maximum number of dungeon cells.">>
<<elseif $player.money < _price>>
<<set _msg = "You don't have enough money. You need $" + _price>>
<<ChatMessage _msg>>
<<else>>
<<set $player.money -= _price>>
<<set $playerBrothel.dungeonCells += 1>>
<<set _msg = "You expanded the dungeon! You now have " + $playerBrothel.dungeonCells + " cells.">>
<<ChatMessage _msg>>
<<ChatMessage "More cells means you can hold more troublesome clients in captivity.">>
<</if>>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn secondary"><<button "→ Continue" "BrothelUpgrades_Main">><</button>></span>
</div>
<</nobr>><<nobr>>
/* Initialize playerBrothel if it doesn't exist (for old saves) */
<<if ndef $playerBrothel>>
<<set $playerBrothel = {
owned: false,
name: "Brothel",
rooms: 1,
maxRooms: 10,
clientRooms: 1,
prostitutes: [],
workerAssignments: {},
upgrades: {
advertising: false,
security: false,
bar: false,
vipZone: false,
lighting: false,
furniture: false,
trainingRoom: false,
dungeon: false,
spa: false,
medical: false,
relaxation: false,
masterRoom: false
},
dailyEarnings: 0,
uncollectedEarnings: 0,
totalEarnings: 0,
reputation: 0,
level: 1,
maxReputation: 100,
visitedToday: false
}>>
<</if>>
/* Ensure new upgrades exist for old saves */
<<if ndef $playerBrothel.upgrades.trainingRoom>>
<<set $playerBrothel.upgrades.trainingRoom = false>>
<</if>>
<<if ndef $playerBrothel.upgrades.dungeon>>
<<set $playerBrothel.upgrades.dungeon = false>>
<</if>>
<<if ndef $playerBrothel.upgrades.spa>>
<<set $playerBrothel.upgrades.spa = false>>
<</if>>
<<if ndef $playerBrothel.upgrades.medical>>
<<set $playerBrothel.upgrades.medical = false>>
<</if>>
<<if ndef $playerBrothel.upgrades.relaxation>>
<<set $playerBrothel.upgrades.relaxation = false>>
<</if>>
<<if ndef $playerBrothel.reputation || typeof $playerBrothel.reputation !== "number">>
<<set $playerBrothel.reputation = 0>>
<</if>>
/* Ensure reputation doesn't exceed max */
<<if $playerBrothel.reputation > $playerBrothel.maxReputation>>
<<set $playerBrothel.reputation = $playerBrothel.maxReputation>>
<</if>>
<<if ndef $playerBrothel.level>>
<<set $playerBrothel.level = 1>>
<</if>>
<<if ndef $playerBrothel.maxReputation>>
<<set $playerBrothel.maxReputation = 100>>
<</if>>
<<if ndef $playerBrothel.clientRooms>>
<<set $playerBrothel.clientRooms = 0>>
<</if>>
/* Owned brothels always have one basic client room. Additional rooms are upgrades. */
<<set _recoveredBasicClientRoom = false>>
<<if $playerBrothel.owned && (!$playerBrothel.clientRooms || $playerBrothel.clientRooms < 1)>>
<<set $playerBrothel.clientRooms = 1>>
<<set _recoveredBasicClientRoom = true>>
<</if>>
<<if ndef $playerBrothel.workerAssignments>>
<<set $playerBrothel.workerAssignments = {}>>
<</if>>
/* Old saves could auto-rest every worker because clientRooms was 0. Restore one worker
only when this migration just added the basic client room and nobody is set to work. */
<<if _recoveredBasicClientRoom && $playerBrothel.prostitutes && $playerBrothel.prostitutes.length > 0>>
<<set _hasWorkingWorker = false>>
<<for _i = 0; _i < $playerBrothel.prostitutes.length; _i++>>
<<set _workerId = $playerBrothel.prostitutes[_i]>>
<<if ($playerBrothel.workerAssignments[_workerId] || "work") == "work">>
<<set _hasWorkingWorker = true>>
<</if>>
<</for>>
<<if !_hasWorkingWorker>>
<<set _restoreWorkerId = $playerBrothel.prostitutes[0]>>
<<set $playerBrothel.workerAssignments[_restoreWorkerId] = "work">>
<</if>>
<</if>>
<<if ndef $playerBrothel.upgrades.masterRoom>>
<<set $playerBrothel.upgrades.masterRoom = false>>
<</if>>
/* Perk system initialization */
<<if ndef $playerBrothel.skillPoints>>
<<set $playerBrothel.skillPoints = 0>>
<</if>>
<<if ndef $playerBrothel.perks>>
<<set $playerBrothel.perks = {
seeStats: false,
profitBonus: 0,
energySaving: 0,
securityDiscount: false,
feminizationAttempts: false,
haggle: false,
biweeklyPay: false,
playerProfitBonus: 0,
relaxationSpeed: 0,
surgeryDiscount: false
}>>
<</if>>
/* Dungeon prisoners array */
<<if ndef $playerBrothel.prisoners>>
<<set $playerBrothel.prisoners = []>>
<</if>>
/* Dungeon cells capacity (starts at 1, max 5) */
<<if ndef $playerBrothel.dungeonCells>>
<<set $playerBrothel.dungeonCells = 1>>
<</if>>
/* Debt workers array (prisoners who agreed to work off debt) */
<<if ndef $playerBrothel.debtWorkers>>
<<set $playerBrothel.debtWorkers = []>>
<</if>>
/* Weekly income system properties */
<<if ndef $playerBrothel.pendingWeeklyEarnings>>
<<set $playerBrothel.pendingWeeklyEarnings = 0>>
<</if>>
<<if ndef $playerBrothel.weeklyEarnings>>
<<set $playerBrothel.weeklyEarnings = 0>>
<</if>>
<<if ndef $playerBrothel.lastPayDay>>
<<set $playerBrothel.lastPayDay = 0>>
<</if>>
/* Migration: old saves left lastPayDay=0 which used to trigger an instant pay-day on next refresh.
Anchor it to today's absoluteDay so pay-day fires after a real 7-day interval. */
<<if $playerBrothel.owned && $playerBrothel.lastPayDay === 0>>
<<set _absDayInit = getCurrentAbsoluteDay()>>
<<set $playerBrothel.lastPayDay = _absDayInit>>
<<if ndef $playerBrothel.firstOpenedAbsoluteDay>>
<<set $playerBrothel.firstOpenedAbsoluteDay = _absDayInit>>
<</if>>
/* Anchors are written in the canonical (v2) absolute-day formula - flag them
so migrateBrothelDayAnchors doesn't re-convert them as legacy values. */
<<set $playerBrothel.absDayV2 = true>>
<</if>>
<<run (function() {
try {
var refreshBrothelIncome = window.RefreshPlayerBrothelDailyIncome || (typeof globalThis !== "undefined" ? globalThis.RefreshPlayerBrothelDailyIncome : null);
if (typeof refreshBrothelIncome === "function") {
refreshBrothelIncome();
}
} catch (e) {
console.error("Brothel income refresh error:", e);
}
})()>>
<</nobr>><<nobr>>
<<include "PlayerBrothel_InitCheck">>
<<if $playerBrothel.owned>>
<<goto "PlayerBrothel_Main">>
<<else>>
<<goto "PlayerBrothel_Purchase">>
<</if>>
<</nobr>><<nobr>>
<<include "PlayerBrothel_InitCheck">>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Locations/City/RedLightDistrict/Brothel/Hall.jpg">>
<<timed 0.2s>>
<<set _purchaseCost = 20000>>
<div class="centre-text" style="font-size: 28px; color: #e91e63; text-shadow: 0 0 20px rgba(233, 30, 99, 0.5);">🏩 Brothel For Sale</div>
<fieldset style="background: linear-gradient(135deg, rgba(233, 30, 99, 0.15) 0%, rgba(33, 33, 33, 0.95) 100%); border: 2px solid #e91e63; margin: 20px 0;">
<legend style="color: #f48fb1; font-size: 16px;">💰 Investment Opportunity</legend>
<div style="padding: 20px; text-align: center;">
<p style="color: #ccc; font-size: 14px; line-height: 1.8;">
This abandoned brothel is up for sale. With the right management, it could become
a thriving business in the Red Light District.
</p>
<div style="background: rgba(0,0,0,0.3); padding: 20px; border-radius: 15px; margin: 20px 0;">
<div style="color: #ffd700; font-size: 24px; font-weight: bold; margin-bottom: 10px;">
$<<print _purchaseCost.toLocaleString()>>
</div>
<div style="color: #888; font-size: 12px;">Purchase Price</div>
</div>
<div style="background: rgba(76, 175, 80, 0.1); padding: 15px; border-radius: 10px; border: 1px solid #4CAF50; margin: 15px 0;">
<div style="color: #81c784; font-size: 13px; font-weight: bold; margin-bottom: 10px;">What you'll get:</div>
<div style="color: #aaa; font-size: 12px; text-align: left; display: inline-block;">
✓ 1 Worker Room (expandable to 10)<br>
✓ Main Hall for clients<br>
✓ Office for management<br>
✓ Ability to hire prostitutes<br>
✓ Upgrade options (Security, Bar, VIP Zone, etc.)<br>
✓ Daily passive income from workers
</div>
</div>
<div style="margin-top: 20px;">
<div style="color: #888; font-size: 12px; margin-bottom: 10px;">Your money: <span style="color: #4CAF50; font-weight: bold;">$<<print $player.money.toLocaleString()>></span></div>
<<if $player.money >= _purchaseCost>>
<span class="brothel-btn success" style="font-size: 16px; padding: 15px 40px;">
<<button "🏩 Purchase Brothel ($20,000)" "PlayerBrothel_PurchaseConfirm">><</button>>
</span>
<<else>>
<<set _needed = _purchaseCost - $player.money>>
<span class="brothel-btn disabled" style="font-size: 16px; padding: 15px 40px;">
<<set _neededText = "🏩 Purchase Brothel (Need $" + _needed.toLocaleString()
+ " more)">>
<<button _neededText>><</button>>
</span>
<</if>>
</div>
</div>
</fieldset>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn neutral"><<button "← Leave" "RedLightDistrict">><</button>></span>
</div>
<</timed>>
<</nobr>><<nobr>>
<<include "PlayerBrothel_InitCheck">>
<<set _purchaseCost = 20000>>
<<if $player.money >= _purchaseCost>>
<<set $player.money -= _purchaseCost>>
<<set $playerBrothel.owned = true>>
<<if !$playerBrothel.clientRooms || $playerBrothel.clientRooms < 1>>
<<set $playerBrothel.clientRooms = 1>>
<</if>>
<<set _absDayPurchase = getCurrentAbsoluteDay()>>
<<set $playerBrothel.lastPayDay = _absDayPurchase>>
<<set $playerBrothel.firstOpenedAbsoluteDay = _absDayPurchase>>
<<set $playerBrothel.absDayV2 = true>>
<<set $playerBrothel.pendingWeeklyEarnings = 0>>
<<goto "PlayerBrothel_PurchaseSuccess">>
<<else>>
<<ChatMessage "You don't have enough money to purchase the brothel.">>
<<goto "PlayerBrothel_Purchase">>
<</if>>
<</nobr>><<nobr>>
<<SaveLocation>>
<<SetBackground "Media/Locations/City/RedLightDistrict/Brothel/Hall.jpg">>
<<timed 0.2s>>
<div class="centre-text" style="font-size: 28px; color: #4CAF50; text-shadow: 0 0 20px rgba(76, 175, 80, 0.5);">🎉 Congratulations!</div>
<fieldset style="background: linear-gradient(135deg, rgba(76, 175, 80, 0.15) 0%, rgba(33, 33, 33, 0.95) 100%); border: 2px solid #4CAF50; margin: 20px 0;">
<legend style="color: #81c784; font-size: 16px;">✓ Purchase Complete</legend>
<div style="padding: 30px; text-align: center;">
<div style="font-size: 60px; margin-bottom: 20px;">🏩</div>
<p style="color: #fff; font-size: 18px; font-weight: bold; margin-bottom: 15px;">
You are now the proud owner of a brothel!
</p>
<p style="color: #aaa; font-size: 14px; line-height: 1.6;">
Your business journey begins here. Start by hiring workers,
upgrading your facilities, and building your reputation in the Red Light District.
</p>
<div style="background: rgba(0,0,0,0.3); padding: 15px; border-radius: 10px; margin: 20px 0;">
<div style="color: #ffd700; font-size: 14px;">💡 First Steps:</div>
<div style="color: #888; font-size: 12px; margin-top: 10px; text-align: left; display: inline-block;">
1. Visit the <b>Office</b> to manage your business<br>
2. Go to <b>Casting</b> to hire your first worker<br>
3. Check <b>Upgrades</b> for improvement options<br>
4. Explore <b>Skills</b> to unlock special perks
</div>
</div>
</div>
</fieldset>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn success" style="font-size: 16px; padding: 12px 30px;">
<<button "🏠 Enter Your Brothel" "PlayerBrothel_Main">><</button>>
</span>
</div>
<</timed>>
<</nobr>><<nobr>>
<<include "PlayerBrothel_InitCheck">>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Locations/City/RedLightDistrict/Brothel/Hall.jpg">>
<<timed 0.2s>>
<<set $canShowStatsBtn = true>>
<<set $gameSettings.allowSaves = true>>
/* Check for daily income collection */
<<if $playerBrothel.visitedToday == false>>
<<set $playerBrothel.visitedToday = true>>
<<include "BrothelCalculateDailyIncome">>
<</if>>
/* Calculate reputation bar */
<<set _reputationPercent = Math.round(($playerBrothel.reputation / $playerBrothel.maxReputation) * 100)>>
<<if _reputationPercent > 100>><<set _reputationPercent = 100>><</if>>
<<if _reputationPercent < 0>><<set _reputationPercent = 0>><</if>>
<<set _reputationColor = _reputationPercent >= 70 ? "#4CAF50" : (_reputationPercent >= 40 ? "#ff9800" : "#f44336")>>
<<set _levelColor = $playerBrothel.level >= 8 ? "#ffd700" : ($playerBrothel.level >= 5 ? "#9c27b0" : "#2196f3")>>
/* Pre-compute bar styles to avoid parsing issues */
<<set _barBackgroundStyle = "background: linear-gradient(90deg, " + _reputationColor + ", " + _reputationColor + "cc); width: " + _reputationPercent + "%; height: 100%; border-radius: 6px; transition: width 0.3s; box-shadow: 0 0 10px " + _reputationColor + "66;">>
<div class="centre-text" style="font-size: 24px; color: #e91e63; text-shadow: 0 0 15px rgba(233, 30, 99, 0.5);">$playerBrothel.name</div>
/* Level Badge */
<div style="text-align: center; margin: 10px 0;">
<span style="background: linear-gradient(135deg, <<print _levelColor>> 0%, <<print _levelColor>>99 100%); padding: 8px 20px; border-radius: 20px; font-size: 14px; font-weight: bold; color: #fff; box-shadow: 0 4px 15px <<print _levelColor>>66;">
⭐ Level <<print $playerBrothel.level>>/26
</span>
</div>
/* Stats Panel */
<<set _dailyEarnings = $playerBrothel.dailyEarnings || 0>>
<<set _weeklyEarnings = $playerBrothel.weeklyEarnings || 0>>
<fieldset style="background: linear-gradient(135deg, rgba(233, 30, 99, 0.1) 0%, rgba(33, 33, 33, 0.9) 100%); border: 1px solid #e91e63; margin-bottom: 15px;">
<legend style="color: #f48fb1;">📊 Status</legend>
<div style="display: grid; grid-template-columns: repeat(3, 1fr); gap: 12px; text-align: center;">
<div style="background: rgba(0,0,0,0.2); padding: 10px; border-radius: 8px;">
<div style="color: #aaa; font-size: 11px;">🏠 Rooms</div>
<div style="color: #fff; font-size: 16px; font-weight: bold;">$playerBrothel.rooms<span style="color: #666; font-size: 12px;">/$playerBrothel.maxRooms</span></div>
</div>
<div style="background: rgba(0,0,0,0.2); padding: 10px; border-radius: 8px;">
<div style="color: #aaa; font-size: 11px;">🛏️ Client Rooms</div>
<div style="color: #fff; font-size: 16px; font-weight: bold;"><<print $playerBrothel.clientRooms>></div>
</div>
<div style="background: rgba(0,0,0,0.2); padding: 10px; border-radius: 8px;">
<div style="color: #aaa; font-size: 11px;">👩 Workers</div>
<div style="color: #fff; font-size: 16px; font-weight: bold;"><<print $playerBrothel.prostitutes.length>><span style="color: #666; font-size: 12px;">/$playerBrothel.rooms</span></div>
</div>
<div style="background: rgba(255, 152, 0, 0.2); padding: 10px; border-radius: 8px; border: 1px solid #ff9800;">
<div style="color: #ffb74d; font-size: 11px;">📈 Today</div>
<div style="color: #ff9800; font-size: 16px; font-weight: bold;">+$<<print _dailyEarnings>></div>
</div>
<div style="background: rgba(76, 175, 80, 0.2); padding: 10px; border-radius: 8px; border: 1px solid #4CAF50;">
<div style="color: #81c784; font-size: 11px;">💵 Last Week</div>
<div style="color: #4CAF50; font-size: 16px; font-weight: bold;">$<<print _weeklyEarnings>></div>
</div>
<div style="background: rgba(76, 175, 80, 0.2); padding: 10px; border-radius: 8px; border: 1px solid #4CAF50;">
<div style="color: #81c784; font-size: 11px;">💰 Uncollected</div>
<div style="color: #4CAF50; font-size: 16px; font-weight: bold;">$<<print $playerBrothel.uncollectedEarnings || 0>><span style="color: #666; font-size: 10px;">/20000</span></div>
</div>
</div>
/* Reputation Progress */
<div style="margin-top: 15px; background: rgba(0,0,0,0.2); padding: 12px; border-radius: 8px;">
<div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 6px;">
<span style="color: #fff; font-size: 13px;">🏆 Reputation Progress</span>
<span style="color: <<print _reputationColor>>; font-size: 13px; font-weight: bold;"><<print $playerBrothel.reputation>>/<<print $playerBrothel.maxReputation>></span>
</div>
<div style="background: rgba(255,255,255,0.1); height: 12px; border-radius: 6px; overflow: hidden;">
<div @style="_barBackgroundStyle"></div>
</div>
<<if $playerBrothel.level < 26>>
<div style="color: #888; font-size: 10px; margin-top: 5px; text-align: center;">Fill the bar to reach Level <<print $playerBrothel.level + 1>></div>
<<else>>
<div style="color: #ffd700; font-size: 10px; margin-top: 5px; text-align: center;">✨ Maximum Level Reached! ✨</div>
<</if>>
</div>
</fieldset>
<div class="grid-row-twice">
<fieldset class="brothel-fieldset">
<legend>Navigation</legend>
<div class="brothel-btn-container">
<span class="brothel-btn primary"><<button "🏢 Office" "PlayerBrothel_Office">><</button>></span>
<span class="brothel-btn secondary"><<button "🚪 Working Rooms" "PlayerBrothel_Rooms">><</button>></span>
<<if $playerBrothel.upgrades.masterRoom>>
<span class="brothel-btn secondary"><<button "🛏️ Master Room" "BrothelMasterRoom_Main">><</button>></span>
<</if>>
<<if $playerBrothel.upgrades.trainingRoom>>
<span class="brothel-btn special"><<button "🎓 Training Room" "BrothelTrainingRoom_Main">><</button>></span>
<</if>>
<<if $playerBrothel.upgrades.dungeon>>
<span class="brothel-btn dark"><<button "⛓️ Dungeon" "BrothelDungeon_Main">><</button>></span>
<</if>>
<<if $playerBrothel.upgrades.spa>>
<span class="brothel-btn spa"><<button "💆 Spa Salon" "BrothelSpa_Main">><</button>></span>
<</if>>
<<if $playerBrothel.upgrades.medical>>
<span class="brothel-btn success"><<button "🏥 Medical Room" "BrothelMedical_Main">><</button>></span>
<</if>>
<<if $playerBrothel.upgrades.relaxation>>
<span class="brothel-btn info"><<button "🛋️ Relaxation Room" "BrothelRelaxation_Main">><</button>></span>
<</if>>
<span class="brothel-btn neutral"><<button "🚶 Leave" "RedLightDistrict">><</button>></span>
</div>
</fieldset>
<fieldset class="brothel-fieldset purple">
<legend>Activity</legend>
<div class="brothel-btn-container">
<span class="brothel-btn secondary"><<button "⏳ Wait">>
<<run $player.status.energy.increase(Random(1, 5, true))>>
<<SpendTimeWithoutUpdate 15>>
<<run $player.status.alcoholIntoxication.decrease(Random(1, 2))>>
<<goto "PlayerBrothel_Main">>
<</button>></span>
</div>
</fieldset>
</div>
/* Worker Management Panel */
<<if $playerBrothel.prostitutes.length > 0>>
<fieldset class="brothel-fieldset" style="border-color: #2196f3;">
<legend style="color: #64b5f6;">👩💼 Worker Management</legend>
<div class="brothel-btn-container">
<span class="brothel-btn info"><<button "📋 Manage Assignments" "BrothelWorkerManagement">><</button>></span>
</div>
</fieldset>
<</if>>
<fieldset style="background: linear-gradient(135deg, rgba(33, 150, 243, 0.1) 0%, rgba(33, 33, 33, 0.9) 100%); border: 1px solid #2196f3;">
<legend style="color: #64b5f6;">💰 Financial Info</legend>
<div style="padding: 10px;">
/* Calculate weekly expenses */
<<set _weeklyExpenses = 0>>
/* Worker salaries: what dayRefresh.ts charges (debt workers $0, no stored salary $100) */
<<set _workerSalaries = 0>>
<<for _i = 0; _i < $playerBrothel.prostitutes.length; _i++>>
<<set _prostId = $playerBrothel.prostitutes[_i]>>
<<set _worker = $Characters.find(c => c.info.id == _prostId)>>
<<if _worker>>
<<set _salary = getWorkerWeeklySalary(_worker)>>
<<set _workerSalaries += _salary>>
<</if>>
<</for>>
<<set _weeklyExpenses += _workerSalaries>>
/* Security Guards upkeep: what dayRefresh.ts charges, $75 with the Security Discount perk */
<<set _securityCost = 0>>
<<if $playerBrothel.upgrades && $playerBrothel.upgrades.security == true>>
<<set _securityCost = ($playerBrothel.perks && $playerBrothel.perks.securityDiscount) ? 75 : 150>>
<<set _weeklyExpenses += _securityCost>>
<</if>>
/* Bar upkeep */
<<set _barCost = 0>>
<<if $playerBrothel.upgrades && $playerBrothel.upgrades.bar == true>>
<<set _barCost = 100>>
<<set _weeklyExpenses += _barCost>>
<</if>>
/* Daily and weekly earnings */
<<set _dailyEarningsInfo = $playerBrothel.dailyEarnings || 0>>
<<set _lastWeekEarnings = $playerBrothel.weeklyEarnings || 0>>
<div style="display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 10px; margin-bottom: 15px;">
<div style="background: rgba(255, 152, 0, 0.15); padding: 12px; border-radius: 10px; border: 1px solid #ff9800;">
<div style="color: #ffb74d; font-size: 10px; text-transform: uppercase; letter-spacing: 1px;">Today's Income</div>
<div style="color: #ff9800; font-size: 18px; font-weight: bold;">+$<<print _dailyEarningsInfo>></div>
</div>
<div style="background: rgba(76, 175, 80, 0.15); padding: 12px; border-radius: 10px; border: 1px solid #4CAF50;">
<div style="color: #81c784; font-size: 10px; text-transform: uppercase; letter-spacing: 1px;">Last Week Total</div>
<div style="color: #4CAF50; font-size: 18px; font-weight: bold;">$<<print _lastWeekEarnings>></div>
</div>
<div style="background: rgba(76, 175, 80, 0.15); padding: 12px; border-radius: 10px; border: 1px solid #4CAF50;">
<div style="color: #81c784; font-size: 10px; text-transform: uppercase; letter-spacing: 1px;">Uncollected</div>
<div style="color: #4CAF50; font-size: 18px; font-weight: bold;">$<<print $playerBrothel.uncollectedEarnings || 0>></div>
</div>
</div>
/* Daily income breakdown */
<<set _estimatedDailyIncome = 0>>
<<set _workingCount = 0>>
<<for _i = 0; _i < $playerBrothel.prostitutes.length; _i++>>
<<set _prostId = $playerBrothel.prostitutes[_i]>>
<<set _assignment = $playerBrothel.workerAssignments[_prostId] || "work">>
<<if _assignment == "work">>
<<set _worker = $Characters.find(c => c.info.id == _prostId)>>
<<if _worker>>
<<set _workingCount++>>
/* Base income */
<<set _workerIncome = 50>>
/* Attractiveness bonus */
<<set _workerIncome += _worker.body.face.value * 10>>
/* Corruption bonus */
<<set _workerIncome += _worker.attributes.corruption.value * 5>>
/* Skills bonus */
<<set _oralSkill = _worker.saveData.get("oralSkill") || 0>>
<<set _analSkill = _worker.saveData.get("analSkill") || 0>>
<<set _vagSkill = _worker.saveData.get("vaginalSkill") || 0>>
<<set _workerIncome += Math.floor((_oralSkill + _analSkill + _vagSkill) / 5)>>
/* Limits bonus */
<<set _limits = _worker.saveData.get("limits")>>
<<if _limits>>
<<if _limits.anal && _limits.anal.status == "yes">><<set _workerIncome += 10>><</if>>
<<if _limits.creampie && _limits.creampie.status == "yes">><<set _workerIncome += 15>><</if>>
<<if _limits.goldenShower && _limits.goldenShower.status == "yes">><<set _workerIncome += 20>><</if>>
<<if _limits.anilingus && _limits.anilingus.status == "yes">><<set _workerIncome += 10>><</if>>
<</if>>
/* Level bonus */
<<set _workerIncome += ($playerBrothel.level || 1) * 5>>
/* Client rooms bonus */
<<set _workerIncome += ($playerBrothel.clientRooms || 0) * 2>>
<<set _estimatedDailyIncome += _workerIncome>>
<</if>>
<</if>>
<</for>>
/* Apply upgrade multipliers */
<<set _upgradeMultiplier = 1.0>>
<<if $playerBrothel.upgrades && $playerBrothel.upgrades.advertising == true>>
<<set _upgradeMultiplier += 0.20>>
<</if>>
<<if $playerBrothel.upgrades && $playerBrothel.upgrades.security == true>>
<<set _upgradeMultiplier += 0.05>>
<</if>>
<<if $playerBrothel.upgrades && $playerBrothel.upgrades.bar == true>>
<<set _upgradeMultiplier += 0.15>>
<</if>>
<<if $playerBrothel.upgrades && $playerBrothel.upgrades.vipZone == true>>
<<set _upgradeMultiplier += 0.30>>
<</if>>
<<if $playerBrothel.upgrades && $playerBrothel.upgrades.lighting == true>>
<<set _upgradeMultiplier += 0.10>>
<</if>>
<<if $playerBrothel.upgrades && $playerBrothel.upgrades.furniture == true>>
<<set _upgradeMultiplier += 0.15>>
<</if>>
/* Apply perk bonuses */
<<set _perkBonus = 0>>
<<if $playerBrothel.perks && $playerBrothel.perks.profitBonus > 0>>
<<set _perkBonus = $playerBrothel.perks.profitBonus * 10>>
<</if>>
/* Cap estimated income by available client rooms - workers without a client room
are forced to "room" (rest) by dayRefresh.ts and earn nothing. This used to silently
make Today's Income/Uncollected stay at $0 while estimated still showed phantom income. */
<<set _clientRoomsAvail = $playerBrothel.clientRooms || 0>>
<<set _assignedToWork = _workingCount>>
<<set _effectiveWorking = Math.min(_assignedToWork, _clientRoomsAvail)>>
<<if _assignedToWork > 0 && _effectiveWorking < _assignedToWork>>
<<if _assignedToWork > 0>>
<<set _estimatedDailyIncome = Math.floor(_estimatedDailyIncome * _effectiveWorking / _assignedToWork)>>
<</if>>
<<set _workingCount = _effectiveWorking>>
<</if>>
<<set _baseIncome = _estimatedDailyIncome>>
<<set _upgradeBonus = Math.floor(_estimatedDailyIncome * (_upgradeMultiplier - 1))>>
<<set _perkBonusAmount = Math.floor(_estimatedDailyIncome * _perkBonus / 100)>>
<<set _estimatedDailyIncome = Math.floor(_estimatedDailyIncome * _upgradeMultiplier * (1 + _perkBonus / 100))>>
/* Capacity warning: if more workers are assigned to "work" than there are client rooms,
the excess is auto-rested in dayRefresh.ts and earns nothing. */
<<if _assignedToWork > _clientRoomsAvail>>
<div style="background: rgba(244, 67, 54, 0.15); padding: 12px; border-radius: 10px; border: 1px solid #f44336; margin-bottom: 15px;">
<div style="color: #ef9a9a; font-size: 12px; font-weight: bold;">⚠️ Not enough client rooms</div>
<div style="color: #ffccbc; font-size: 12px; margin-top: 5px;">
<<print _clientRoomsAvail>> of <<print _assignedToWork>> workers can actually earn income.
<<if _clientRoomsAvail == 0>>
All workers are resting because you have no client rooms - buy <b>Client Rooms</b> in the Office to start earning.
<<else>>
Buy more <b>Client Rooms</b> in the Office so the rest of your workers can serve clients.
<</if>>
</div>
</div>
<</if>>
/* Weekly income estimate (income is already weekly, not daily) */
<div style="background: rgba(76, 175, 80, 0.1); padding: 12px; border-radius: 10px; border: 1px solid #4CAF50; margin-bottom: 15px;">
<div style="color: #81c784; font-size: 11px; text-transform: uppercase; letter-spacing: 1px; margin-bottom: 10px;">📊 Estimated Weekly Income</div>
<<if _workingCount > 0>>
<div style="display: flex; justify-content: space-between; padding: 5px 0; border-bottom: 1px solid rgba(76, 175, 80, 0.2);">
<span style="color: #ccc;">👩 Working Prostitutes (<<print _workingCount>>)</span>
<span style="color: #4CAF50; font-weight: bold;">+$<<print _baseIncome>></span>
</div>
<</if>>
<<if _upgradeBonus > 0>>
<div style="display: flex; justify-content: space-between; padding: 5px 0; border-bottom: 1px solid rgba(76, 175, 80, 0.2);">
<span style="color: #ccc;">🏢 Upgrade Bonuses (<<print Math.round((_upgradeMultiplier - 1) * 100)>>%)</span>
<span style="color: #4CAF50; font-weight: bold;">+$<<print _upgradeBonus>></span>
</div>
<</if>>
<<if _perkBonusAmount > 0>>
<div style="display: flex; justify-content: space-between; padding: 5px 0; border-bottom: 1px solid rgba(76, 175, 80, 0.2);">
<span style="color: #ccc;">⭐ Perk Bonuses (<<print _perkBonus>>%)</span>
<span style="color: #4CAF50; font-weight: bold;">+$<<print _perkBonusAmount>></span>
</div>
<</if>>
<<if _workingCount == 0>>
<div style="color: #888; font-style: italic; text-align: center;">No workers assigned to work</div>
<<else>>
<div style="display: flex; justify-content: space-between; padding: 8px 0; margin-top: 5px;">
<span style="color: #fff; font-weight: bold;">ESTIMATED WEEKLY</span>
<span style="color: #4CAF50; font-size: 18px; font-weight: bold;">~$<<print _estimatedDailyIncome>></span>
</div>
<div style="color: #666; font-size: 10px; text-align: center; margin-top: 5px;">
(Salaries paid every 7 days | Actual income varies ±20%)
</div>
<</if>>
</div>
/* Weekly expenses breakdown */
<div style="background: rgba(244, 67, 54, 0.1); padding: 12px; border-radius: 10px; border: 1px solid #f44336;">
<div style="color: #ef9a9a; font-size: 11px; text-transform: uppercase; letter-spacing: 1px; margin-bottom: 10px;">📅 Weekly Expenses</div>
<<if _workerSalaries > 0>>
<div style="display: flex; justify-content: space-between; padding: 5px 0; border-bottom: 1px solid rgba(244, 67, 54, 0.2);">
<span style="color: #ccc;">👩 Worker Salaries (<<print $playerBrothel.prostitutes.length>> workers)</span>
<span style="color: #f44336; font-weight: bold;">-$<<print _workerSalaries>></span>
</div>
<</if>>
<<if _securityCost > 0>>
<div style="display: flex; justify-content: space-between; padding: 5px 0; border-bottom: 1px solid rgba(244, 67, 54, 0.2);">
<span style="color: #ccc;">🛡️ Security Guards</span>
<span style="color: #f44336; font-weight: bold;">-$<<print _securityCost>></span>
</div>
<</if>>
<<if _barCost > 0>>
<div style="display: flex; justify-content: space-between; padding: 5px 0; border-bottom: 1px solid rgba(244, 67, 54, 0.2);">
<span style="color: #ccc;">🍺 Bar</span>
<span style="color: #f44336; font-weight: bold;">-$<<print _barCost>></span>
</div>
<</if>>
<<if _weeklyExpenses == 0>>
<div style="color: #888; font-style: italic; text-align: center;">No weekly expenses</div>
<<else>>
<div style="display: flex; justify-content: space-between; padding: 8px 0; margin-top: 5px;">
<span style="color: #fff; font-weight: bold;">TOTAL WEEKLY</span>
<span style="color: #f44336; font-size: 18px; font-weight: bold;">-$<<print _weeklyExpenses>></span>
</div>
<</if>>
</div>
</div>
</fieldset>
<<PeopleAround>>
<</timed>>
<</nobr>><<nobr>>
<<include "PlayerBrothel_InitCheck">>
<<SaveLocation>>
<<EachLoc>>
<<BrothelRandomEventCheck>>
<<SetBackground "Media/Locations/City/RedLightDistrict/Brothel/office.jpg">>
<<timed 0.2s>>
<div class="centre-text">Brothel Office</div>
<div class="centre-text" style="font-size: 14px; color: #888;">Manage your business from here</div>
<div class="grid-row-twice">
<fieldset class="brothel-fieldset">
<legend>Navigation</legend>
<div class="brothel-btn-container">
<span class="brothel-btn neutral"><<button "← Main Hall" "PlayerBrothel_Main">><</button>></span>
</div>
</fieldset>
<fieldset class="brothel-fieldset purple">
<legend>Management</legend>
<div class="brothel-btn-container">
<span class="brothel-btn primary"><<button "💋 Casting (Hire Workers)" "BrothelCasting_Main">><</button>></span>
<span class="brothel-btn secondary"><<button "🔧 Buy Upgrades" "BrothelUpgrades_Main">><</button>></span>
<span class="brothel-btn secondary"><<button "🚪 Buy Rooms" "BrothelBuyRooms">><</button>></span>
<span class="brothel-btn info"><<button "👥 View Workers" "BrothelViewWorkers">><</button>></span>
<<if ($playerBrothel.uncollectedEarnings || 0) > 0>>
<<set _collectEarningsBtnText = "Collect $" + $playerBrothel.uncollectedEarnings>>
<span class="brothel-btn success"><<button _collectEarningsBtnText "BrothelCollectEarnings">><</button>></span>
<<else>>
<span class="brothel-btn neutral"><<button "💰 No Earnings" "BrothelCollectEarnings">><</button>></span>
<</if>>
<<if $playerBrothel.skillPoints > 0>>
<<set _skillPointsBtnText = "Skills (" + $playerBrothel.skillPoints + ")">>
<span class="brothel-btn special"><<button _skillPointsBtnText "BrothelPerks_Main">><</button>></span>
<<else>>
<span class="brothel-btn neutral"><<button "🎯 Skills" "BrothelPerks_Main">><</button>></span>
<</if>>
<span class="brothel-btn danger"><<button "🏷️ Sell Brothel" "PlayerBrothel_SellConfirm">><</button>></span>
</div>
</fieldset>
</div>
<<PeopleAround>>
<</timed>>
<</nobr>><<nobr>>
<<include "PlayerBrothel_InitCheck">>
<<SetBackground "Media/Locations/City/RedLightDistrict/Brothel/office.jpg">>
<<timed 0.2s>>
<<set _sellPrice = 10000>>
<<set _workerCount = $playerBrothel.prostitutes.length>>
<<set _prisonerCount = ($playerBrothel.prisoners) ? $playerBrothel.prisoners.length : 0>>
<<set _debtWorkerCount = ($playerBrothel.debtWorkers) ? $playerBrothel.debtWorkers.length : 0>>
<div class="centre-text" style="font-size: 28px; color: #f44336; text-shadow: 0 0 20px rgba(244, 67, 54, 0.5);">Sell Brothel?</div>
<fieldset style="background: linear-gradient(135deg, rgba(244, 67, 54, 0.15) 0%, rgba(33, 33, 33, 0.95) 100%); border: 2px solid #f44336; margin: 20px 0;">
<legend style="color: #ef9a9a; font-size: 16px;">Warning</legend>
<div style="padding: 20px; text-align: center;">
<p style="color: #ef9a9a; font-size: 15px; line-height: 1.8; font-weight: bold;">
Are you sure you want to sell your brothel? This action is irreversible!
</p>
<div style="background: rgba(244, 67, 54, 0.1); padding: 15px; border-radius: 10px; border: 1px solid #f44336; margin: 15px 0;">
<div style="color: #ef9a9a; font-size: 13px; font-weight: bold; margin-bottom: 10px;">You will lose:</div>
<div style="color: #aaa; font-size: 12px; text-align: left; display: inline-block;">
✗ All upgrades and buildings<br>
✗ All rooms and client rooms<br>
✗ Brothel level (<<print $playerBrothel.level>>) and reputation<br>
✗ All skill points and perks<br>
<<if _workerCount > 0>>
✗ All workers (<<print _workerCount>>) will be removed<br>
<</if>>
<<if _prisonerCount > 0>>
✗ All prisoners (<<print _prisonerCount>>) will be removed<br>
<</if>>
<<if _debtWorkerCount > 0>>
✗ All debt workers (<<print _debtWorkerCount>>) will be removed<br>
<</if>>
✗ All uncollected earnings ($<<print $playerBrothel.uncollectedEarnings || 0>>)
</div>
</div>
<div style="background: rgba(76, 175, 80, 0.1); padding: 15px; border-radius: 10px; border: 1px solid #4CAF50; margin: 15px 0;">
<div style="color: #81c784; font-size: 13px; font-weight: bold; margin-bottom: 10px;">You will receive:</div>
<div style="color: #4CAF50; font-size: 24px; font-weight: bold;">
$<<print _sellPrice.toLocaleString()>>
</div>
</div>
<div style="margin-top: 20px; display: flex; gap: 15px; justify-content: center;">
<span class="brothel-btn danger" style="font-size: 16px; padding: 15px 40px;">
<<button "Confirm Sale" "PlayerBrothel_SellExecute">><</button>>
</span>
<span class="brothel-btn neutral" style="font-size: 16px; padding: 15px 40px;">
<<button "Cancel" "PlayerBrothel_Office">><</button>>
</span>
</div>
</div>
</fieldset>
<</timed>>
<</nobr>><<nobr>>
<<set _sellPrice = 10000>>
/* Give player the sell price */
<<set $player.money += _sellPrice>>
/* Collect all character IDs to delete (workers, prisoners, debt workers) */
<<set _idsToDelete = []>>
<<for _i = 0; _i < $playerBrothel.prostitutes.length; _i++>>
<<run _idsToDelete.push($playerBrothel.prostitutes[_i])>>
<</for>>
<<if $playerBrothel.prisoners && $playerBrothel.prisoners.length > 0>>
<<for _i = 0; _i < $playerBrothel.prisoners.length; _i++>>
<<run _idsToDelete.push($playerBrothel.prisoners[_i])>>
<</for>>
<</if>>
<<if $playerBrothel.debtWorkers && $playerBrothel.debtWorkers.length > 0>>
<<for _i = 0; _i < $playerBrothel.debtWorkers.length; _i++>>
<<run _idsToDelete.push($playerBrothel.debtWorkers[_i])>>
<</for>>
<</if>>
/* Remove characters from $Characters (iterate backwards to preserve indices) */
<<for _i = $Characters.length - 1; _i >= 0; _i-->>
<<if _idsToDelete.includes($Characters[_i].info.id)>>
<<run $Characters.splice(_i, 1)>>
<</if>>
<</for>>
/* Remove deleted characters from all location arrays */
<<for _locKey range Object.keys($Locations)>>
<<set $Locations[_locKey] = $Locations[_locKey].filter(idx => idx < $Characters.length)>>
<</for>>
/* Reset brothel to default state */
<<set $playerBrothel = {
owned: false,
name: "Brothel",
rooms: 1,
maxRooms: 10,
clientRooms: 0,
prostitutes: [],
workerAssignments: {},
upgrades: {
advertising: false,
security: false,
bar: false,
vipZone: false,
lighting: false,
furniture: false,
trainingRoom: false,
dungeon: false,
spa: false,
medical: false,
relaxation: false,
masterRoom: false
},
dailyEarnings: 0,
uncollectedEarnings: 0,
totalEarnings: 0,
reputation: 0,
level: 1,
maxReputation: 100,
visitedToday: false,
skillPoints: 0,
perks: {
seeStats: false,
profitBonus: 0,
energySaving: 0,
securityDiscount: false,
feminizationAttempts: false,
haggle: false,
biweeklyPay: false,
playerProfitBonus: 0,
relaxationSpeed: 0,
surgeryDiscount: false
},
prisoners: [],
dungeonCells: 1,
debtWorkers: [],
pendingWeeklyEarnings: 0,
weeklyEarnings: 0,
lastPayDay: 0
}>>
<<ChatMessage "You have sold your brothel for $10,000.">>
<<goto "RedLightDistrict">>
<</nobr>><<nobr>>
<<include "PlayerBrothel_InitCheck">>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Locations/City/RedLightDistrict/Brothel/Working Rooms.jpg">>
/* Check for random events */
<<BrothelRandomEventCheck>>
<<timed 0.2s>>
<div class="centre-text">Working Rooms</div>
<div class="centre-text" style="font-size: 14px;">You have <<print $playerBrothel.rooms>> rooms available</div>
<div class="grid-row-twice">
<fieldset class="brothel-fieldset">
<legend>Navigation</legend>
<div class="brothel-btn-container">
<span class="brothel-btn neutral"><<button "← Main Hall" "PlayerBrothel_Main">><</button>></span>
</div>
</fieldset>
<fieldset class="brothel-fieldset purple">
<legend>Activity</legend>
<div class="brothel-btn-container">
<span class="brothel-btn secondary"><<button "⏳ Wait">>
<<run $player.status.energy.increase(Random(1, 5, true))>>
<<SpendTimeWithoutUpdate 15>>
<<run $player.status.alcoholIntoxication.decrease(Random(1, 2))>>
<<goto "PlayerBrothel_Rooms">>
<</button>></span>
</div>
</fieldset>
</div>
/* Filter only workers assigned to "work" */
<<set _workingProstitutes = []>>
<<for _i = 0; _i < $playerBrothel.prostitutes.length; _i++>>
<<set _prostId = $playerBrothel.prostitutes[_i]>>
<<set _assignment = $playerBrothel.workerAssignments[_prostId] || "work">>
<<if _assignment == "work">>
<<set _prost = $Characters.find(c => c.info.id == _prostId)>>
<<if _prost>>
<<run _workingProstitutes.push(_prost)>>
<</if>>
<</if>>
<</for>>
<<if _workingProstitutes.length > 0>>
<fieldset>
<legend>Workers Currently Working (<<print _workingProstitutes.length>>)</legend>
<div class="characters-grid">
<<for _i = 0; _i < _workingProstitutes.length; _i++>>
<<set _prost = _workingProstitutes[_i]>>
<<set _prostIcon = _prost.getPhotoImage()>>
<<set _prostName = _prost.info.firstName + " " + _prost.info.secondName>>
<<set _prostEnergy = _prost.status.energy.value>>
<<set _prostEnergyMax = _prost.status.energy.max>>
<<set _prostCorruption = _prost.attributes.corruption.value>>
<<set _cardHTML = '<div class="brothel-worker-card">'>>
<<set _cardHTML += '<div class="brothel-worker-card__avatar-wrapper"><img class="brothel-worker-card__avatar" src="' + _prostIcon + '" alt=""></div>'>>
<<set _cardHTML += '<div class="brothel-worker-card__info">'>>
<<set _cardHTML += '<div class="brothel-worker-card__name">' + _prostName + '</div>'>>
<<set _cardHTML += '<div class="brothel-worker-card__stats">'>>
<<set _cardHTML += '<span class="brothel-worker-card__stat">⚡ ' + _prostEnergy + '/' + _prostEnergyMax + '</span>'>>
<<set _cardHTML += '<span class="brothel-worker-card__stat">🔥 ' + _prostCorruption + '/10</span>'>>
<<set _cardHTML += '</div></div></div>'>>
<<capture _prost _cardHTML>>
<<button _cardHTML "BrothelWorkerDetails">>
<<set $selectedBrothelWorker = _prost>>
<</button>>
<</capture>>
<</for>>
</div>
</fieldset>
<<else>>
<<if $playerBrothel.prostitutes.length > 0>>
<<ChatMessage "All workers are currently assigned to other duties (Spa, Medical, or Relaxation). Assign workers to 'Work' from the Worker Management panel.">>
<<else>>
<<ChatMessage "No workers hired yet. Go to the Office to hire some!">>
<</if>>
<</if>>
<<PeopleAround>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _worker = $selectedBrothelWorker>>
<<set _workerId = _worker.info.id>>
<<ShowNpcIcon _worker>>
<<set _workerName = _worker.info.firstName + " " + _worker.info.secondName>>
<<set _workerAge = _worker.info.age.value>>
<<set _workerFace = _worker.body.face.value>>
<<set _workerCorruption = _worker.attributes.corruption.value>>
/* Get brothel worker stats (with defaults for old hires) */
<<set _submission = _worker.saveData.has("submission") ? _worker.saveData.get("submission") : 3>>
<<set _affection = _worker.saveData.has("affection") ? _worker.saveData.get("affection") : 3>>
<<set _fear = _worker.saveData.has("fear") ? _worker.saveData.get("fear") : 1>>
/* Get energy and health */
<<set _energy = _worker.status.energy.value>>
<<set _energyMax = _worker.status.energy.max>>
<<set _health = _worker.status.health.value>>
<<set _healthMax = _worker.status.health.max>>
<<set _energyPercent = Math.round((_energy / _energyMax) * 100)>>
<<set _healthPercent = Math.round((_health / _healthMax) * 100)>>
/* Get current assignment */
<<set _assignment = $playerBrothel.workerAssignments[_workerId] || "work">>
/* Initialize stats if not set */
<<if !_worker.saveData.has("submission")>>
<<run _worker.saveData.set("submission", _submission)>>
<<run _worker.saveData.set("affection", _affection)>>
<<run _worker.saveData.set("fear", _fear)>>
<</if>>
/* Calculate bar widths and styles */
<<set _faceWidth = _workerFace * 10>>
<<set _corruptionWidth = _workerCorruption * 10>>
<<set _submissionWidth = _submission * 10>>
<<set _affectionWidth = _affection * 10>>
<<set _fearWidth = _fear * 10>>
/* Pre-compute bar styles for proper rendering */
<<set _healthBarStyle = "background: linear-gradient(90deg, #f44336, #e91e63); width: " + _healthPercent + "%; height: 100%; border-radius: 5px; transition: width 0.3s;">>
<<set _energyBarStyle = "background: linear-gradient(90deg, #ff9800, #ffeb3b); width: " + _energyPercent + "%; height: 100%; border-radius: 5px; transition: width 0.3s;">>
<<set _faceBarStyle = "background: #e91e63; width: " + _faceWidth + "%; height: 100%; border-radius: 3px;">>
<<set _corruptionBarStyle = "background: #9c27b0; width: " + _corruptionWidth + "%; height: 100%; border-radius: 3px;">>
<<set _submissionBarStyle = "background: #ff9800; width: " + _submissionWidth + "%; height: 100%; border-radius: 3px;">>
<<set _affectionBarStyle = "background: #e91e63; width: " + _affectionWidth + "%; height: 100%; border-radius: 3px;">>
<<set _fearBarStyle = "background: #673ab7; width: " + _fearWidth + "%; height: 100%; border-radius: 3px;">>
<fieldset style="background: linear-gradient(135deg, rgba(233, 30, 99, 0.1) 0%, rgba(33, 33, 33, 0.9) 100%); border: 1px solid #e91e63;">
<legend style="color: #f48fb1;"><<print _workerName>></legend>
/* Vital Stats - Health & Energy */
<div style="margin-bottom: 15px;">
<div style="font-size: 12px; margin: 8px 0;">
<div style="display: flex; justify-content: space-between; color: #fff;"><span>❤️ Health</span><span><<print _health>>/<<print _healthMax>></span></div>
<div style="background: rgba(255,255,255,0.1); height: 10px; border-radius: 5px; margin-top: 4px;">
<div @style="_healthBarStyle"></div>
</div>
</div>
<div style="font-size: 12px; margin: 8px 0;">
<div style="display: flex; justify-content: space-between; color: #fff;"><span>⚡ Energy</span><span><<print _energy>>/<<print _energyMax>></span></div>
<div style="background: rgba(255,255,255,0.1); height: 10px; border-radius: 5px; margin-top: 4px;">
<div @style="_energyBarStyle"></div>
</div>
</div>
</div>
<hr style="border-color: rgba(255,255,255,0.1); margin: 10px 0;">
/* Basic Info */
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 15px;">
<div>
<p style="color: #aaa; font-size: 12px;"><b>Age:</b> <span style="color: #fff;"><<print _workerAge>></span></p>
<div style="font-size: 11px; margin: 8px 0;">
<div style="display: flex; justify-content: space-between; color: #aaa;"><span>✨ Attractiveness</span><span><<print _workerFace>>/10</span></div>
<div style="background: rgba(255,255,255,0.1); height: 6px; border-radius: 3px; margin-top: 3px;">
<div @style="_faceBarStyle"></div>
</div>
</div>
<div style="font-size: 11px; margin: 8px 0;">
<div style="display: flex; justify-content: space-between; color: #aaa;"><span>🔥 Corruption</span><span><<print _workerCorruption>>/10</span></div>
<div style="background: rgba(255,255,255,0.1); height: 6px; border-radius: 3px; margin-top: 3px;">
<div @style="_corruptionBarStyle"></div>
</div>
</div>
</div>
<div>
<div style="font-size: 11px; margin: 8px 0;">
<div style="display: flex; justify-content: space-between; color: #aaa;"><span>🎀 Submission</span><span><<print _submission>>/10</span></div>
<div style="background: rgba(255,255,255,0.1); height: 6px; border-radius: 3px; margin-top: 3px;">
<div @style="_submissionBarStyle"></div>
</div>
</div>
<div style="font-size: 11px; margin: 8px 0;">
<div style="display: flex; justify-content: space-between; color: #aaa;"><span>💕 Affection</span><span><<print _affection>>/10</span></div>
<div style="background: rgba(255,255,255,0.1); height: 6px; border-radius: 3px; margin-top: 3px;">
<div @style="_affectionBarStyle"></div>
</div>
</div>
<div style="font-size: 11px; margin: 8px 0;">
<div style="display: flex; justify-content: space-between; color: #aaa;"><span>😨 Fear</span><span><<print _fear>>/10</span></div>
<div style="background: rgba(255,255,255,0.1); height: 6px; border-radius: 3px; margin-top: 3px;">
<div @style="_fearBarStyle"></div>
</div>
</div>
</div>
</div>
<div style="text-align: center; margin-top: 10px;">
<span class="brothel-btn info small"><<button "❓ Stats Guide" "BrothelWorker_StatsHelp">><</button>></span>
</div>
</fieldset>
<fieldset style="background: linear-gradient(135deg, rgba(33, 150, 243, 0.1) 0%, rgba(33, 33, 33, 0.9) 100%); border: 1px solid #2196f3;">
<legend style="color: #64b5f6;">📋 Assignment</legend>
/* Current assignment display */
<div style="background: rgba(0,0,0,0.3); padding: 10px 15px; border-radius: 10px; margin-bottom: 12px; display: flex; justify-content: space-between; align-items: center;">
<span style="color: #aaa; font-size: 12px;">Current Assignment:</span>
<<if _assignment == "work">>
<span style="background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); padding: 5px 15px; border-radius: 15px; color: #fff; font-size: 12px; font-weight: bold;">💋 Working</span>
<<elseif _assignment == "spa">>
<span style="background: linear-gradient(135deg, #00bcd4 0%, #0097a7 100%); padding: 5px 15px; border-radius: 15px; color: #fff; font-size: 12px; font-weight: bold;">💆 Spa</span>
<<elseif _assignment == "medical">>
<span style="background: linear-gradient(135deg, #4CAF50 0%, #388E3C 100%); padding: 5px 15px; border-radius: 15px; color: #fff; font-size: 12px; font-weight: bold;">🏥 Medical</span>
<<elseif _assignment == "relaxation">>
<span style="background: linear-gradient(135deg, #ff9800 0%, #f57c00 100%); padding: 5px 15px; border-radius: 15px; color: #fff; font-size: 12px; font-weight: bold;">🛋️ Relaxation</span>
<<else>>
<span style="background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); padding: 5px 15px; border-radius: 15px; color: #fff; font-size: 12px; font-weight: bold;">💋 Working</span>
<</if>>
</div>
/* Assignment buttons grid */
<div style="display: grid; grid-template-columns: repeat(2, 1fr); gap: 8px;">
<<if _assignment != "work">>
<span class="brothel-btn primary small"><<button "💋 Work" "BrothelWorker_Assign">><<set $workerNewAssignment = "work">><</button>></span>
<<else>>
<div style="background: rgba(233, 30, 99, 0.3); border-radius: 10px; padding: 12px; text-align: center; border: 2px solid #e91e63;">
<span style="color: #e91e63; font-size: 12px;">💋 Working ✓</span>
</div>
<</if>>
<<if $playerBrothel.upgrades.spa>>
<<if _assignment != "spa">>
<span class="brothel-btn spa small"><<button "💆 Spa" "BrothelWorker_Assign">><<set $workerNewAssignment = "spa">><</button>></span>
<<else>>
<div style="background: rgba(0, 188, 212, 0.3); border-radius: 10px; padding: 12px; text-align: center; border: 2px solid #00bcd4;">
<span style="color: #00bcd4; font-size: 12px;">💆 Spa ✓</span>
</div>
<</if>>
<</if>>
<<if $playerBrothel.upgrades.medical>>
<<if _assignment != "medical">>
<span class="brothel-btn success small"><<button "🏥 Medical" "BrothelWorker_Assign">><<set $workerNewAssignment = "medical">><</button>></span>
<<else>>
<div style="background: rgba(76, 175, 80, 0.3); border-radius: 10px; padding: 12px; text-align: center; border: 2px solid #4CAF50;">
<span style="color: #4CAF50; font-size: 12px;">🏥 Medical ✓</span>
</div>
<</if>>
<</if>>
<<if $playerBrothel.upgrades.relaxation>>
<<if _assignment != "relaxation">>
<span class="brothel-btn special small"><<button "🛋️ Rest" "BrothelWorker_Assign">><<set $workerNewAssignment = "relaxation">><</button>></span>
<<else>>
<div style="background: rgba(255, 152, 0, 0.3); border-radius: 10px; padding: 12px; text-align: center; border: 2px solid #ff9800;">
<span style="color: #ff9800; font-size: 12px;">🛋️ Rest ✓</span>
</div>
<</if>>
<</if>>
/* Room assignment - always available */
<<if _assignment != "room">>
<span class="brothel-btn neutral small"><<button "🚪 Room" "BrothelWorker_Assign">><<set $workerNewAssignment = "room">><</button>></span>
<<else>>
<div style="background: rgba(96, 125, 139, 0.3); border-radius: 10px; padding: 12px; text-align: center; border: 2px solid #607D8B;">
<span style="color: #607D8B; font-size: 12px;">🚪 In Room ✓</span>
</div>
<</if>>
</div>
</fieldset>
/* Check if player can have sex */
<<set _playerEnergy = $player.status.energy.value>>
<<set _playerPotency = $player.status.potency.value>>
<<set _potencyMin = $player.status.potency.min>>
<<set _workerEnergy = _worker.status.energy.value>>
<<set _workerHasEnergy = _workerEnergy >= 10>>
<<set _hasEnoughAffection = _affection >= 8>>
<<set _canHaveSex = _playerEnergy >= 10 && _playerPotency > _potencyMin && _workerHasEnergy && _hasEnoughAffection>>
/* Check if player already talked to this worker today */
<<set _workerId = _worker.info.id>>
<<set _talkEventKey = "brothelTalk_" + _workerId>>
<<set _alreadyTalkedToday = $dailyEvents && $dailyEvents[_talkEventKey]>>
<fieldset class="brothel-fieldset purple">
<legend>💬 Interactions</legend>
<div class="brothel-btn-container">
<<if _canHaveSex>>
<span class="brothel-btn primary"><<button "💋 Offer Sex" "BrothelWorker_OfferSex">><</button>></span>
<<else>>
<<if !_hasEnoughAffection>>
<span class="brothel-btn disabled" title="Worker's affection is too low (<<print _affection>>/8)"><<button "💋 Offer Sex (Low Affection)">><</button>></span>
<<elseif !_workerHasEnergy>>
<span class="brothel-btn disabled" title="Worker is too tired"><<button "💋 Offer Sex (Worker Tired)">><</button>></span>
<<elseif _playerEnergy < 10 && _playerPotency <= _potencyMin>>
<span class="brothel-btn disabled" title="Not enough energy and sex stamina"><<button "💋 Offer Sex (Low Energy & Stamina)">><</button>></span>
<<elseif _playerEnergy < 10>>
<span class="brothel-btn disabled" title="Not enough energy"><<button "💋 Offer Sex (Low Energy)">><</button>></span>
<<else>>
<span class="brothel-btn disabled" title="Not enough sex stamina"><<button "💋 Offer Sex (Exhausted)">><</button>></span>
<</if>>
<</if>>
<span class="brothel-btn success"><<button "💰 Give Money" "BrothelWorker_GiveMoney">><</button>></span>
<<if _alreadyTalkedToday>>
<span class="brothel-btn disabled" title="You already talked to this worker today"><<button "🗣️ Talk (Already Talked)">><</button>></span>
<<else>>
<span class="brothel-btn info"><<button "🗣️ Talk" "BrothelWorker_Talk">><</button>></span>
<</if>>
<span class="brothel-btn secondary"><<button "👀 View Body" "BrothelWorker_ViewBody">><</button>></span>
<span class="brothel-btn special"><<button "💋 Skills & Limits" "BrothelWorker_ViewSkillsLimits">><</button>></span>
</div>
</fieldset>
/* Feminization option for male workers */
<<set _workerGender = _worker.gender()>>
<<if _workerGender == "Male">>
<<set _feminizationAttempts = _worker.saveData.get("feminizationAttempts") || 0>>
<<set _hasExtraAttempt = $playerBrothel.perks && $playerBrothel.perks.feminizationAttempts>>
<<set _maxAttempts = _hasExtraAttempt ? 2 : 1>>
<<set _canAttempt = _feminizationAttempts < _maxAttempts>>
<<set _hasEnoughAffectionForSurgery = _affection >= 8>>
<fieldset class="brothel-fieldset">
<legend>🎀 Feminization</legend>
<<if !_hasEnoughAffectionForSurgery>>
<p style="color: #ffa726; font-size: 12px;">⚠ Worker's affection is too low for surgical procedures (<<print _affection>>/8)</p>
<p style="color: #888; font-size: 11px;">Build trust through talking and gifts before offering transformation.</p>
<div class="brothel-btn-container">
<span class="brothel-btn disabled" title="Affection too low (<<print _affection>>/8)"><<button "💉 Offer Feminization (Low Affection)">><</button>></span>
</div>
<<elseif !_canAttempt>>
<p style="color: #ff6666; font-size: 12px;">⚠ You already offered feminization to this worker <<print _maxAttempts>> time(s), but they refused.</p>
<div class="brothel-btn-container">
<span class="brothel-btn disabled"><<button "💉 Offer Feminization (Max Attempts)">><</button>></span>
</div>
<<else>>
<p style="color: #aaa; font-size: 12px;">Offer this male worker a feminization procedure to transform them into a more desirable form.</p>
<<if _hasExtraAttempt>>
<p style="color: #ffd700; font-size: 11px;">⭐ Persuasion Master: <<print _maxAttempts - _feminizationAttempts>> attempt(s) remaining</p>
<</if>>
<div class="brothel-btn-container">
<span class="brothel-btn special"><<button "💉 Offer Feminization" "BrothelWorker_OfferFeminization">><</button>></span>
</div>
<</if>>
</fieldset>
<</if>>
/* Surgical Enhancement option - only for females and shemales */
<<set _canEnhance = _workerGender == "Female" || _workerGender == "Shemale">>
<<set _hasEnoughAffectionForSurgery = _affection >= 8>>
<<if _canEnhance>>
<fieldset class="brothel-fieldset">
<legend>💉 Surgical Enhancement</legend>
<<if !_hasEnoughAffectionForSurgery>>
<p style="color: #ffa726; font-size: 12px;">⚠ Worker's affection is too low for surgical procedures (<<print _affection>>/8)</p>
<p style="color: #888; font-size: 11px;">Build trust through talking and gifts before offering enhancements.</p>
<div class="brothel-btn-container">
<span class="brothel-btn disabled" title="Affection too low (<<print _affection>>/8)"><<button "🍈 Breast Enhancement (Low Affection)">><</button>></span>
<span class="brothel-btn disabled" title="Affection too low (<<print _affection>>/8)"><<button "🍑 Butt Enhancement (Low Affection)">><</button>></span>
</div>
<<else>>
<p style="color: #aaa; font-size: 12px;">Enhance your worker's body through surgical procedures.</p>
<div class="brothel-btn-container">
<span class="brothel-btn special"><<button "🍈 Breast Enhancement" "BrothelWorker_Surgery_Breasts">><</button>></span>
<span class="brothel-btn special"><<button "🍑 Butt Enhancement" "BrothelWorker_Surgery_Butt">><</button>></span>
</div>
<</if>>
</fieldset>
<</if>>
<fieldset>
<legend>⚙️ Management</legend>
<div class="brothel-btn-container">
<span class="brothel-btn danger"><<button "🚫 Fire Worker" "BrothelFireWorker">><</button>></span>
<span class="brothel-btn neutral"><<button "← Back" "BrothelViewWorkers">><<unset $selectedBrothelWorker>><</button>></span>
</div>
</fieldset>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _worker = $selectedBrothelWorker>>
<<ShowNpcIcon _worker>>
<div class="centre-text" style="font-size: 22px; color: #ffc107; text-shadow: 0 0 15px rgba(255, 193, 7, 0.5);">❓ Worker Stats Guide</div>
/* Attractiveness */
<fieldset style="background: linear-gradient(135deg, rgba(233, 30, 99, 0.15) 0%, rgba(33, 33, 33, 0.95) 100%); border: 2px solid #e91e63; margin: 15px 0;">
<legend style="color: #f48fb1; font-size: 16px;">✨ Attractiveness</legend>
<div style="padding: 15px;">
<p style="color: #ccc; font-size: 13px; margin-bottom: 15px;">
💰 <b>Directly affects income!</b> The most important stat for profitability.
</p>
<div style="background: rgba(76, 175, 80, 0.15); padding: 12px; border-radius: 8px; border-left: 3px solid #4CAF50; margin-bottom: 10px;">
<div style="color: #81c784; font-weight: bold; margin-bottom: 8px;">✓ High Attractiveness (7+)</div>
<ul style="color: #aaa; font-size: 12px; margin: 0; padding-left: 20px;">
<li>100% of potential income at 10</li>
<li>Attracts more clients</li>
<li>Higher tips from satisfied customers</li>
</ul>
</div>
<div style="background: rgba(244, 67, 54, 0.15); padding: 12px; border-radius: 8px; border-left: 3px solid #f44336; margin-bottom: 10px;">
<div style="color: #ef9a9a; font-weight: bold; margin-bottom: 8px;">✗ Low Attractiveness (3-)</div>
<ul style="color: #aaa; font-size: 12px; margin: 0; padding-left: 20px;">
<li>Only 40-60% of potential income</li>
<li>Fewer clients want to pay for services</li>
<li>At 1: Minimum 40% income</li>
</ul>
</div>
<div style="background: rgba(255, 152, 0, 0.15); padding: 12px; border-radius: 8px; border-left: 3px solid #ff9800; margin-bottom: 10px;">
<div style="color: #ffb74d; font-weight: bold; margin-bottom: 8px;">⚠️ Important: Daily Decay!</div>
<ul style="color: #aaa; font-size: 12px; margin: 0; padding-left: 20px;">
<li>All workers lose 0.1-0.3 attractiveness per day from work</li>
<li>Without maintenance, attractiveness will drop over time</li>
<li>Send workers to the <span style="color: #4fc3f7;">💆 Spa Salon</span> to restore it!</li>
</ul>
</div>
<div style="background: rgba(0,0,0,0.3); padding: 10px; border-radius: 5px; margin-top: 10px;">
<div style="color: #888; font-size: 11px;">📈 How to restore: Spa Salon (+0.5-1.0/day), Breast/Butt surgery (one-time boost)</div>
</div>
</div>
</fieldset>
/* Submission */
<fieldset style="background: linear-gradient(135deg, rgba(255, 152, 0, 0.15) 0%, rgba(33, 33, 33, 0.95) 100%); border: 2px solid #ff9800; margin: 15px 0;">
<legend style="color: #ffb74d; font-size: 16px;">🎀 Submission</legend>
<div style="padding: 15px;">
<p style="color: #ccc; font-size: 13px; margin-bottom: 15px;">
Determines how obedient the worker is and whether they follow your orders.
</p>
<div style="background: rgba(76, 175, 80, 0.15); padding: 12px; border-radius: 8px; border-left: 3px solid #4CAF50; margin-bottom: 10px;">
<div style="color: #81c784; font-weight: bold; margin-bottom: 8px;">✓ High Submission (6+)</div>
<ul style="color: #aaa; font-size: 12px; margin: 0; padding-left: 20px;">
<li>Accepts difficult clients without complaint</li>
<li>Never refuses work assignments</li>
<li>At 8+: Agrees to surgical procedures</li>
<li>At 8+: Can work overtime shifts</li>
</ul>
</div>
<div style="background: rgba(244, 67, 54, 0.15); padding: 12px; border-radius: 8px; border-left: 3px solid #f44336;">
<div style="color: #ef9a9a; font-weight: bold; margin-bottom: 8px;">✗ Low Submission (3-)</div>
<ul style="color: #aaa; font-size: 12px; margin: 0; padding-left: 20px;">
<li>May refuse unpleasant clients (-income)</li>
<li>At 2-: Sometimes skips work</li>
<li>Demands higher salary</li>
</ul>
</div>
<div style="background: rgba(0,0,0,0.3); padding: 10px; border-radius: 5px; margin-top: 10px;">
<div style="color: #888; font-size: 11px;">📈 How to increase: Training, successful work, positive interactions</div>
</div>
</div>
</fieldset>
/* Affection */
<fieldset style="background: linear-gradient(135deg, rgba(233, 30, 99, 0.15) 0%, rgba(33, 33, 33, 0.95) 100%); border: 2px solid #e91e63; margin: 15px 0;">
<legend style="color: #f48fb1; font-size: 16px;">💕 Affection</legend>
<div style="padding: 15px;">
<p style="color: #ccc; font-size: 13px; margin-bottom: 15px;">
Represents how much the worker likes and trusts you personally.
</p>
<div style="background: rgba(76, 175, 80, 0.15); padding: 12px; border-radius: 8px; border-left: 3px solid #4CAF50; margin-bottom: 10px;">
<div style="color: #81c784; font-weight: bold; margin-bottom: 8px;">✓ High Affection (7+)</div>
<ul style="color: #aaa; font-size: 12px; margin: 0; padding-left: 20px;">
<li>At 7+: Will accept your job offer (hiring)</li>
<li>At 8+: Agrees to have sex with you</li>
<li>At 8+: Agrees to surgical procedures</li>
<li>Loyal worker, less likely to cause problems</li>
</ul>
</div>
<div style="background: rgba(244, 67, 54, 0.15); padding: 12px; border-radius: 8px; border-left: 3px solid #f44336;">
<div style="color: #ef9a9a; font-weight: bold; margin-bottom: 8px;">✗ Low Affection (3-)</div>
<ul style="color: #aaa; font-size: 12px; margin: 0; padding-left: 20px;">
<li>Refuses personal requests</li>
<li>No loyalty to you</li>
<li>May complain about working conditions</li>
</ul>
</div>
<div style="background: rgba(0,0,0,0.3); padding: 10px; border-radius: 5px; margin-top: 10px;">
<div style="color: #888; font-size: 11px;">📈 How to increase: Gifts ($), talking, positive interactions</div>
</div>
</div>
</fieldset>
/* Corruption */
<fieldset style="background: linear-gradient(135deg, rgba(156, 39, 176, 0.15) 0%, rgba(33, 33, 33, 0.95) 100%); border: 2px solid #9c27b0; margin: 15px 0;">
<legend style="color: #ce93d8; font-size: 16px;">🔥 Corruption</legend>
<div style="padding: 15px;">
<p style="color: #ccc; font-size: 13px; margin-bottom: 15px;">
Measures sexual experience and willingness to perform various services.
</p>
<div style="background: rgba(76, 175, 80, 0.15); padding: 12px; border-radius: 8px; border-left: 3px solid #4CAF50; margin-bottom: 10px;">
<div style="color: #81c784; font-weight: bold; margin-bottom: 8px;">✓ High Corruption (7+)</div>
<ul style="color: #aaa; font-size: 12px; margin: 0; padding-left: 20px;">
<li>+3% income bonus per level (up to +30%)</li>
<li>At 7+: Can serve VIP clients (x2 income)</li>
<li>Fewer service limits (more "Yes" limits)</li>
<li>Learns new skills faster</li>
<li>Handles kinky requests well</li>
</ul>
</div>
<div style="background: rgba(244, 67, 54, 0.15); padding: 12px; border-radius: 8px; border-left: 3px solid #f44336;">
<div style="color: #ef9a9a; font-weight: bold; margin-bottom: 8px;">✗ Low Corruption (3-)</div>
<ul style="color: #aaa; font-size: 12px; margin: 0; padding-left: 20px;">
<li>Refuses kinky clients</li>
<li>More service limits</li>
<li>Learns skills slower</li>
</ul>
</div>
<div style="background: rgba(0,0,0,0.3); padding: 10px; border-radius: 5px; margin-top: 10px;">
<div style="color: #888; font-size: 11px;">📈 How to increase: Work experience, sex with player, training</div>
</div>
</div>
</fieldset>
/* Fear */
<fieldset style="background: linear-gradient(135deg, rgba(103, 58, 183, 0.15) 0%, rgba(33, 33, 33, 0.95) 100%); border: 2px solid #673ab7; margin: 15px 0;">
<legend style="color: #b39ddb; font-size: 16px;">😨 Fear</legend>
<div style="padding: 15px;">
<p style="color: #ccc; font-size: 13px; margin-bottom: 15px;">
⚠️ <b>Double-edged stat!</b> Balance is key - too high or too low causes problems.
</p>
<div style="background: rgba(255, 193, 7, 0.15); padding: 12px; border-radius: 8px; border-left: 3px solid #ffc107; margin-bottom: 10px;">
<div style="color: #ffca28; font-weight: bold; margin-bottom: 8px;">⚖️ Optimal Fear (3-5)</div>
<ul style="color: #aaa; font-size: 12px; margin: 0; padding-left: 20px;">
<li>Respects your authority</li>
<li>Follows orders reliably</li>
<li>Works even when tired</li>
<li>No negative effects</li>
</ul>
</div>
<div style="background: rgba(244, 67, 54, 0.15); padding: 12px; border-radius: 8px; border-left: 3px solid #f44336; margin-bottom: 10px;">
<div style="color: #ef9a9a; font-weight: bold; margin-bottom: 8px;">⚠️ High Fear (7+) - DANGEROUS</div>
<ul style="color: #aaa; font-size: 12px; margin: 0; padding-left: 20px;">
<li>-5% income per level above 6 (poor performance)</li>
<li>At 9+: Risk of escape (5-15% daily chance)</li>
<li>Lowers other workers' morale</li>
<li>Makes mistakes with clients (-reputation)</li>
</ul>
</div>
<div style="background: rgba(33, 150, 243, 0.15); padding: 12px; border-radius: 8px; border-left: 3px solid #2196f3;">
<div style="color: #64b5f6; font-weight: bold; margin-bottom: 8px;">💙 Low Fear (0-2)</div>
<ul style="color: #aaa; font-size: 12px; margin: 0; padding-left: 20px;">
<li>May refuse unpleasant tasks</li>
<li>Sometimes demands salary raises</li>
<li>Best combined with high Affection</li>
</ul>
</div>
<div style="background: rgba(0,0,0,0.3); padding: 10px; border-radius: 5px; margin-top: 10px;">
<div style="color: #888; font-size: 11px;">📈 Increases: Punishment, dungeon whipping | 📉 Decreases: Gifts, kindness, time</div>
</div>
</div>
</fieldset>
/* Optimal Builds Table */
<fieldset style="background: linear-gradient(135deg, rgba(255, 215, 0, 0.1) 0%, rgba(33, 33, 33, 0.95) 100%); border: 2px solid #ffd700; margin: 15px 0;">
<legend style="color: #ffd700; font-size: 16px;">🏆 Optimal Worker Builds</legend>
<div style="padding: 15px;">
<table style="width: 100%; border-collapse: collapse; font-size: 12px;">
<tr style="background: rgba(0,0,0,0.3);">
<th style="padding: 10px; text-align: left; color: #ffd700; border-bottom: 1px solid #555;">Build</th>
<th style="padding: 10px; text-align: center; color: #ff9800;">Sub</th>
<th style="padding: 10px; text-align: center; color: #9c27b0;">Cor</th>
<th style="padding: 10px; text-align: center; color: #673ab7;">Fear</th>
<th style="padding: 10px; text-align: left; color: #aaa;">Effect</th>
</tr>
<tr style="border-bottom: 1px solid #333;">
<td style="padding: 10px; color: #4CAF50;">💰 Gold Mine</td>
<td style="padding: 10px; text-align: center; color: #ccc;">6-8</td>
<td style="padding: 10px; text-align: center; color: #ccc;">8-10</td>
<td style="padding: 10px; text-align: center; color: #ccc;">3-5</td>
<td style="padding: 10px; color: #888;">Maximum income</td>
</tr>
<tr style="border-bottom: 1px solid #333;">
<td style="padding: 10px; color: #2196f3;">🛡️ Reliable</td>
<td style="padding: 10px; text-align: center; color: #ccc;">8+</td>
<td style="padding: 10px; text-align: center; color: #ccc;">5-7</td>
<td style="padding: 10px; text-align: center; color: #ccc;">2-4</td>
<td style="padding: 10px; color: #888;">Stable, never fails</td>
</tr>
<tr style="border-bottom: 1px solid #333;">
<td style="padding: 10px; color: #e91e63;">🔥 VIP Star</td>
<td style="padding: 10px; text-align: center; color: #ccc;">5-7</td>
<td style="padding: 10px; text-align: center; color: #ccc;">10</td>
<td style="padding: 10px; text-align: center; color: #ccc;">0-2</td>
<td style="padding: 10px; color: #888;">VIP clients, but demanding</td>
</tr>
<tr style="border-bottom: 1px solid #333;">
<td style="padding: 10px; color: #f44336;">😰 Broken</td>
<td style="padding: 10px; text-align: center; color: #ccc;">10</td>
<td style="padding: 10px; text-align: center; color: #ccc;">any</td>
<td style="padding: 10px; text-align: center; color: #ccc;">8+</td>
<td style="padding: 10px; color: #888;">Obeys, but may escape!</td>
</tr>
<tr>
<td style="padding: 10px; color: #ff9800;">💕 Loyal</td>
<td style="padding: 10px; text-align: center; color: #ccc;">6+</td>
<td style="padding: 10px; text-align: center; color: #ccc;">5+</td>
<td style="padding: 10px; text-align: center; color: #ccc;">0-3</td>
<td style="padding: 10px; color: #888;">High affection + stability</td>
</tr>
</table>
</div>
</fieldset>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn neutral"><<button "← Back to Worker" "BrothelWorkerDetails">><</button>></span>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _worker = $selectedBrothelWorker>>
<<set _workerId = _worker.info.id>>
<<set _workerName = _worker.info.firstName>>
<<set _newAssign = $workerNewAssignment>>
<<set $playerBrothel.workerAssignments[_workerId] = _newAssign>>
<<switch _newAssign>>
<<case "work">>
<<set _msg = _workerName + " has been assigned to work with clients.">>
<<case "spa">>
<<set _msg = _workerName + " has been sent to the Spa Salon to relax and restore energy.">>
<<case "medical">>
<<set _msg = _workerName + " has been sent to the Medical Room for treatment.">>
<<case "relaxation">>
<<set _msg = _workerName + " has been sent to the Relaxation Room to rest.">>
<<case "room">>
<<set _msg = _workerName + " has been sent to their room to rest.">>
<<default>>
<<set _msg = _workerName + " assignment has been updated.">>
<</switch>>
<<ChatMessage _msg>>
<<unset $workerNewAssignment>>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn secondary"><<button "→ Continue" "BrothelWorkerDetails">><</button>></span>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _worker = $selectedBrothelWorker>>
<<if ndef _worker || !_worker>>
<<ChatMessage "No worker is selected right now. Return to the rooms list and choose a worker first.">>
<<else>>
<<set _workerId = _worker.info.id>>
<<set _workerName = _worker.info.firstName>>
<<set _workerIndex = $playerBrothel.prostitutes.indexOf(_workerId)>>
<<if _workerIndex > -1>>
/* Remove from brothel list */
<<run $playerBrothel.prostitutes.splice(_workerIndex, 1)>>
/* Update worker status and relocate to Red Light District */
<<run SetNpcScriptedRole(_worker, "None")>>
<<set _worker.info.currentLocation = "RedLightDistrict">>
/* Add to RedLightDistrict location list if it exists */
<<set _charIndex = $Characters.findIndex(c => c.info.id == _workerId)>>
<<if _charIndex > -1 && $Locations["RedLightDistrict"]>>
<<run $Locations["RedLightDistrict"].push(_charIndex)>>
<</if>>
<<set _msg = "You have fired " + _workerName + ". They are no longer working for you.">>
<<ChatMessage _msg>>
<<else>>
<<ChatMessage "That worker is no longer assigned here. The rooms list has been refreshed.">>
<</if>>
<</if>>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn neutral"><<button "← Back" "PlayerBrothel_Rooms">><<unset $selectedBrothelWorker>><</button>></span>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _worker = $selectedBrothelWorker>>
<<ShowNpcIcon _worker>>
<<set _workerName = _worker.info.firstName>>
<<set _submission = _worker.saveData.get("submission") || 3>>
<<set _affection = _worker.saveData.get("affection") || 3>>
<<set _fear = _worker.saveData.get("fear") || 1>>
<<set _corruption = _worker.attributes.corruption.value>>
<<set _personality = _worker.saveData.get("personality") || "default">>
/* Calculate acceptance chance based on stats */
/* Higher submission, affection, fear, and corruption = higher chance */
<<set _acceptChance = (_submission * 8) + (_affection * 6) + (_fear * 4) + (_corruption * 5)>>
/* Base 20% + calculated bonus, max 95% */
<<set _acceptChance = Math.min(95, 20 + _acceptChance)>>
<<set _roll = Random(1, 100)>>
<<set _msg = "You approach " + _workerName + " and suggest spending some private time together...">>
<<ChatMessage _msg>>
<<if _roll <= _acceptChance>>
/* Accepted */
<<switch _personality>>
<<case "shy">>
<<set _response = [
"*blushes deeply* I... if you want to, boss... I-I'll do my best...",
"*looks down nervously* O-okay... I'm yours after all...",
"*trembles slightly* Y-yes... please be gentle..."
].random()>>
<<case "confident">>
<<set _response = [
"*smirks* A private session with the boss? I'm flattered. Let's go.",
"Of course. I'll show you exactly why you hired me.",
"*nods approvingly* I was wondering when you'd ask. Lead the way."
].random()>>
<<case "flirty">>
<<set _response = [
"*giggles excitedly* I thought you'd never ask! Let's have some fun!",
"*winks* Mmm, I've been hoping you'd want me... Let's go somewhere private!",
"*purrs* Finally! I've been thinking about this all day..."
].random()>>
<<case "submissive">>
<<set _response = [
"*kneels* Yes, master. My body is always ready for you.",
"*bows head* I exist to serve your desires. Use me as you wish.",
"*devotedly* Of course, sir. I am yours to command."
].random()>>
<<case "desperate">>
<<set _response = [
"*eagerly* Yes! Anything for you, boss! You've done so much for me!",
"*nods quickly* Of course! I'll do anything you want!",
"*grateful* You want me? Really? I won't disappoint you!"
].random()>>
<<case "arrogant">>
<<set _response = [
"*sighs* Fine. I suppose the boss deserves some... special attention.",
"*reluctantly* Very well. But only because you're the one paying me.",
"*smirks* Alright. Consider this a privilege I'm granting you."
].random()>>
<<case "cynical">>
<<set _response = [
"*shrugs* Sure, why not. You're the boss after all.",
"Alright. Part of the job, I guess. Let's get to it.",
"*small smile* Fair enough. At least you're decent about it."
].random()>>
<<default>>
<<set _response = "Yes, of course... Let's go somewhere private.">>
<</switch>>
<<Chat _worker _response>>
/* Increase affection slightly */
<<set _newAffection = Math.min(10, _affection + 1)>>
<<run _worker.saveData.set("affection", _newAffection)>>
/* Check worker gender for available options */
<<set _workerGender = _worker.gender()>>
<<set _hasVagina = _workerGender == "Female">>
<<ChatMessage "Choose what you want to do:">>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn primary"><<button "👄 Oral Sex" "BrothelWorker_SexScene">>
<<set $workerSexType = "Oral">>
<</button>></span>
<<if _hasVagina>>
<span class="brothel-btn secondary"><<button "💕 Vaginal Sex" "BrothelWorker_SexScene">>
<<set $workerSexType = "Vag">>
<</button>></span>
<</if>>
<span class="brothel-btn secondary"><<button "🍑 Anal Sex" "BrothelWorker_SexScene">>
<<set $workerSexType = "Anal">>
<</button>></span>
</div>
<<else>>
/* Refused */
<<switch _personality>>
<<case "shy">>
<<set _response = [
"*steps back nervously* I-I'm sorry... I'm not comfortable with that right now...",
"*looks away* P-please... not now... I need more time...",
"*trembles* I... I can't... please don't be angry..."
].random()>>
<<case "confident">>
<<set _response = [
"I don't think so. Just because you're the boss doesn't mean you own me.",
"*crosses arms* No. I work here, but I have my limits.",
"Not interested right now. Maybe treat me better first."
].random()>>
<<case "flirty">>
<<set _response = [
"*pouts* Sorry sweetie, I'm not in the mood right now...",
"*giggles nervously* Maybe another time? I'm tired today...",
"*winks* Not right now, but keep trying, you might get lucky!"
].random()>>
<<case "submissive">>
<<set _response = [
"*kneels apologetically* F-forgive me... I don't feel ready yet...",
"*head bowed* I'm sorry, master... please give me more time...",
"*trembling* I want to obey, but... please, not yet..."
].random()>>
<<case "arrogant">>
<<set _response = [
"*scoffs* Absolutely not. You haven't earned that privilege.",
"*dismissively* Please. I'm not some cheap commodity.",
"*looks away haughtily* Maybe when you prove you're worth my time."
].random()>>
<<case "cynical">>
<<set _response = [
"*frowns* No. I don't trust you enough for that yet.",
"*shakes head* Nope. Buy me dinner first or something.",
"*sarcastically* Great way to make me uncomfortable. Hard pass."
].random()>>
<<default>>
<<set _response = "I'm sorry, but I'm not comfortable with that right now.">>
<</switch>>
<<Chat _worker _response>>
<<ChatMessage "They refused your advance. Perhaps improving their submission, affection, or fear would help.">>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn neutral"><<button "← Back" "BrothelWorkerDetails">><</button>></span>
</div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _worker = $selectedBrothelWorker>>
<<ShowNpcIcon _worker>>
<<set _workerName = _worker.info.firstName>>
<<set _workerGender = _worker.gender()>>
<<set _playerGender = $player.gender()>>
<<set _msg = "You take " + _workerName + " to a private room...">>
<<ChatMessage _msg>>
<<SpendTimeWithoutUpdate 30>>
/* Set up sex video based on selected type */
<<set _sexType = $workerSexType || "Vag">>
<<switch _sexType>>
<<case "Oral">>
<<SetOralPick _playerGender _workerGender>>
<<ChatMessage "You enjoy oral pleasure...">>
<<case "Vag">>
<<SetVagPick _playerGender _workerGender>>
<<ChatMessage "You enjoy vaginal sex...">>
<<case "Anal">>
<<SetAnalPick _playerGender _workerGender>>
<<ChatMessage "You enjoy anal sex...">>
<</switch>>
<<Video _pick>>
/* Increase horny for male/shemale players */
<<if _playerGender != "Female">>
<<run $player.status.horny.increase(30)>>
<</if>>
/* Decrease energy for player */
<<run $player.status.energy.decrease(10)>>
/* Decrease energy for worker */
<<run _worker.status.energy.decrease(15)>>
<<set _msg = "You spend quality time with " + _workerName + "...">>
<<ChatMessage _msg>>
/* Small chance to increase affection */
<<if Random(1, 100) <= 30>>
<<set _affection = _worker.saveData.get("affection") || 3>>
<<set _newAffection = Math.min(10, _affection + 1)>>
<<run _worker.saveData.set("affection", _newAffection)>>
<<set _msg = _workerName + " seems to enjoy your company. (Affection +1)">>
<<ChatMessage _msg>>
<</if>>
/* Check if player reached max horny */
<<if _playerGender != "Female" && $player.status.horny.value >= $player.status.horny.max>>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn danger"><<button "💦 Cum" "BrothelWorker_CumScene">><</button>></span>
</div>
<<else>>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn secondary"><<button "→ Finish" "BrothelWorkerDetails">><</button>></span>
</div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _worker = $selectedBrothelWorker>>
<<set _workerName = _worker.info.firstName>>
<<set _workerGender = _worker.gender()>>
<<set _playerGender = $player.gender()>>
<<set _personality = _worker.saveData.get("personality") || "default">>
<<ShowNpcIcon _worker>>
<<ChatMessage "You feel yourself reaching the edge...">>
/* Set cumshot video based on the type of sex */
<<set _cumInside = Random(0, 100) > 50>>
<<switch $workerSexType>>
<<case "Oral">>
<<if _cumInside>>
<<SetOralCumInPick _playerGender _workerGender>>
<<set _cumMsg = "You cum in " + _workerName + "'s mouth.">>
<<else>>
<<SetOralCumOutPick _playerGender _workerGender>>
<<set _cumMsg = "You cum all over " + _workerName + "'s face.">>
<</if>>
<<case "Vag">>
<<if _cumInside>>
<<SetVagCumInPick _playerGender _workerGender>>
<<set _cumMsg = "You cum deep inside " + _workerName + ".">>
<<else>>
<<SetVagCumOutPick _playerGender _workerGender>>
<<set _cumMsg = "You pull out and cum all over " + _workerName + ".">>
<</if>>
<<case "Anal">>
<<if _cumInside>>
<<SetAnalCumInPick _playerGender _workerGender>>
<<set _cumMsg = "You cum deep inside " + _workerName + "'s ass.">>
<<else>>
<<SetAnalCumOutPick _playerGender _workerGender>>
<<set _cumMsg = "You pull out and cum all over " + _workerName + "'s ass.">>
<</if>>
<<default>>
<<SetOralCumOutPick _playerGender _workerGender>>
<<set _cumMsg = "You finish all over " + _workerName + ".">>
<</switch>>
<<Video _pick>>
<<ChatMessage _cumMsg>>
/* Personality-based cum reaction */
<<switch _personality>>
<<case "shy">>
<<if _cumInside>>
<<set _cumResponse = [
"*gasps* Oh! I... I can feel it inside me... *blushes deeply*",
"*squeaks* S-so warm... *trembles*",
"*whimpers softly* That felt... intense..."
].random()>>
<<else>>
<<set _cumResponse = [
"*covers face* Oh my... *blushes furiously*",
"*gasps* I'm all messy now... *shy smile*",
"*trembling* That was... a lot..."
].random()>>
<</if>>
<<case "confident">>
<<if _cumInside>>
<<set _cumResponse = [
"*satisfied smile* Mmm, exactly as I expected.",
"Good. That's what a professional delivers.",
"*nods approvingly* Satisfying, wasn't it?"
].random()>>
<<else>>
<<set _cumResponse = [
"*wipes self gracefully* A job well done.",
"*professionally* I trust you're satisfied?",
"*stands with poise* Quality service, as always."
].random()>>
<</if>>
<<case "flirty">>
<<if _cumInside>>
<<set _cumResponse = [
"*moans happily* Mmm, I love it! Do that anytime, boss...",
"*giggles* That felt AMAZING!",
"*purrs* So good... I could get used to this..."
].random()>>
<<else>>
<<set _cumResponse = [
"*giggles and licks lips* Yummy! Can we do this again soon?",
"*playfully* Mmm, you made quite a mess! I love it!",
"*winks while wiping* That was fun! Come back anytime..."
].random()>>
<</if>>
<<case "submissive">>
<<if _cumInside>>
<<set _cumResponse = [
"*kneels gratefully* Thank you for using me, master...",
"*head bowed* I am honored to receive your seed...",
"*devotedly* My body is yours to fill whenever you desire..."
].random()>>
<<else>>
<<set _cumResponse = [
"*kneels in the mess* Thank you, master. I am marked as yours.",
"*doesn't wipe* May I wear your mark proudly, sir?",
"*bows* I am grateful for your attention..."
].random()>>
<</if>>
<<case "desperate">>
<<if _cumInside>>
<<set _cumResponse = [
"*clings to you* Thank you... thank you for wanting me...",
"*emotional* You actually... finished inside... I feel so wanted...",
"*crying happy tears* That was wonderful... thank you..."
].random()>>
<<else>>
<<set _cumResponse = [
"*grateful despite the mess* Thank you for choosing me...",
"*sniffles happily* I'm glad I could satisfy you...",
"*holds you* That meant more than you know..."
].random()>>
<</if>>
<<case "arrogant">>
<<if _cumInside>>
<<set _cumResponse = [
"*smirks* I knew you couldn't resist me.",
"Well, you're welcome for that experience.",
"*satisfied* As expected, I'm irresistible."
].random()>>
<<else>>
<<set _cumResponse = [
"*examines the mess* Quite the tribute you've left.",
"*sighs dramatically* I suppose I'll have to clean up now.",
"*inspects nails* Well, that was... adequate."
].random()>>
<</if>>
<<case "cynical">>
<<if _cumInside>>
<<set _cumResponse = [
"*catches breath* Alright, that was... pretty good.",
"*small smile* Not bad, boss. Not bad at all.",
"Well, at least you know what you're doing."
].random()>>
<<else>>
<<set _cumResponse = [
"*wipes self* Job done. Same time tomorrow?",
"*shrugs* Could have been worse. Could have been better.",
"*lights imaginary cigarette* ...That was actually decent."
].random()>>
<</if>>
<<default>>
<<set _cumResponse = "*catches breath* That was... really good.">>
<</switch>>
<<Chat _worker _cumResponse>>
/* Reset horny, decrease potency */
<<run $player.status.horny.decrease(1000)>>
<<run $player.status.potency.decrease(1)>>
<<ChatMessage "You feel satisfied and spent.">>
<<unset $workerSexType>>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn secondary"><<button "→ Finish" "BrothelWorkerDetails">><</button>></span>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _worker = $selectedBrothelWorker>>
<<ShowNpcIcon _worker>>
<<set _workerName = _worker.info.firstName>>
<<set _personality = _worker.saveData.get("personality") || "default">>
<div class="centre-text">Give Money to <<print _workerName>></div>
<<ChatMessage "How much money do you want to give?">>
<div class="btn-container padding-top">
<<set _amounts = [50, 100, 250, 500]>>
<<for _i = 0; _i < _amounts.length; _i++>>
<<set _amount = _amounts[_i]>>
<<capture _amount>>
<<if $player.money >= _amount>>
<<set _btnText = "💰 Give $" + _amount>>
<span class="brothel-btn success"><<button _btnText "BrothelWorker_GiveMoneyConfirm">>
<<set $giftAmount = _amount>>
<</button>></span>
<<else>>
<<set _btnText = "Give $" + _amount + " (Not enough)">>
<span class="brothel-btn disabled"><<button _btnText>><</button>></span>
<</if>>
<</capture>>
<</for>>
</div>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn neutral"><<button "✗ Cancel" "BrothelWorkerDetails">><</button>></span>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _worker = $selectedBrothelWorker>>
<<ShowNpcIcon _worker>>
<<set _workerName = _worker.info.firstName>>
<<set _amount = $giftAmount>>
<<set _personality = _worker.saveData.get("personality") || "default">>
/* Deduct money */
<<set $player.money -= _amount>>
/* Calculate affection gain based on amount */
<<set _affectionGain = Math.floor(_amount / 100) + 1>>
<<set _affection = _worker.saveData.get("affection") || 3>>
<<set _newAffection = Math.min(10, _affection + _affectionGain)>>
<<run _worker.saveData.set("affection", _newAffection)>>
/* Personality-based response */
<<switch _personality>>
<<case "shy">>
<<set _response = [
"*eyes widen* F-for me? *blushes* Thank you so much...!",
"*takes money with trembling hands* Y-you're so kind to me...",
"*tears up slightly* I... I don't know what to say... Thank you!"
].random()>>
<<case "confident">>
<<set _response = [
"*nods approvingly* Generous. I appreciate that you value my work.",
"Thank you. It's nice to see a boss who takes care of their people.",
"*smiles* A thoughtful gesture. You have my respect."
].random()>>
<<case "flirty">>
<<set _response = [
"*squeals* Oh my god, thank you! *hugs you* You're the best boss ever!",
"*giggles* Aww, for me? You're so sweet! *kisses your cheek*",
"*bounces excitedly* This is amazing! Let me thank you properly later..."
].random()>>
<<case "submissive">>
<<set _response = [
"*kneels gratefully* Thank you, master. You are too generous...",
"*head bowed* I am unworthy of such kindness... Thank you, sir.",
"*devotedly* Your generosity moves me, master. I am forever yours."
].random()>>
<<case "desperate">>
<<set _response = [
"*bursts into tears* Oh thank you! Thank you so much! This means everything!",
"*clutches money tightly* You... you're saving me... Thank you!",
"*sobbing with gratitude* I can't believe you'd do this for me...!"
].random()>>
<<case "arrogant">>
<<set _response = [
"*takes money* Hmph. About time you showed some appreciation.",
"*inspects the money* Well, at least you know quality deserves rewards.",
"*slight smile* Finally recognizing my worth. Keep this up."
].random()>>
<<case "cynical">>
<<set _response = [
"*surprised* Huh. That's... actually really nice. Thanks.",
"*small smile* Well, didn't expect that. Maybe you're alright after all.",
"*takes money* No strings attached? ...Thanks. Seriously."
].random()>>
<<default>>
<<set _response = "Thank you so much! This is very generous of you.">>
<</switch>>
<<Chat _worker _response>>
<<set _msg = "You gave $" + _amount + " to " + _workerName + ". (Affection +" + _affectionGain + ")">>
<<ChatMessage _msg>>
<<unset $giftAmount>>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn secondary"><<button "→ Continue" "BrothelWorkerDetails">><</button>></span>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _worker = $selectedBrothelWorker>>
<<ShowNpcIcon _worker>>
<<set _workerName = _worker.info.firstName>>
<<set _workerId = _worker.info.id>>
<<set _personality = _worker.saveData.get("personality") || "default">>
<<set _affection = _worker.saveData.get("affection") || 3>>
/* Mark that player talked to this worker today */
<<if ndef $dailyEvents>><<set $dailyEvents = {}>><</if>>
<<set _talkEventKey = "brothelTalk_" + _workerId>>
<<set $dailyEvents[_talkEventKey] = true>>
<<set _msg = "You spend some time talking with " + _workerName + "...">>
<<ChatMessage _msg>>
<<SpendTimeWithoutUpdate 15>>
/* Personality-based conversation */
<<switch _personality>>
<<case "shy">>
<<set _response = [
"*fidgets nervously* I... I like working here. You've been kind to me...",
"*speaks softly* Thank you for talking to me. Most people just... want other things.",
"*small smile* It's nice that you want to talk. Not many bosses do that."
].random()>>
<<case "confident">>
<<set _response = [
"Good to see a boss who connects with their workers. I respect that.",
"This place has potential. Keep running it well and we'll all prosper.",
"I appreciate you taking the time. It shows good management."
].random()>>
<<case "flirty">>
<<set _response = [
"*giggles* I love our little chats! You're so fun to talk to!",
"*playfully* Are you sure you just want to talk? *winks*",
"*smiles warmly* You know, you're actually really nice when you're not being all bossy."
].random()>>
<<case "submissive">>
<<set _response = [
"*gratefully* Thank you for speaking with me, master. I am honored.",
"*head slightly bowed* Your attention means so much to me...",
"*devotedly* I cherish these moments with you, sir."
].random()>>
<<case "desperate">>
<<set _response = [
"*emotional* You actually want to hear about me? That's so kind...",
"*sniffles* Nobody's cared to talk to me in so long... Thank you.",
"*grateful* This means more than you know. Thank you for caring."
].random()>>
<<case "arrogant">>
<<set _response = [
"*shrugs* I suppose it's acceptable that you want to converse with me.",
"*inspects nails* Fine, I'll grace you with my conversation.",
"*slight smile* At least you recognize I'm worth talking to."
].random()>>
<<case "cynical">>
<<set _response = [
"*slightly surprised* You actually want to talk? Huh. That's different.",
"*opens up slightly* Alright. I guess you're not so bad after all.",
"*small smile* You know, you're more human than most bosses I've had."
].random()>>
<<default>>
<<set _response = "Thanks for talking to me. It's nice to have a normal conversation sometimes.">>
<</switch>>
<<Chat _worker _response>>
/* Small chance to increase affection */
<<if Random(1, 100) <= 40>>
<<set _newAffection = Math.min(10, _affection + 1)>>
<<run _worker.saveData.set("affection", _newAffection)>>
<<set _msg = _workerName + " seems to appreciate the conversation. (Affection +1)">>
<<ChatMessage _msg>>
<</if>>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn secondary"><<button "→ Continue" "BrothelWorkerDetails">><</button>></span>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _worker = $selectedBrothelWorker>>
<<set _workerName = _worker.info.firstName>>
<<ShowNpcIcon _worker>>
<div class="centre-text" style="font-size: 20px; color: #e91e63;">💋 <<print _workerName>>'s Skills & Limits</div>
/* Check for Candidate Insight perk */
<<if !$playerBrothel.perks || !$playerBrothel.perks.seeStats>>
<fieldset style="background: rgba(0,0,0,0.4); border: 2px solid #ff9800; margin: 15px 0;">
<legend style="color: #ff9800;">🔒 Locked</legend>
<div style="text-align: center; padding: 30px;">
<div style="font-size: 48px; margin-bottom: 15px;">🔒</div>
<p style="color: #ff9800; font-size: 16px; font-weight: bold;">Candidate Insight Required</p>
<p style="color: #aaa; font-size: 13px; margin-top: 10px;">
Learn the "Candidate Insight" skill from the Skills menu to view worker statistics, skills, and limits.
</p>
<p style="color: #666; font-size: 11px; margin-top: 15px;">
🎯 Skills → Management → Candidate Insight (1 skill point)
</p>
</div>
</fieldset>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn neutral"><<button "← Back" "BrothelWorkerDetails">><</button>></span>
</div>
<<else>>
/* Sex Skills */
<<set _oralSkill = _worker.saveData.get("oralSkill") || 0>>
<<set _analSkill = _worker.saveData.get("analSkill") || 0>>
<<set _vagSkill = _worker.saveData.get("vaginalSkill") || 0>>
<<set _hasSkills = _oralSkill > 0 || _analSkill > 0 || _vagSkill > 0>>
<<if _hasSkills>>
<<set _oralBarStyle = "background: linear-gradient(90deg, #2196f3, #64b5f6); width: " + _oralSkill + "%; height: 100%; border-radius: 4px;">>
<<set _analBarStyle = "background: linear-gradient(90deg, #9c27b0, #ce93d8); width: " + _analSkill + "%; height: 100%; border-radius: 4px;">>
<<set _vagBarStyle = "background: linear-gradient(90deg, #e91e63, #f48fb1); width: " + _vagSkill + "%; height: 100%; border-radius: 4px;">>
<fieldset style="background: linear-gradient(135deg, rgba(233, 30, 99, 0.15) 0%, rgba(33, 33, 33, 0.95) 100%); border: 2px solid #e91e63; margin: 15px 0;">
<legend style="color: #f48fb1; font-size: 16px;">💋 Sex Skills</legend>
<div style="display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 15px; padding: 10px;">
/* Oral */
<div style="background: rgba(0,0,0,0.4); padding: 15px; border-radius: 10px; text-align: center;">
<div style="color: #64b5f6; font-size: 24px; margin-bottom: 5px;">👅</div>
<div style="color: #fff; font-size: 14px; font-weight: bold; margin-bottom: 10px;">Oral</div>
<div style="background: rgba(255,255,255,0.1); height: 10px; border-radius: 5px; overflow: hidden; margin-bottom: 8px;">
<div @style="_oralBarStyle"></div>
</div>
<div style="color: #64b5f6; font-size: 18px; font-weight: bold;"><<print _oralSkill>>%</div>
</div>
/* Vaginal */
<<if _vagSkill > 0>>
<div style="background: rgba(0,0,0,0.4); padding: 15px; border-radius: 10px; text-align: center;">
<div style="color: #f48fb1; font-size: 24px; margin-bottom: 5px;">🌸</div>
<div style="color: #fff; font-size: 14px; font-weight: bold; margin-bottom: 10px;">Vaginal</div>
<div style="background: rgba(255,255,255,0.1); height: 10px; border-radius: 5px; overflow: hidden; margin-bottom: 8px;">
<div @style="_vagBarStyle"></div>
</div>
<div style="color: #f48fb1; font-size: 18px; font-weight: bold;"><<print _vagSkill>>%</div>
</div>
<<else>>
<div style="background: rgba(0,0,0,0.2); padding: 15px; border-radius: 10px; text-align: center; opacity: 0.5;">
<div style="color: #666; font-size: 24px; margin-bottom: 5px;">🌸</div>
<div style="color: #666; font-size: 14px; font-weight: bold; margin-bottom: 10px;">Vaginal</div>
<div style="color: #666; font-size: 18px;">N/A</div>
</div>
<</if>>
/* Anal */
<div style="background: rgba(0,0,0,0.4); padding: 15px; border-radius: 10px; text-align: center;">
<div style="color: #ce93d8; font-size: 24px; margin-bottom: 5px;">🍑</div>
<div style="color: #fff; font-size: 14px; font-weight: bold; margin-bottom: 10px;">Anal</div>
<div style="background: rgba(255,255,255,0.1); height: 10px; border-radius: 5px; overflow: hidden; margin-bottom: 8px;">
<div @style="_analBarStyle"></div>
</div>
<div style="color: #ce93d8; font-size: 18px; font-weight: bold;"><<print _analSkill>>%</div>
</div>
</div>
/* Income bonus */
<<set _avgSkill = Math.floor((_oralSkill + _analSkill + (_vagSkill || 0)) / (_vagSkill > 0 ? 3 : 2))>>
<div style="margin: 10px; padding: 12px; background: rgba(255,215,0,0.15); border-radius: 10px; border: 1px solid rgba(255,215,0,0.4);">
<div style="display: flex; justify-content: space-between; align-items: center;">
<span style="color: #ffd700; font-size: 14px;">💰 Daily Income Bonus from Skills:</span>
<span style="color: #ffd700; font-size: 18px; font-weight: bold;">+$<<print Math.floor(_avgSkill / 5)>></span>
</div>
</div>
</fieldset>
<<else>>
<fieldset style="background: rgba(0,0,0,0.3); border: 1px solid #666; margin: 15px 0;">
<legend style="color: #888;">💋 Sex Skills</legend>
<div style="text-align: center; padding: 20px; color: #666;">
<p>No skill data available for this worker.</p>
<p style="font-size: 11px;">(Workers hired before the skill system was implemented don't have recorded skills)</p>
</div>
</fieldset>
<</if>>
/* Service Limits */
<<set _workerLimits = _worker.saveData.get("limits")>>
<<set _hasVagina = _worker.body.vaginaSize.value > 0>>
<<if _workerLimits>>
<fieldset style="background: linear-gradient(135deg, rgba(156, 39, 176, 0.15) 0%, rgba(33, 33, 33, 0.95) 100%); border: 2px solid #9c27b0; margin: 15px 0;">
<legend style="color: #ce93d8; font-size: 16px;">🚫 Service Limits</legend>
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px; padding: 10px;">
/* Oral */
<div style="background: rgba(0,0,0,0.3); padding: 12px; border-radius: 8px; border-left: 4px solid <<if _workerLimits.oral && _workerLimits.oral.status == 'yes'>>#4caf50<<elseif _workerLimits.oral && _workerLimits.oral.status == 'reluctant'>>#ff9800<<else>>#f44336<</if>>;">
<div style="display: flex; justify-content: space-between; align-items: center;">
<span style="color: #fff; font-size: 14px;">👅 Oral</span>
<<if _workerLimits.oral>>
<<if _workerLimits.oral.status == "yes">>
<span style="color: #4caf50; font-size: 14px; font-weight: bold;">✓ Yes</span>
<<elseif _workerLimits.oral.status == "reluctant">>
<span style="color: #ff9800; font-size: 14px; font-weight: bold;">~ Reluctant</span>
<<else>>
<span style="color: #f44336; font-size: 14px; font-weight: bold;">✗ No</span>
<</if>>
<</if>>
</div>
<<if _workerLimits.oral && _workerLimits.oral.reason>>
<div style="color: #888; font-size: 11px; margin-top: 5px;">(<<print _workerLimits.oral.reason>>)</div>
<</if>>
</div>
/* Vaginal */
<div style="background: rgba(0,0,0,0.3); padding: 12px; border-radius: 8px; border-left: 4px solid <<if !_hasVagina>>#666<<elseif _workerLimits.vaginal && _workerLimits.vaginal.status == 'yes'>>#4caf50<<elseif _workerLimits.vaginal && _workerLimits.vaginal.status == 'maybe'>>#ff9800<<else>>#f44336<</if>>;">
<div style="display: flex; justify-content: space-between; align-items: center;">
<span style="color: #fff; font-size: 14px;">🌸 Vaginal</span>
<<if !_hasVagina>>
<span style="color: #666; font-size: 14px;">- N/A</span>
<<elseif _workerLimits.vaginal>>
<<if _workerLimits.vaginal.status == "yes">>
<span style="color: #4caf50; font-size: 14px; font-weight: bold;">✓ Yes</span>
<<elseif _workerLimits.vaginal.status == "maybe">>
<span style="color: #ff9800; font-size: 14px; font-weight: bold;">~ Maybe</span>
<<else>>
<span style="color: #f44336; font-size: 14px; font-weight: bold;">✗ No</span>
<</if>>
<</if>>
</div>
<<if _hasVagina && _workerLimits.vaginal && _workerLimits.vaginal.reason>>
<div style="color: #888; font-size: 11px; margin-top: 5px;">(<<print _workerLimits.vaginal.reason>>)</div>
<</if>>
</div>
/* Anal */
<div style="background: rgba(0,0,0,0.3); padding: 12px; border-radius: 8px; border-left: 4px solid <<if _workerLimits.anal && _workerLimits.anal.status == 'yes'>>#4caf50<<elseif _workerLimits.anal && _workerLimits.anal.status == 'maybe'>>#ff9800<<else>>#f44336<</if>>;">
<div style="display: flex; justify-content: space-between; align-items: center;">
<span style="color: #fff; font-size: 14px;">🍑 Anal</span>
<<if _workerLimits.anal>>
<<if _workerLimits.anal.status == "yes">>
<span style="color: #4caf50; font-size: 14px; font-weight: bold;">✓ Yes</span>
<<elseif _workerLimits.anal.status == "maybe">>
<span style="color: #ff9800; font-size: 14px; font-weight: bold;">~ Maybe</span>
<<else>>
<span style="color: #f44336; font-size: 14px; font-weight: bold;">✗ No</span>
<</if>>
<</if>>
</div>
<<if _workerLimits.anal && _workerLimits.anal.reason>>
<div style="color: #888; font-size: 11px; margin-top: 5px;">(<<print _workerLimits.anal.reason>>)</div>
<</if>>
</div>
/* Creampie */
<div style="background: rgba(0,0,0,0.3); padding: 12px; border-radius: 8px; border-left: 4px solid <<if _workerLimits.creampie && _workerLimits.creampie.status == 'yes'>>#4caf50<<elseif _workerLimits.creampie && _workerLimits.creampie.status == 'maybe'>>#ff9800<<else>>#f44336<</if>>;">
<div style="display: flex; justify-content: space-between; align-items: center;">
<span style="color: #fff; font-size: 14px;">💦 Cum Inside</span>
<<if _workerLimits.creampie>>
<<if _workerLimits.creampie.status == "yes">>
<span style="color: #4caf50; font-size: 14px; font-weight: bold;">✓ Yes</span>
<<elseif _workerLimits.creampie.status == "maybe">>
<span style="color: #ff9800; font-size: 14px; font-weight: bold;">~ Maybe</span>
<<else>>
<span style="color: #f44336; font-size: 14px; font-weight: bold;">✗ No</span>
<</if>>
<</if>>
</div>
<<if _workerLimits.creampie && _workerLimits.creampie.reason>>
<div style="color: #888; font-size: 11px; margin-top: 5px;">(<<print _workerLimits.creampie.reason>>)</div>
<</if>>
</div>
/* Anilingus */
<div style="background: rgba(0,0,0,0.3); padding: 12px; border-radius: 8px; border-left: 4px solid <<if _workerLimits.anilingus && _workerLimits.anilingus.status == 'yes'>>#4caf50<<elseif _workerLimits.anilingus && _workerLimits.anilingus.status == 'maybe'>>#ff9800<<else>>#f44336<</if>>;">
<div style="display: flex; justify-content: space-between; align-items: center;">
<span style="color: #fff; font-size: 14px;">👅🍑 Anilingus</span>
<<if _workerLimits.anilingus>>
<<if _workerLimits.anilingus.status == "yes">>
<span style="color: #4caf50; font-size: 14px; font-weight: bold;">✓ Yes</span>
<<elseif _workerLimits.anilingus.status == "maybe">>
<span style="color: #ff9800; font-size: 14px; font-weight: bold;">~ Maybe</span>
<<else>>
<span style="color: #f44336; font-size: 14px; font-weight: bold;">✗ No</span>
<</if>>
<</if>>
</div>
<<if _workerLimits.anilingus && _workerLimits.anilingus.reason>>
<div style="color: #888; font-size: 11px; margin-top: 5px;">(<<print _workerLimits.anilingus.reason>>)</div>
<</if>>
</div>
/* Cunnilingus */
<div style="background: rgba(0,0,0,0.3); padding: 12px; border-radius: 8px; border-left: 4px solid <<if !_hasVagina>>#666<<elseif _workerLimits.cunnilingus && _workerLimits.cunnilingus.status == 'yes'>>#4caf50<<elseif _workerLimits.cunnilingus && _workerLimits.cunnilingus.status == 'maybe'>>#ff9800<<else>>#f44336<</if>>;">
<div style="display: flex; justify-content: space-between; align-items: center;">
<span style="color: #fff; font-size: 14px;">👅🌸 Cunnilingus</span>
<<if !_hasVagina>>
<span style="color: #666; font-size: 14px;">- N/A</span>
<<elseif _workerLimits.cunnilingus>>
<<if _workerLimits.cunnilingus.status == "yes">>
<span style="color: #4caf50; font-size: 14px; font-weight: bold;">✓ Yes</span>
<<elseif _workerLimits.cunnilingus.status == "maybe">>
<span style="color: #ff9800; font-size: 14px; font-weight: bold;">~ Maybe</span>
<<else>>
<span style="color: #f44336; font-size: 14px; font-weight: bold;">✗ No</span>
<</if>>
<</if>>
</div>
<<if _hasVagina && _workerLimits.cunnilingus && _workerLimits.cunnilingus.reason>>
<div style="color: #888; font-size: 11px; margin-top: 5px;">(<<print _workerLimits.cunnilingus.reason>>)</div>
<</if>>
</div>
/* Golden Shower - full width */
<div style="background: rgba(0,0,0,0.3); padding: 12px; border-radius: 8px; border-left: 4px solid <<if _workerLimits.goldenShower && _workerLimits.goldenShower.status == 'yes'>>#4caf50<<elseif _workerLimits.goldenShower && _workerLimits.goldenShower.status == 'maybe'>>#ff9800<<else>>#f44336<</if>>; grid-column: span 2;">
<div style="display: flex; justify-content: space-between; align-items: center;">
<span style="color: #fff; font-size: 14px;">🚿 Golden Shower</span>
<<if _workerLimits.goldenShower>>
<<if _workerLimits.goldenShower.status == "yes">>
<span style="color: #4caf50; font-size: 14px; font-weight: bold;">✓ Yes</span>
<<elseif _workerLimits.goldenShower.status == "maybe">>
<span style="color: #ff9800; font-size: 14px; font-weight: bold;">~ Maybe</span>
<<else>>
<span style="color: #f44336; font-size: 14px; font-weight: bold;">✗ No</span>
<</if>>
<</if>>
</div>
<<if _workerLimits.goldenShower && _workerLimits.goldenShower.reason>>
<div style="color: #888; font-size: 11px; margin-top: 5px;">(<<print _workerLimits.goldenShower.reason>>)</div>
<</if>>
</div>
</div>
/* Income impact */
<<set _permissiveCount = 0>>
<<if _workerLimits.anal && _workerLimits.anal.status == "yes">><<set _permissiveCount++>><</if>>
<<if _workerLimits.creampie && _workerLimits.creampie.status == "yes">><<set _permissiveCount++>><</if>>
<<if _workerLimits.goldenShower && _workerLimits.goldenShower.status == "yes">><<set _permissiveCount++>><</if>>
<<if _workerLimits.anilingus && _workerLimits.anilingus.status == "yes">><<set _permissiveCount++>><</if>>
<div style="margin: 10px; padding: 12px; background: rgba(255,215,0,0.15); border-radius: 10px; border: 1px solid rgba(255,215,0,0.4);">
<div style="display: flex; justify-content: space-between; align-items: center;">
<span style="color: #ffd700; font-size: 14px;">💰 Income Impact:</span>
<<if _permissiveCount >= 3>>
<span style="color: #4caf50; font-size: 14px; font-weight: bold;">+++ Very High</span>
<<elseif _permissiveCount >= 2>>
<span style="color: #8bc34a; font-size: 14px; font-weight: bold;">++ High</span>
<<elseif _permissiveCount >= 1>>
<span style="color: #ff9800; font-size: 14px; font-weight: bold;">+ Moderate</span>
<<else>>
<span style="color: #f44336; font-size: 14px; font-weight: bold;">Low</span>
<</if>>
</div>
</div>
</fieldset>
<<else>>
<fieldset style="background: rgba(0,0,0,0.3); border: 1px solid #666; margin: 15px 0;">
<legend style="color: #888;">🚫 Service Limits</legend>
<div style="text-align: center; padding: 20px; color: #666;">
<p>No limit data available for this worker.</p>
<p style="font-size: 11px;">(Workers hired before the limit system was implemented don't have recorded limits)</p>
</div>
</fieldset>
<</if>>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn neutral"><<button "← Back" "BrothelWorkerDetails">><</button>></span>
</div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _worker = $selectedBrothelWorker>>
<<set _workerName = _worker.info.firstName>>
<<set _workerGender = _worker.gender()>>
<div class="centre-text" style="font-size: 20px; color: #e91e63;">👀 <<print _workerName>>'s Body</div>
<<ChatMessage "You take a closer look at your worker's body...">>
<fieldset style="background: linear-gradient(135deg, rgba(233, 30, 99, 0.15) 0%, rgba(33, 33, 33, 0.95) 100%); border: 1px solid #e91e63; margin: 15px 0;">
<legend style="color: #f48fb1;">Body Photos</legend>
<div style="display: grid; grid-template-columns: repeat(3, 1fr); gap: 15px; padding: 15px; text-align: center;">
/* Breasts */
<div style="background: rgba(0,0,0,0.3); border-radius: 10px; padding: 15px;">
<div style="color: #fff; font-size: 14px; margin-bottom: 10px;">🍈 Breasts</div>
<div style="color: #aaa; font-size: 12px; margin-bottom: 10px;"><<print _worker.getBreastText()>></div>
<span class="brothel-btn primary small"><<button "View">>
<<script>>
Dialog.create(SugarCube.State.variables.selectedBrothelWorker.getBreastText());
Dialog.wiki(SugarCube.State.variables.selectedBrothelWorker.getBreastImage());
Dialog.open();
<</script>>
<</button>></span>
</div>
/* Butt */
<div style="background: rgba(0,0,0,0.3); border-radius: 10px; padding: 15px;">
<div style="color: #fff; font-size: 14px; margin-bottom: 10px;">🍑 Butt</div>
<div style="color: #aaa; font-size: 12px; margin-bottom: 10px;"><<print _worker.getButtText()>></div>
<span class="brothel-btn secondary small"><<button "View">>
<<script>>
Dialog.create(SugarCube.State.variables.selectedBrothelWorker.getButtText());
Dialog.wiki(SugarCube.State.variables.selectedBrothelWorker.getAssImage());
Dialog.open();
<</script>>
<</button>></span>
</div>
/* Genitals */
<div style="background: rgba(0,0,0,0.3); border-radius: 10px; padding: 15px;">
<div style="color: #fff; font-size: 14px; margin-bottom: 10px;">🔞 Genitals</div>
<<if _workerGender == "Female">>
<div style="color: #aaa; font-size: 12px; margin-bottom: 10px;">Vagina</div>
<span class="brothel-btn secondary small"><<button "View">>
<<script>>
var worker = SugarCube.State.variables.selectedBrothelWorker;
Dialog.create("Vagina");
var skin = worker.info.skin;
var skinCapitalized = skin.charAt(0).toUpperCase() + skin.slice(1);
var img = '<img class="chat-image" style="width: 100%; max-width: 400px; aspect-ratio: 4 / 3; object-fit: cover;" src="Media/Characters/' + skinCapitalized + '/Vag/0.jpg" alt="Vagina">';
Dialog.wiki(img);
Dialog.open();
<</script>>
<</button>></span>
<<elseif _workerGender == "Male">>
<div style="color: #aaa; font-size: 12px; margin-bottom: 10px;">Penis</div>
<span class="brothel-btn disabled small" title="Photos of male genitals are not available"><<button "View (N/A)">><</button>></span>
<<else>>
<div style="color: #aaa; font-size: 12px; margin-bottom: 10px;">Penis (Shemale)</div>
<span class="brothel-btn disabled small" title="Photos of male genitals are not available"><<button "View (N/A)">><</button>></span>
<</if>>
</div>
</div>
</fieldset>
/* Body stats */
<fieldset style="background: rgba(0,0,0,0.3); border: 1px solid #888; margin: 10px 0;">
<legend style="color: #aaa;">Body Stats</legend>
<div style="display: grid; grid-template-columns: repeat(2, 1fr); gap: 10px; padding: 10px;">
<div style="font-size: 12px; color: #aaa;">🍈 Breast Size: <span style="color: #fff;"><<print _worker.body.breastSize.value>>/5</span></div>
<div style="font-size: 12px; color: #aaa;">🍑 Butt Size: <span style="color: #fff;"><<print _worker.body.buttSize.value>>/5</span></div>
<<if _workerGender == "Female">>
<div style="font-size: 12px; color: #aaa;">💕 Vagina Size: <span style="color: #fff;"><<print _worker.body.vaginaSize.value>></span></div>
<<else>>
<div style="font-size: 12px; color: #aaa;">🍆 Penis Size: <span style="color: #fff;"><<print _worker.body.penisSize.value>></span></div>
<</if>>
<div style="font-size: 12px; color: #aaa;">🍩 Anus Size: <span style="color: #fff;"><<print _worker.body.anusSize.value>></span></div>
</div>
</fieldset>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn neutral"><<button "← Back" "BrothelWorkerDetails">><</button>></span>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _worker = $selectedBrothelWorker>>
<<ShowNpcIcon _worker>>
<<set _workerName = _worker.info.firstName>>
<<set _currentSize = Math.floor(_worker.body.breastSize.value)>>
<<set _maxSize = 5>>
<div class="centre-text" style="font-size: 20px; color: #e91e63;">🍈 Breast Enhancement</div>
<<set _msg = "You consider surgical breast enhancement for " + _workerName + "...">>
<<ChatMessage _msg>>
<fieldset style="background: linear-gradient(135deg, rgba(233, 30, 99, 0.15) 0%, rgba(33, 33, 33, 0.95) 100%); border: 1px solid #e91e63; margin: 15px 0;">
<legend style="color: #f48fb1;">Current Status</legend>
<div style="text-align: center; padding: 15px;">
<div style="color: #fff; font-size: 16px; margin-bottom: 10px;">Current Breast Size: <span style="color: #e91e63; font-weight: bold;"><<print _currentSize>>/<<print _maxSize>></span></div>
<div style="color: #aaa; font-size: 12px;"><<print _worker.getBreastText()>></div>
</div>
</fieldset>
<<if _currentSize >= _maxSize>>
<<ChatMessage "This worker's breasts are already at maximum size. No further enhancement is possible.">>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn neutral"><<button "← Back" "BrothelWorkerDetails">><</button>></span>
</div>
<<else>>
/* Surgery costs increase with each level, reduced by Medical Connections perk */
<<set _baseCost = 200>>
<<set _fullCost = _baseCost * (_currentSize + 1)>>
<<set _hasSurgeryDiscount = $playerBrothel.perks && $playerBrothel.perks.surgeryDiscount>>
<<set _surgeryCost = _hasSurgeryDiscount ? Math.floor(_fullCost * 0.5) : _fullCost>>
<fieldset class="brothel-fieldset">
<legend>💉 Enhancement Options</legend>
<p style="color: #aaa; font-size: 12px;">Each surgery increases breast size by 1 level.</p>
<<if _hasSurgeryDiscount>>
<p style="color: #fff; font-size: 14px;">Cost: <span style="color: #4CAF50;">$<<print _surgeryCost>></span> <span style="color: #888; text-decoration: line-through;">$<<print _fullCost>></span> <span style="color: #ffd700; font-size: 11px;">(Medical Connections)</span></p>
<<else>>
<p style="color: #fff; font-size: 14px;">Cost: <span style="color: #4CAF50;">$<<print _surgeryCost>></span></p>
<</if>>
<p style="color: #aaa; font-size: 11px;">Next size: <<print _currentSize + 1>>/<<print _maxSize>></p>
<div class="brothel-btn-container" style="margin-top: 15px;">
<<if $player.money >= _surgeryCost>>
<<set _confirmBtnText = "💉 Perform Surgery ($" + _surgeryCost + ")">>
<span class="brothel-btn success"><<button _confirmBtnText "BrothelWorker_Surgery_Breasts_Confirm">>
<<set $surgeryCost = _surgeryCost>>
<</button>></span>
<<else>>
<<set _noMoneyText = "Not enough money ($" + _surgeryCost + ")">>
<span class="brothel-btn disabled"><<button _noMoneyText>><</button>></span>
<</if>>
<span class="brothel-btn neutral"><<button "← Back" "BrothelWorkerDetails">><</button>></span>
</div>
</fieldset>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _worker = $selectedBrothelWorker>>
<<ShowNpcIcon _worker>>
<<set _workerName = _worker.info.firstName>>
<<set _cost = $surgeryCost>>
/* Deduct money */
<<set $player.money -= _cost>>
/* Increase breast size */
<<set _oldSize = Math.floor(_worker.body.breastSize.value)>>
<<run _worker.body.breastSize.increase(1)>>
<<set _newSize = Math.floor(_worker.body.breastSize.value)>>
/* Spend time */
<<SpendTimeWithoutUpdate 60>>
<div class="centre-text" style="font-size: 20px; color: #4CAF50;">✓ Surgery Complete!</div>
<<set _msg = _workerName + "'s breast enhancement surgery was successful!">>
<<ChatMessage _msg>>
<fieldset style="background: linear-gradient(135deg, rgba(76, 175, 80, 0.15) 0%, rgba(33, 33, 33, 0.95) 100%); border: 1px solid #4CAF50; margin: 15px 0;">
<legend style="color: #81c784;">Results</legend>
<div style="text-align: center; padding: 15px;">
<div style="color: #aaa; font-size: 14px;">Breast Size:</div>
<div style="color: #fff; font-size: 18px; margin: 10px 0;">
<span style="color: #888;"><<print _oldSize>></span>
<span style="color: #4CAF50;">→</span>
<span style="color: #e91e63; font-weight: bold;"><<print _newSize>></span>
</div>
<div style="color: #aaa; font-size: 12px;"><<print _worker.getBreastText()>></div>
<div style="color: #ff9800; font-size: 12px; margin-top: 10px;">-$<<print _cost>></div>
</div>
</fieldset>
<<unset $surgeryCost>>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn secondary"><<button "→ Continue" "BrothelWorkerDetails">><</button>></span>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _worker = $selectedBrothelWorker>>
<<ShowNpcIcon _worker>>
<<set _workerName = _worker.info.firstName>>
<<set _currentSize = Math.floor(_worker.body.buttSize.value)>>
<<set _maxSize = 5>>
<div class="centre-text" style="font-size: 20px; color: #e91e63;">🍑 Butt Enhancement</div>
<<set _msg = "You consider surgical butt enhancement for " + _workerName + "...">>
<<ChatMessage _msg>>
<fieldset style="background: linear-gradient(135deg, rgba(233, 30, 99, 0.15) 0%, rgba(33, 33, 33, 0.95) 100%); border: 1px solid #e91e63; margin: 15px 0;">
<legend style="color: #f48fb1;">Current Status</legend>
<div style="text-align: center; padding: 15px;">
<div style="color: #fff; font-size: 16px; margin-bottom: 10px;">Current Butt Size: <span style="color: #e91e63; font-weight: bold;"><<print _currentSize>>/<<print _maxSize>></span></div>
<div style="color: #aaa; font-size: 12px;"><<print _worker.getButtText()>></div>
</div>
</fieldset>
<<if _currentSize >= _maxSize>>
<<ChatMessage "This worker's butt is already at maximum size. No further enhancement is possible.">>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn neutral"><<button "← Back" "BrothelWorkerDetails">><</button>></span>
</div>
<<else>>
/* Surgery costs increase with each level, reduced by Medical Connections perk */
<<set _baseCost = 200>>
<<set _fullCost = _baseCost * (_currentSize + 1)>>
<<set _hasSurgeryDiscount = $playerBrothel.perks && $playerBrothel.perks.surgeryDiscount>>
<<set _surgeryCost = _hasSurgeryDiscount ? Math.floor(_fullCost * 0.5) : _fullCost>>
<fieldset class="brothel-fieldset">
<legend>💉 Enhancement Options</legend>
<p style="color: #aaa; font-size: 12px;">Each surgery increases butt size by 1 level.</p>
<<if _hasSurgeryDiscount>>
<p style="color: #fff; font-size: 14px;">Cost: <span style="color: #4CAF50;">$<<print _surgeryCost>></span> <span style="color: #888; text-decoration: line-through;">$<<print _fullCost>></span> <span style="color: #ffd700; font-size: 11px;">(Medical Connections)</span></p>
<<else>>
<p style="color: #fff; font-size: 14px;">Cost: <span style="color: #4CAF50;">$<<print _surgeryCost>></span></p>
<</if>>
<p style="color: #aaa; font-size: 11px;">Next size: <<print _currentSize + 1>>/<<print _maxSize>></p>
<div class="brothel-btn-container" style="margin-top: 15px;">
<<if $player.money >= _surgeryCost>>
<<set _confirmBtnText = "💉 Perform Surgery ($" + _surgeryCost + ")">>
<span class="brothel-btn success"><<button _confirmBtnText "BrothelWorker_Surgery_Butt_Confirm">>
<<set $surgeryCost = _surgeryCost>>
<</button>></span>
<<else>>
<<set _noMoneyText = "Not enough money ($" + _surgeryCost + ")">>
<span class="brothel-btn disabled"><<button _noMoneyText>><</button>></span>
<</if>>
<span class="brothel-btn neutral"><<button "← Back" "BrothelWorkerDetails">><</button>></span>
</div>
</fieldset>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _worker = $selectedBrothelWorker>>
<<ShowNpcIcon _worker>>
<<set _workerName = _worker.info.firstName>>
<<set _cost = $surgeryCost>>
/* Deduct money */
<<set $player.money -= _cost>>
/* Increase butt size */
<<set _oldSize = Math.floor(_worker.body.buttSize.value)>>
<<run _worker.body.buttSize.increase(1)>>
<<set _newSize = Math.floor(_worker.body.buttSize.value)>>
/* Spend time */
<<SpendTimeWithoutUpdate 60>>
<div class="centre-text" style="font-size: 20px; color: #4CAF50;">✓ Surgery Complete!</div>
<<set _msg = _workerName + "'s butt enhancement surgery was successful!">>
<<ChatMessage _msg>>
<fieldset style="background: linear-gradient(135deg, rgba(76, 175, 80, 0.15) 0%, rgba(33, 33, 33, 0.95) 100%); border: 1px solid #4CAF50; margin: 15px 0;">
<legend style="color: #81c784;">Results</legend>
<div style="text-align: center; padding: 15px;">
<div style="color: #aaa; font-size: 14px;">Butt Size:</div>
<div style="color: #fff; font-size: 18px; margin: 10px 0;">
<span style="color: #888;"><<print _oldSize>></span>
<span style="color: #4CAF50;">→</span>
<span style="color: #e91e63; font-weight: bold;"><<print _newSize>></span>
</div>
<div style="color: #aaa; font-size: 12px;"><<print _worker.getButtText()>></div>
<div style="color: #ff9800; font-size: 12px; margin-top: 10px;">-$<<print _cost>></div>
</div>
</fieldset>
<<unset $surgeryCost>>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn secondary"><<button "→ Continue" "BrothelWorkerDetails">><</button>></span>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _worker = $selectedBrothelWorker>>
<<ShowNpcIcon _worker>>
<<set _workerName = _worker.info.firstName>>
<<set _corruption = _worker.attributes.corruption.value>>
<<set _submission = _worker.saveData.get("submission") || 3>>
<<set _affection = _worker.saveData.get("affection") || 3>>
<<set _fear = _worker.saveData.get("fear") || 1>>
<<set _personality = _worker.saveData.get("personality") || "default">>
/* Calculate acceptance chance - higher for employed workers who trust you */
<<set _acceptChance = (_corruption * 4) + (_submission * 8) + (_affection * 5) + (_fear * 3)>>
/* Max 85% chance for hired workers */
<<set _acceptChance = Math.min(85, _acceptChance)>>
<<set _msg = "You approach " + _workerName + " about undergoing a feminization procedure. You explain that it could make them more valuable and desirable to clients...">>
<<ChatMessage _msg>>
<<set _roll = Random(1, 100)>>
<<if _roll <= _acceptChance>>
/* Accepted */
<<switch _personality>>
<<case "shy">>
<<set _acceptResponse = "*looks down, blushing* I... I've thought about it before... If you think it would help the business, and you... *quietly* I trust you.">>
<<case "confident">>
<<set _acceptResponse = "An upgrade, you say? I'm always willing to improve myself. If this is what the market demands, I'll adapt.">>
<<case "flirty">>
<<set _acceptResponse = "*giggles* Become even prettier? And maybe get to keep my fun parts? That sounds exciting, boss~">>
<<case "desperate">>
<<set _acceptResponse = "If it means you'll keep me around and I'll earn more, yes! I'll do whatever you want!">>
<<case "arrogant">>
<<set _acceptResponse = "*sighs* If you believe this will make me more profitable, fine. I'll still be better than everyone else.">>
<<case "submissive">>
<<set _acceptResponse = "*kneeling* If my master wishes to reshape me, I will obey without question. My body is yours.">>
<<case "cynical">>
<<set _acceptResponse = "*considers* It's a big step... but I trust you at this point. If you think it's best for business, let's do it.">>
<<default>>
<<set _acceptResponse = "Alright... I've grown to trust you. If you think this is for the best, I'll do it.">>
<</switch>>
<<Chat _worker _acceptResponse>>
<fieldset style="background: rgba(233, 30, 99, 0.15); border: 1px solid #e91e63; margin-top: 15px;">
<legend style="color: #f48fb1;">Choose Transformation Level</legend>
<p style="color: #aaa; font-size: 12px;">Select the level of transformation for <<print _workerName>>:</p>
<p style="color: #aaa; font-size: 11px;">💰 Your money: $<<print $player.money>></p>
<div class="brothel-btn-container" style="flex-direction: column;">
<<if $player.money >= 500>>
<span class="brothel-btn secondary" style="width: 100%;"><<button "🍆➡️🍑 Transform to Shemale ($500)">>
<<set $feminizationLevel = "shemale">>
<<goto "BrothelWorker_Feminization_Confirm">>
<</button>></span>
<<else>>
<span class="brothel-btn disabled" style="width: 100%;"><<button "🍆➡️🍑 Transform to Shemale ($500) - Not enough money">><</button>></span>
<</if>>
<<if $player.money >= 1000>>
<span class="brothel-btn primary" style="width: 100%;"><<button "🍆➡️💕 Transform to Female ($1000)">>
<<set $feminizationLevel = "female">>
<<goto "BrothelWorker_Feminization_Confirm">>
<</button>></span>
<<else>>
<span class="brothel-btn disabled" style="width: 100%;"><<button "🍆➡️💕 Transform to Female ($1000) - Not enough money">><</button>></span>
<</if>>
<span class="brothel-btn neutral" style="width: 100%;"><<button "← Maybe later" "BrothelWorkerDetails">><</button>></span>
</div>
</fieldset>
<<else>>
/* Refused */
<<switch _personality>>
<<case "shy">>
<<set _refuseResponse = "*shakes head, eyes tearing up* I... I'm sorry, I can't... It's too scary for me... Please don't be angry...">>
<<case "confident">>
<<set _refuseResponse = "No. I'm happy with who I am. If my current form isn't enough for you, that's your problem.">>
<<case "flirty">>
<<set _refuseResponse = "*pouts* Aww, but I like my body the way it is! Can't we just... work with what I have?">>
<<case "desperate">>
<<set _refuseResponse = "*tears streaming* I want to please you so badly, but... I just can't do this... Please don't fire me...">>
<<case "arrogant">>
<<set _refuseResponse = "*coldly* Absolutely not. I'm perfect as I am. Find someone else to reshape.">>
<<case "submissive">>
<<set _refuseResponse = "*trembling* I... I want to obey you, master, but... my fear is too great... Forgive me...">>
<<case "cynical">>
<<set _refuseResponse = "That's a permanent change. Even for this job, I'm not willing to go that far.">>
<<default>>
<<set _refuseResponse = "I'm sorry, but I'm not willing to change myself that drastically.">>
<</switch>>
<<Chat _worker _refuseResponse>>
<<ChatMessage "They refused. Higher submission, affection, or corruption might make them more open to the idea.">>
/* Increment feminization attempt counter */
<<set _currentAttempts = _worker.saveData.get("feminizationAttempts") || 0>>
<<run _worker.saveData.set("feminizationAttempts", _currentAttempts + 1)>>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn neutral"><<button "← Back" "BrothelWorkerDetails">><</button>></span>
</div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
/* Feminization costs */
<<set _shemaleCost = 500>>
<<set _femaleCost = 1000>>
<<if $feminizationLevel == "shemale">>
<<set _cost = _shemaleCost>>
<<else>>
<<set _cost = _femaleCost>>
<</if>>
<<if $player.money < _cost>>
<<ChatMessage "You don't have enough money for this procedure!">>
<<set _costMsg = "Cost: $" + _cost + " | Your money: $" + $player.money>>
<<ChatMessage _costMsg>>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn neutral"><<button "← Back" "BrothelWorker_OfferFeminization">><</button>></span>
</div>
<<else>>
/* Deduct cost */
<<set $player.money -= _cost>>
<<ShowNpcIcon $selectedBrothelWorker>>
<<set _workerName = $selectedBrothelWorker.info.firstName>>
<<set _workerId = $selectedBrothelWorker.info.id>>
<<set _personality = $selectedBrothelWorker.saveData.get("personality") || "default">>
<<if $feminizationLevel == "shemale">>
<<set _costMsg = "You pay $" + _shemaleCost + " for the shemale transformation procedure.">>
<<ChatMessage _costMsg>>
<<set _transformMsg = "You arrange for " + _workerName + " to undergo a shemale transformation - adding feminine features while keeping the penis.">>
<<ChatMessage _transformMsg>>
/* Apply transformation - femininity = breastSize + buttSize + face, need > 4 for Shemale */
<<set _newBreast = Random(2, 4)>>
<<set _newButt = Random(2, 3)>>
<<set _newFace = Random(5, 7)>>
/* Find and update character in $Characters array directly */
<<for _i = 0; _i < $Characters.length; _i++>>
<<if $Characters[_i].info.id == _workerId>>
<<set $Characters[_i].info.originGender = "Trans">>
<<set $Characters[_i].body.breastSize.value = _newBreast>>
<<set $Characters[_i].body.buttSize.value = _newButt>>
<<set $Characters[_i].body.face.value = _newFace>>
<<set $Characters[_i].body.vaginaSize.value = 0>>
<<run $Characters[_i].saveData.set("feminized", "shemale")>>
<<run $Characters[_i].saveData.set("feminizedByPlayer", true)>>
/* Update $selectedBrothelWorker reference */
<<set $selectedBrothelWorker = $Characters[_i]>>
<<break>>
<</if>>
<</for>>
<<SpendTimeWithoutUpdate 60>>
<<switch _personality>>
<<case "shy">>
<<set _transformResponse = "*looks at new body in awe* Oh... oh my... I have breasts now... *touches them gently* This feels so strange but... nice?">>
<<case "confident">>
<<set _transformResponse = "*examines new figure* Impressive. These new assets will definitely attract more clients. Good call, boss.">>
<<case "flirty">>
<<set _transformResponse = "*bounces excitedly* Ooh! Look at these babies! *giggles* And I still have my other equipment! Best of both worlds!">>
<<case "desperate">>
<<set _transformResponse = "*grateful tears* Thank you! Thank you for investing in me! I'll work so hard for you now!">>
<<case "arrogant">>
<<set _transformResponse = "*admires reflection* Hmm. As expected, I make a beautiful shemale. Your clients are lucky.">>
<<case "submissive">>
<<set _transformResponse = "*kneeling* Thank you for reshaping me, master. I hope my new body pleases you...">>
<<case "cynical">>
<<set _transformResponse = "*sighs* Well, that's done. I suppose these look good... Could be worse.">>
<<default>>
<<set _transformResponse = "Wow... this is really different. I think I can get used to it though.">>
<</switch>>
<<else>>
<<set _costMsg = "You pay $" + _femaleCost + " for the full female transformation procedure.">>
<<ChatMessage _costMsg>>
<<set _transformMsg = "You arrange for " + _workerName + " to undergo a complete female transformation.">>
<<ChatMessage _transformMsg>>
/* Apply full transformation - add vagina to make Female */
<<set _newBreast = Random(2, 5)>>
<<set _newButt = Random(2, 4)>>
<<set _newVagina = Random(15, 35)>>
<<set _newFace = Random(5, 8)>>
/* Find and update character in $Characters array directly */
<<for _i = 0; _i < $Characters.length; _i++>>
<<if $Characters[_i].info.id == _workerId>>
<<set $Characters[_i].info.originGender = "Female">>
<<set $Characters[_i].body.breastSize.value = _newBreast>>
<<set $Characters[_i].body.buttSize.value = _newButt>>
<<set $Characters[_i].body.vaginaSize.value = _newVagina>>
<<set $Characters[_i].body.penisSize.value = 0>>
<<set $Characters[_i].body.face.value = _newFace>>
<<run $Characters[_i].saveData.set("feminized", "female")>>
<<run $Characters[_i].saveData.set("feminizedByPlayer", true)>>
/* Update $selectedBrothelWorker reference */
<<set $selectedBrothelWorker = $Characters[_i]>>
<<break>>
<</if>>
<</for>>
<<SpendTimeWithoutUpdate 120>>
<<switch _personality>>
<<case "shy">>
<<set _transformResponse = "*gasps at reflection* I'm... I'm really a woman now... *feminine voice trembles* This is so surreal...">>
<<case "confident">>
<<set _transformResponse = "*examines completely new body* Complete transformation. I'll master this new form quickly.">>
<<case "flirty">>
<<set _transformResponse = "*twirls in excitement* Oh my god! I'm a real girl! *giggles in new voice* This is amazing, boss!">>
<<case "desperate">>
<<set _transformResponse = "*crying happy tears* Thank you so much! I'll be the best female worker you've ever had!">>
<<case "arrogant">>
<<set _transformResponse = "*studies new figure with satisfaction* I make a stunning woman. Of course I do.">>
<<case "submissive">>
<<set _transformResponse = "*bowing* You have completely remade me. I am entirely yours in this new form, master.">>
<<case "cynical">>
<<set _transformResponse = "*looks at reflection* This is... quite a change. But I made my choice. Time to adapt.">>
<<default>>
<<set _transformResponse = "I'm... a woman now. Completely. This will take some getting used to.">>
<</switch>>
<</if>>
<<Chat $selectedBrothelWorker _transformResponse>>
<<set _msg = _workerName + " has been successfully transformed! Their new form will be more appealing to your clientele.">>
<<ChatMessage _msg>>
/* Increase affection for trusting you with this */
<<set _currentAffection = $selectedBrothelWorker.saveData.get("affection") || 3>>
<<run $selectedBrothelWorker.saveData.set("affection", Math.min(10, _currentAffection + 1))>>
<<ChatMessage "Their affection has increased for trusting you with such an important decision.">>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn primary"><<button "→ Continue" "BrothelWorkerDetails">><</button>></span>
</div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<div class="centre-text">Buy New Rooms</div>
<div class="centre-text" style="font-size: 14px;">Current rooms: <<print $playerBrothel.rooms>> / <<print $playerBrothel.maxRooms>></div>
<<if $playerBrothel.rooms >= $playerBrothel.maxRooms>>
<<ChatMessage "You have reached the maximum number of rooms (10). No more rooms available for purchase.">>
<<else>>
<<set _nextRoom = $playerBrothel.rooms + 1>>
<<set _roomPrice = _nextRoom * 1000>>
<<set _priceMsg = "Room " + _nextRoom + " costs $" + _roomPrice>>
<<ChatMessage _priceMsg>>
<<set _buyBtnText = "Buy Room ($" + _roomPrice + ")">>
<<set _noBuyBtnText = "Buy Room ($" + _roomPrice + ") - Not enough money">>
<<if $player.money >= _roomPrice>>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn success"><<button _buyBtnText "BrothelBuyRoomConfirm">>
<<set $roomPriceToPay = _roomPrice>>
<</button>></span>
</div>
<<else>>
<div class="brothel-btn-container padding-top"><span class="brothel-btn disabled"><<button _noBuyBtnText>><</button>></span></div>
<</if>>
<</if>>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn neutral"><<button "← Back" "PlayerBrothel_Office">><</button>></span>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set $player.money -= $roomPriceToPay>>
<<set $playerBrothel.rooms += 1>>
<<set _successMsg = "You have purchased a new room! You now have " + $playerBrothel.rooms + " rooms.">>
<<ChatMessage _successMsg>>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn secondary"><<button "→ Continue" "BrothelBuyRooms">><<unset $roomPriceToPay>><</button>></span>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _workerCount = $playerBrothel.prostitutes.length>>
<div class="bw-panel-header">
<span class="bw-panel-header__icon">👩💼</span>
<h2 class="bw-panel-header__title">Your Workers</h2>
<<if _workerCount > 0>><span class="bw-panel-header__count"><<print _workerCount>></span><</if>>
</div>
<<if _workerCount == 0>>
<<ChatMessage "You don't have any workers yet. Go to Casting to hire some!">>
<<else>>
/* Sort controls - persist choice in $brothelWorkerSort */
<<if $brothelWorkerSort == undefined>><<set $brothelWorkerSort = "name">><</if>>
<div class="bw-sort-bar">
<span class="bw-sort-bar__label">Sort by</span>
<<if $brothelWorkerSort == "name">>
<span class="bw-sort-pill is-active">✓ Name</span>
<<else>>
<span class="bw-sort-pill"><<button "Name" "BrothelViewWorkers">><<set $brothelWorkerSort = "name">><</button>></span>
<</if>>
<<if $brothelWorkerSort == "attractiveness">>
<span class="bw-sort-pill is-active">✓ Attractiveness</span>
<<else>>
<span class="bw-sort-pill"><<button "Attractiveness" "BrothelViewWorkers">><<set $brothelWorkerSort = "attractiveness">><</button>></span>
<</if>>
<<if $brothelWorkerSort == "assignment">>
<span class="bw-sort-pill is-active">✓ Assignment</span>
<<else>>
<span class="bw-sort-pill"><<button "Assignment" "BrothelViewWorkers">><<set $brothelWorkerSort = "assignment">><</button>></span>
<</if>>
</div>
/* Build a sorted COPY of worker IDs - never mutate the original array */
<<set _sortedWorkerIds = $playerBrothel.prostitutes.slice()>>
<<run _sortedWorkerIds.sort(function(a, b) {
var chars = State.variables.Characters || [];
var charA = chars.find(function(c) { return c.info.id == a; });
var charB = chars.find(function(c) { return c.info.id == b; });
if (!charA || !charB) return 0;
var mode = State.variables.brothelWorkerSort || "name";
if (mode === "attractiveness") {
return ((charB.body && charB.body.face && charB.body.face.value) || 0) - ((charA.body && charA.body.face && charA.body.face.value) || 0);
}
if (mode === "assignment") {
var asns = (State.variables.playerBrothel && State.variables.playerBrothel.workerAssignments) || {};
var asnA = asns[a] || "work";
var asnB = asns[b] || "work";
return String(asnA).localeCompare(String(asnB));
}
return String((charA.info && charA.info.firstName) || "").localeCompare(String((charB.info && charB.info.firstName) || ""));
})>>
<div class="bw-grid">
<<for _i = 0; _i < _sortedWorkerIds.length; _i++>>
<<set _prostId = _sortedWorkerIds[_i]>>
<<set _prost = $Characters.find(c => c.info.id == _prostId)>>
<<if _prost>>
<<set _prostIcon = _prost.getPhotoImage()>>
<<set _prostName = _prost.info.firstName>>
<<set _prostFace = _prost.body.face.value>>
<<set _prostGender = _prost.gender()>>
/* Worker stats */
<<set _submission = _prost.saveData.has("submission") ? _prost.saveData.get("submission") : 3>>
<<set _affection = _prost.saveData.has("affection") ? _prost.saveData.get("affection") : 3>>
<<set _fear = _prost.saveData.has("fear") ? _prost.saveData.get("fear") : 1>>
<<set _personality = _prost.saveData.get("personality") || "default">>
/* Energy and health */
<<set _energy = _prost.status.energy.value>>
<<set _energyMax = _prost.status.energy.max>>
<<set _health = _prost.status.health.value>>
<<set _healthMax = _prost.status.health.max>>
<<set _energyPercent = Math.round((_energy / _energyMax) * 100)>>
<<set _healthPercent = Math.round((_health / _healthMax) * 100)>>
/* Assignment icon/label/color */
<<set _assignment = $playerBrothel.workerAssignments[_prostId] || "work">>
<<switch _assignment>>
<<case "work">><<set _assignIcon = "💋">><<set _assignLabel = "Working">><<set _assignColor = "#e91e63">>
<<case "spa">><<set _assignIcon = "💆">><<set _assignLabel = "Spa">><<set _assignColor = "#4fc3f7">>
<<case "medical">><<set _assignIcon = "🏥">><<set _assignLabel = "Medical">><<set _assignColor = "#81c784">>
<<case "relaxation">><<set _assignIcon = "🛋️">><<set _assignLabel = "Resting">><<set _assignColor = "#ffb74d">>
<<default>><<set _assignIcon = "💋">><<set _assignLabel = "Working">><<set _assignColor = "#e91e63">>
<</switch>>
/* Personality icon/color */
<<switch _personality>>
<<case "shy">><<set _personalityIcon = "🥺">><<set _personalityColor = "#ff9999">>
<<case "confident">><<set _personalityIcon = "😎">><<set _personalityColor = "#64b5f6">>
<<case "flirty">><<set _personalityIcon = "😘">><<set _personalityColor = "#f48fb1">>
<<case "desperate">><<set _personalityIcon = "😰">><<set _personalityColor = "#ffcc80">>
<<case "arrogant">><<set _personalityIcon = "😤">><<set _personalityColor = "#b39ddb">>
<<case "submissive">><<set _personalityIcon = "🙇">><<set _personalityColor = "#80cbc4">>
<<case "cynical">><<set _personalityIcon = "🙄">><<set _personalityColor = "#b0bec5">>
<<default>><<set _personalityIcon = "❓">><<set _personalityColor = "#888">>
<</switch>>
/* Gender icon */
<<if _prostGender == "Female">>
<<set _genderIcon = "♀">>
<<elseif _prostGender == "Male">>
<<set _genderIcon = "♂">>
<<else>>
<<set _genderIcon = "⚧">>
<</if>>
/* Bar widths */
<<set _faceWidth = _prostFace * 10>>
<<set _submissionWidth = _submission * 10>>
<<set _affectionWidth = _affection * 10>>
<<set _fearWidth = _fear * 10>>
<<set _attractColor = _prostFace >= 7 ? "#4CAF50" : (_prostFace >= 4 ? "#ff9800" : "#f44336")>>
/* Bar fill styles (width is dynamic, must stay inline) */
<<set _healthFillStyle = "background: linear-gradient(90deg, #f44336, #e91e63); width: " + _healthPercent + "%;">>
<<set _energyFillStyle = "background: linear-gradient(90deg, #ff9800, #ffeb3b); width: " + _energyPercent + "%;">>
<<set _faceFillStyle = "background: " + _attractColor + "; width: " + _faceWidth + "%;">>
<<set _submissionFillStyle = "background: #ff9800; width: " + _submissionWidth + "%;">>
<<set _affectionFillStyle = "background: #e91e63; width: " + _affectionWidth + "%;">>
<<set _fearFillStyle = "background: #9c27b0; width: " + _fearWidth + "%;">>
/* Card-level CSS variables drive accent + personality colors */
<<set _cardStyle = "--card-accent: " + _assignColor + ";">>
<<set _personalityStyle = "--pers-color: " + _personalityColor + ";">>
<<set _attractValueStyle = "color: " + _attractColor + ";">>
<<capture _prost _prostId _prostIcon _prostName _prostFace _submission _affection _fear _energy _energyMax _health _healthMax _assignIcon _assignLabel _personality _personalityIcon _genderIcon _attractColor _healthFillStyle _energyFillStyle _faceFillStyle _submissionFillStyle _affectionFillStyle _fearFillStyle _cardStyle _personalityStyle _attractValueStyle>>
<div class="bw-card" @style="_cardStyle">
<div class="bw-card__top-strip"></div>
<div class="bw-card__assign-pill"><<print _assignIcon>> <<print _assignLabel>></div>
<div class="bw-card__avatar-wrap">
<img class="bw-card__avatar" @src='_prostIcon' alt='Avatar'>
<span class="bw-card__gender"><<print _genderIcon>></span>
</div>
<div class="bw-card__name-row">
<span class="bw-card__name"><<print _prostName>></span>
<span class="bw-card__personality" @style="_personalityStyle"><<print _personalityIcon>> <<print _personality>></span>
</div>
<div class="bw-card__vitals">
<div class="bw-card__vital">
<div class="bw-card__vital-head">
<span class="bw-card__vital-head-label">❤️ Health</span>
<span class="bw-card__vital-head-value"><<print _health>>/<<print _healthMax>></span>
</div>
<div class="bw-card__bar-track"><div class="bw-card__bar-fill" @style="_healthFillStyle"></div></div>
</div>
<div class="bw-card__vital">
<div class="bw-card__vital-head">
<span class="bw-card__vital-head-label">⚡ Energy</span>
<span class="bw-card__vital-head-value"><<print _energy>>/<<print _energyMax>></span>
</div>
<div class="bw-card__bar-track"><div class="bw-card__bar-fill" @style="_energyFillStyle"></div></div>
</div>
</div>
<div class="bw-card__divider"></div>
<div class="bw-card__traits-grid">
<div class="bw-card__trait">
<div class="bw-card__trait-head">
<span class="bw-card__trait-head-label">✨ Attract</span>
<span class="bw-card__trait-head-value" @style="_attractValueStyle"><<print Math.floor(_prostFace * 10) / 10>>/10</span>
</div>
<div class="bw-card__trait-bar-track"><div class="bw-card__trait-bar-fill" @style="_faceFillStyle"></div></div>
</div>
<div class="bw-card__trait">
<div class="bw-card__trait-head">
<span class="bw-card__trait-head-label">🎀 Submit</span>
<span class="bw-card__trait-head-value"><<print _submission>>/10</span>
</div>
<div class="bw-card__trait-bar-track"><div class="bw-card__trait-bar-fill" @style="_submissionFillStyle"></div></div>
</div>
<div class="bw-card__trait">
<div class="bw-card__trait-head">
<span class="bw-card__trait-head-label">💕 Affection</span>
<span class="bw-card__trait-head-value"><<print _affection>>/10</span>
</div>
<div class="bw-card__trait-bar-track"><div class="bw-card__trait-bar-fill" @style="_affectionFillStyle"></div></div>
</div>
<div class="bw-card__trait">
<div class="bw-card__trait-head">
<span class="bw-card__trait-head-label">😨 Fear</span>
<span class="bw-card__trait-head-value"><<print _fear>>/10</span>
</div>
<div class="bw-card__trait-bar-track"><div class="bw-card__trait-bar-fill" @style="_fearFillStyle"></div></div>
</div>
</div>
<<if _prostFace < 5>>
<div class="bw-card__attract-warn">⚠️ Low attractiveness - send to Spa!</div>
<</if>>
<div class="bw-card__interact">
<span class="brothel-btn success small"><<button "💬 Interact" "BrothelWorkerDetails">>
<<set $selectedBrothelWorker = _prost>>
<</button>></span>
</div>
</div>
<</capture>>
<</if>>
<</for>>
</div>
<</if>>
<div class="brothel-btn-container padding-top" style="margin-top: 20px;">
<span class="brothel-btn neutral"><<button "← Back" "PlayerBrothel_Office">><</button>></span>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<run (function() {
try {
var refreshBrothelIncome = window.RefreshPlayerBrothelDailyIncome || (typeof globalThis !== "undefined" ? globalThis.RefreshPlayerBrothelDailyIncome : null);
if (typeof refreshBrothelIncome === "function") {
refreshBrothelIncome();
}
} catch (e) {
console.error("Brothel income refresh error:", e);
}
})()>>
<<set _uncollected = Number($playerBrothel.uncollectedEarnings) || 0>>
<<if _uncollected > 0>>
<<set $player.money = Number($player.money) + _uncollected>>
<<set $playerBrothel.uncollectedEarnings = 0>>
<<set $playerBrothel.totalEarnings = 0>>
<<set _msg = "💰 You collected $" + _uncollected + " from your brothel!">>
<<ChatMessage _msg>>
<<if Number($player.money) < 0>>
<<set _warnMsg = "⚠️ Your balance is negative ($" + Number($player.money) + "). Expenses are outpacing income - consider hiring more workers, upgrading rooms, or reducing costs.">>
<<ChatMessage _warnMsg>>
<</if>>
<<else>>
<<ChatMessage "No earnings to collect right now. Workers generate income each day.">>
<</if>>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn neutral"><<button "← Back" "PlayerBrothel_Office">><</button>></span>
</div>
<</nobr>><<nobr>>
<<include "PlayerBrothel_InitCheck">>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/City/RedLightDistrict/Brothel/Spa.jpg">>
<div class="centre-text" style="font-size: 22px; color: #4fc3f7; text-shadow: 0 0 10px rgba(79, 195, 247, 0.5);">💆 Spa Salon</div>
<<ChatMessage "A luxurious spa where workers can restore their beauty and attractiveness. Soft music plays in the background and the air smells of lavender.">>
<fieldset style="background: rgba(79, 195, 247, 0.1); border: 1px solid #4fc3f7; margin: 15px 0;">
<legend style="color: #4fc3f7;">💡 Spa Benefits</legend>
<div style="padding: 10px; font-size: 12px; color: #aaa;">
<p style="margin: 5px 0;">✨ <b style="color: #e91e63;">Restores Attractiveness</b> - Workers regain beauty each day in the spa</p>
<p style="margin: 5px 0;">⚠️ <b style="color: #ff9800;">Important:</b> All workers lose attractiveness daily from working</p>
<p style="margin: 5px 0;">💰 <b style="color: #4CAF50;">Low attractiveness = less income</b> - Keep workers beautiful!</p>
</div>
</fieldset>
/* Count workers in spa */
<<set _spaWorkers = []>>
<<for _i = 0; _i < $playerBrothel.prostitutes.length; _i++>>
<<set _prostId = $playerBrothel.prostitutes[_i]>>
<<set _assignment = $playerBrothel.workerAssignments[_prostId] || "work">>
<<if _assignment == "spa">>
<<set _prost = $Characters.find(c => c.info.id == _prostId)>>
<<if _prost>>
<<run _spaWorkers.push(_prost)>>
<</if>>
<</if>>
<</for>>
<<if _spaWorkers.length == 0>>
<<ChatMessage "No workers are currently assigned to the spa. Assign workers from the View Workers menu.">>
<<else>>
<<set _msg = _spaWorkers.length + " worker(s) are being pampered in the spa:">>
<<ChatMessage _msg>>
<div class="item-shop-container" style="padding-top: 15px; gap: 15px;">
<<for _i = 0; _i < _spaWorkers.length; _i++>>
<<set _worker = _spaWorkers[_i]>>
<<set _workerIcon = _worker.getPhotoImage()>>
<<set _workerName = _worker.info.firstName>>
<<set _attractiveness = Math.floor(_worker.body.face.value * 10) / 10>>
<<set _attractivenessMax = _worker.body.face.max || 10>>
<<set _attractivenessPercent = Math.round((_attractiveness / _attractivenessMax) * 100)>>
<<set _attractivenessBarStyle = "background: linear-gradient(90deg, #e91e63, #f48fb1); width: " + _attractivenessPercent + "%; height: 100%; border-radius: 3px;">>
/* Color based on attractiveness level */
<<if _attractiveness >= 7>>
<<set _attractColor = "#4CAF50">>
<<elseif _attractiveness >= 4>>
<<set _attractColor = "#ff9800">>
<<else>>
<<set _attractColor = "#f44336">>
<</if>>
<<capture _worker _workerIcon _workerName _attractiveness _attractivenessMax _attractivenessPercent _attractivenessBarStyle _attractColor>>
<div style="background: linear-gradient(180deg, rgba(79, 195, 247, 0.2) 0%, rgba(33, 33, 33, 0.9) 100%); border: 1px solid #4fc3f7; border-radius: 10px; padding: 15px; min-width: 200px; text-align: center;">
<img @src='_workerIcon' alt='Avatar' style="width: 60px; height: 60px; border-radius: 50%; border: 2px solid #4fc3f7;">
<h4 style="color: #fff; margin: 8px 0 5px;"><<print _workerName>></h4>
<div style="font-size: 11px;">
<div style="display: flex; justify-content: space-between; color: #aaa;"><span>✨ Attractiveness</span><span style="color: <<print _attractColor>>;"><<print _attractiveness>>/<<print _attractivenessMax>></span></div>
<div style="background: rgba(255,255,255,0.1); height: 6px; border-radius: 3px; margin-top: 3px;">
<div @style="_attractivenessBarStyle"></div>
</div>
</div>
<p style="color: #4fc3f7; font-size: 10px; margin-top: 8px;">💆 Restoring beauty... (+0.5-1.0/day)</p>
</div>
<</capture>>
<</for>>
</div>
<</if>>
<div class="brothel-btn-container padding-top" style="margin-top: 20px;">
<span class="brothel-btn neutral"><<button "← Back to Hall" "PlayerBrothel_Main">><</button>></span>
</div>
<</nobr>><<nobr>>
<<include "PlayerBrothel_InitCheck">>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/City/RedLightDistrict/Brothel/Medical Room.jpg">>
<div class="centre-text" style="font-size: 22px; color: #81c784; text-shadow: 0 0 10px rgba(129, 199, 132, 0.5);">🏥 Medical Room</div>
<<ChatMessage "A clean medical facility for treating workers. The room is sterile and well-equipped.">>
/* Count workers in medical */
<<set _medWorkers = []>>
<<for _i = 0; _i < $playerBrothel.prostitutes.length; _i++>>
<<set _prostId = $playerBrothel.prostitutes[_i]>>
<<set _assignment = $playerBrothel.workerAssignments[_prostId] || "work">>
<<if _assignment == "medical">>
<<set _prost = $Characters.find(c => c.info.id == _prostId)>>
<<if _prost>>
<<run _medWorkers.push(_prost)>>
<</if>>
<</if>>
<</for>>
<<if _medWorkers.length == 0>>
<<ChatMessage "No workers are currently receiving medical treatment. Assign workers from the View Workers menu.">>
<<else>>
<<set _msg = _medWorkers.length + " worker(s) are receiving treatment:">>
<<ChatMessage _msg>>
<div class="item-shop-container" style="padding-top: 15px; gap: 15px;">
<<for _i = 0; _i < _medWorkers.length; _i++>>
<<set _worker = _medWorkers[_i]>>
<<set _workerIcon = _worker.getPhotoImage()>>
<<set _workerName = _worker.info.firstName>>
<<set _health = _worker.status.health.value>>
<<set _healthMax = _worker.status.health.max>>
<<set _healthPercent = Math.round((_health / _healthMax) * 100)>>
<<set _healthBarStyle = "background: linear-gradient(90deg, #f44336, #e91e63); width: " + _healthPercent + "%; height: 100%; border-radius: 3px;">>
<<capture _worker _workerIcon _workerName _health _healthMax _healthPercent _healthBarStyle>>
<div style="background: linear-gradient(180deg, rgba(129, 199, 132, 0.2) 0%, rgba(33, 33, 33, 0.9) 100%); border: 1px solid #81c784; border-radius: 10px; padding: 15px; min-width: 180px; text-align: center;">
<img @src='_workerIcon' alt='Avatar' style="width: 60px; height: 60px; border-radius: 50%; border: 2px solid #81c784;">
<h4 style="color: #fff; margin: 8px 0 5px;"><<print _workerName>></h4>
<div style="font-size: 11px;">
<div style="display: flex; justify-content: space-between; color: #aaa;"><span>❤️ Health</span><span><<print _health>>/<<print _healthMax>></span></div>
<div style="background: rgba(255,255,255,0.1); height: 6px; border-radius: 3px; margin-top: 3px;">
<div @style="_healthBarStyle"></div>
</div>
</div>
<p style="color: #81c784; font-size: 10px; margin-top: 8px;">🏥 Recovering... (+health, cures diseases)</p>
</div>
<</capture>>
<</for>>
</div>
<</if>>
<div class="brothel-btn-container padding-top" style="margin-top: 20px;">
<span class="brothel-btn neutral"><<button "← Back to Hall" "PlayerBrothel_Main">><</button>></span>
</div>
<</nobr>><<nobr>>
<<include "PlayerBrothel_InitCheck">>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/City/RedLightDistrict/Brothel/Relaxation Room.jpg">>
<div class="centre-text" style="font-size: 22px; color: #ffb74d; text-shadow: 0 0 10px rgba(255, 183, 77, 0.5);">🛋️ Relaxation Room</div>
<<ChatMessage "A cozy room with soft couches and dim lighting. Workers can rest here to reduce stress and feel more appreciated.">>
/* Count workers in relaxation */
<<set _restWorkers = []>>
<<for _i = 0; _i < $playerBrothel.prostitutes.length; _i++>>
<<set _prostId = $playerBrothel.prostitutes[_i]>>
<<set _assignment = $playerBrothel.workerAssignments[_prostId] || "work">>
<<if _assignment == "relaxation">>
<<set _prost = $Characters.find(c => c.info.id == _prostId)>>
<<if _prost>>
<<run _restWorkers.push(_prost)>>
<</if>>
<</if>>
<</for>>
<<if _restWorkers.length == 0>>
<<ChatMessage "No workers are currently resting. Assign workers from the View Workers menu.">>
<<else>>
<<set _msg = _restWorkers.length + " worker(s) are resting here:">>
<<ChatMessage _msg>>
<div class="item-shop-container" style="padding-top: 15px; gap: 15px;">
<<for _i = 0; _i < _restWorkers.length; _i++>>
<<set _worker = _restWorkers[_i]>>
<<set _workerIcon = _worker.getPhotoImage()>>
<<set _workerName = _worker.info.firstName>>
<<set _affection = _worker.saveData.get("affection") || 3>>
<<set _affectionWidth = _affection * 10>>
<<set _affectionBarStyle = "background: #e91e63; width: " + _affectionWidth + "%; height: 100%; border-radius: 3px;">>
<<capture _worker _workerIcon _workerName _affection _affectionWidth _affectionBarStyle>>
<div style="background: linear-gradient(180deg, rgba(255, 183, 77, 0.2) 0%, rgba(33, 33, 33, 0.9) 100%); border: 1px solid #ffb74d; border-radius: 10px; padding: 15px; min-width: 180px; text-align: center;">
<img @src='_workerIcon' alt='Avatar' style="width: 60px; height: 60px; border-radius: 50%; border: 2px solid #ffb74d;">
<h4 style="color: #fff; margin: 8px 0 5px;"><<print _workerName>></h4>
<div style="font-size: 11px;">
<div style="display: flex; justify-content: space-between; color: #aaa;"><span>💕 Affection</span><span><<print _affection>>/10</span></div>
<div style="background: rgba(255,255,255,0.1); height: 6px; border-radius: 3px; margin-top: 3px;">
<div @style="_affectionBarStyle"></div>
</div>
</div>
<p style="color: #ffb74d; font-size: 10px; margin-top: 8px;">🛋️ Relaxing... (+affection over time)</p>
</div>
<</capture>>
<</for>>
</div>
<</if>>
<div class="brothel-btn-container padding-top" style="margin-top: 20px;">
<span class="brothel-btn neutral"><<button "← Back to Hall" "PlayerBrothel_Main">><</button>></span>
</div>
<</nobr>><<nobr>>
<<include "PlayerBrothel_InitCheck">>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/City/RedLightDistrict/Brothel/Master Room.jpg">>
/* Check for daily income collection */
<<if $playerBrothel.visitedToday == false>>
<<set $playerBrothel.visitedToday = true>>
<<include "BrothelCalculateDailyIncome">>
<</if>>
<div class="centre-text" style="font-size: 22px; color: #9c27b0; text-shadow: 0 0 10px rgba(156, 39, 176, 0.5);">🛏️ Master Room</div>
<<ChatMessage "Your private bedroom in the brothel. A luxurious space where you can rest and recover.">>
/* Show player stats */
<<set _energyPercent = Math.round(($player.status.energy.value / $player.status.energy.max) * 100)>>
<<set _healthPercent = Math.round(($player.status.health.value / $player.status.health.max) * 100)>>
<<set _potencyPercent = Math.round(($player.status.potency.value / $player.status.potency.max) * 100)>>
<<set _energyBarStyle = "background: linear-gradient(90deg, #ff9800, #ffeb3b); width: " + _energyPercent + "%; height: 100%; border-radius: 6px;">>
<<set _healthBarStyle = "background: linear-gradient(90deg, #f44336, #e91e63); width: " + _healthPercent + "%; height: 100%; border-radius: 6px;">>
<<set _potencyBarStyle = "background: linear-gradient(90deg, #e91e63, #f48fb1); width: " + _potencyPercent + "%; height: 100%; border-radius: 6px;">>
<fieldset style="background: rgba(0,0,0,0.3); border: 1px solid #9c27b0; margin: 15px 0;">
<legend style="color: #ce93d8;">Your Status</legend>
<div style="padding: 10px;">
<div style="font-size: 14px; margin: 10px 0;">
<div style="display: flex; justify-content: space-between; color: #fff;"><span>⚡ Energy</span><span><<print $player.status.energy.value>>/<<print $player.status.energy.max>></span></div>
<div style="background: rgba(255,255,255,0.1); height: 12px; border-radius: 6px; margin-top: 5px;">
<div @style="_energyBarStyle"></div>
</div>
</div>
<div style="font-size: 14px; margin: 10px 0;">
<div style="display: flex; justify-content: space-between; color: #fff;"><span>❤️ Health</span><span><<print $player.status.health.value>>/<<print $player.status.health.max>></span></div>
<div style="background: rgba(255,255,255,0.1); height: 12px; border-radius: 6px; margin-top: 5px;">
<div @style="_healthBarStyle"></div>
</div>
</div>
<div style="font-size: 14px; margin: 10px 0;">
<div style="display: flex; justify-content: space-between; color: #fff;"><span>💪 Sex Stamina</span><span><<print $player.status.potency.value>>/<<print $player.status.potency.max>></span></div>
<div style="background: rgba(255,255,255,0.1); height: 12px; border-radius: 6px; margin-top: 5px;">
<div @style="_potencyBarStyle"></div>
</div>
</div>
</div>
</fieldset>
<fieldset class="brothel-fieldset purple">
<legend>Actions</legend>
<div class="brothel-btn-container">
<span class="brothel-btn info"><<button "😴 Sleep" "BrothelMasterRoom_Sleep">><</button>></span>
/* Accept Client button - requires energy and sex stamina */
<<set _canAcceptClient = $player.status.energy.value >= 20 && $player.status.potency.value >= 1>>
<<if _canAcceptClient>>
<span class="brothel-btn primary"><<button "💋 Accept Client" "BrothelMasterRoom_AcceptClient">><</button>></span>
<<else>>
<span class="brothel-btn disabled" title="Need at least 20 energy and 1 sex stamina"><<button "💋 Accept Client (Too tired)">><</button>></span>
<</if>>
</div>
</fieldset>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn neutral"><<button "← Back to Hall" "PlayerBrothel_Main">><</button>></span>
</div>
<</nobr>><<nobr>>
/* Use the standard Sleep widget which handles time advancement and CharactersRefresh */
<<Sleep "BrothelMasterRoom_Main">>
<</nobr>><<nobr>>
<<include "PlayerBrothel_InitCheck">>
<<include "UpdateAll">>
<<include "CharactersData">>
<<SetBackground "Media/Locations/City/RedLightDistrict/Brothel/Master Room.jpg">>
/* Generate a random client - gender respects player's gender distribution settings */
<<set _clientOriginGender = getWeightedRandomGender()>>
<<if _clientOriginGender == "Male">>
<<set _clientGender = "Male">>
<<set _breastSize = 0>>
<<set _buttSize = Random(0, 1)>>
<<set _faceValue = Random(0, 2)>>
<<set _vaginaSize = 0>>
<<set _penisSize = Random(12, 35)>>
<<elseif _clientOriginGender == "Female">>
<<set _clientGender = "Female">>
<<set _breastSize = Random(2, 5)>>
<<set _buttSize = Random(2, 4)>>
<<set _faceValue = Random(5, 8)>>
<<set _vaginaSize = Random(15, 35)>>
<<set _penisSize = 0>>
<<else>>
/* Trans/Shemale clients */
<<set _clientGender = "Trans">>
<<set _breastSize = Random(2, 4)>>
<<set _buttSize = Random(2, 3)>>
<<set _faceValue = Random(5, 7)>>
<<set _vaginaSize = 0>>
<<set _penisSize = Random(10, 25)>>
<</if>>
/* Create the client character */
<<set _client = CreateCharacter({
isPlayer: false,
characterWork: "Brothel Client",
gender: _clientOriginGender,
sexualPreference: "Bi",
clothesPreference: (_clientGender == "Male" ? "men" : "women"),
age: Random(22, 55),
face: _faceValue,
breastSize: _breastSize,
buttSize: _buttSize,
vaginaSize: _vaginaSize,
penisSize: _penisSize,
throatSize: Random(10, 30),
anusSize: Random(10, 30)
}, true)>>
<<unset $maleNames $femaleNames $surnames>>
/* Assign random sex role to client */
<<set _clientRoleRoll = Random(1, 100)>>
<<if _clientRoleRoll <= 50>>
<<set _client.info.SexRole = "Active">>
<<set _clientRole = "Top">>
<<elseif _clientRoleRoll <= 85>>
<<set _client.info.SexRole = "Versatile">>
<<set _clientRole = "Versatile">>
<<else>>
<<set _client.info.SexRole = "Passive">>
<<set _clientRole = "Bottom">>
<</if>>
/* Calculate payment based on brothel level and client wealth */
<<set _basePayment = 100 + ($playerBrothel.level || 1) * 20>>
<<set _wealthMultiplier = Random(80, 150) / 100>>
<<set _clientPayment = Math.floor(_basePayment * _wealthMultiplier)>>
/* Store client data for the sex scene */
<<set $brothelClient = _client>>
<<set $brothelClientId = _client.info.id>>
<<set $brothelClientPayment = _clientPayment>>
<<set $brothelClientRole = _clientRole>>
<<ShowNpcIcon $brothelClient>>
<div class="centre-text" style="font-size: 22px; color: #e91e63; text-shadow: 0 0 10px rgba(233, 30, 99, 0.5);">💋 Client Arrived</div>
<<set _clientName = $brothelClient.info.firstName>>
<<set _clientGenderText = $brothelClient.gender()>>
<<set _arrivalMsg = "A " + _clientGenderText.toLowerCase() + " client has arrived, looking for your services.">>
<<ChatMessage _arrivalMsg>>
/* Client greeting based on their role preference */
<<if _clientRole == "Top">>
<<set _greetings = [
"I've heard good things about this place. I hope you can handle me.",
"*looks you up and down* Perfect. I've been stressed all week and need to let off some steam.",
"Don't worry, I'll be in charge. Just relax and enjoy.",
"*confident smirk* I know what I want. Let's not waste time."
]>>
<<elseif _clientRole == "Bottom">>
<<set _greetings = [
"*shyly* I... I want you to take control, please.",
"I've been dreaming of being used. Make me yours tonight.",
"*submissively* I'll do whatever you want. Just tell me.",
"Please be gentle... or rough. Whatever you prefer."
]>>
<<else>>
<<set _greetings = [
"I'm flexible. Let's see where the mood takes us.",
"*smiles* I enjoy both giving and receiving. Surprise me.",
"Whatever happens, happens. I'm up for anything.",
"Let's have some fun together, shall we?"
]>>
<</if>>
<<Chat $brothelClient _greetings.random()>>
<fieldset style="background: rgba(233, 30, 99, 0.1); border: 1px solid #e91e63; margin: 15px 0;">
<legend style="color: #f48fb1;">Client Info</legend>
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px; padding: 10px;">
<div style="color: #aaa;">Gender:</div><div style="color: #fff; font-weight: bold;"><<print _clientGenderText>></div>
<div style="color: #aaa;">Preference:</div><div style="color: #e91e63; font-weight: bold;"><<print _clientRole>></div>
<div style="color: #aaa;">Payment:</div><div style="color: #4CAF50; font-weight: bold;">$<<print _clientPayment>></div>
</div>
</fieldset>
<div class="brothel-btn-container" style="margin-top: 15px;">
<span class="brothel-btn primary"><<button "💋 Service Client" "BrothelMasterRoom_ClientSex">><</button>></span>
<span class="brothel-btn danger"><<button "❌ Refuse Client" "BrothelMasterRoom_RefuseClient">><</button>></span>
</div>
<</nobr>><<nobr>>
/* Set up sex scene with client BEFORE UpdateAll */
/* UpdateNPCVar in UpdateAll sets $interactionNpc = $Characters[$indexNPC] */
/* So we must set $indexNPC to point to our brothel client */
/* Find client by ID to ensure we get the correct character */
<<set _clientChar = $Characters.find(c => c.info.id == $brothelClientId)>>
<<set $indexNPC = $Characters.indexOf(_clientChar)>>
<<set $interactionNpc = _clientChar>>
<<include "UpdateAll">>
<<set $sexType = "brothelClientService">>
<<set $gameSettings.allowSaves = false>>
<<set $canShowStatsBtn = false>>
/* Determine who is dominant based on client role */
<<if $brothelClientRole == "Top">>
<<set $playerDom = false>>
<<elseif $brothelClientRole == "Bottom">>
<<set $playerDom = true>>
<<else>>
/* Versatile - random */
<<set $playerDom = [true, false].random()>>
<</if>>
/* Spend some energy to start */
<<SpendEnergy $player 10>>
<<SpendTimeWithoutUpdate 30>>
/* Go to sex scene */
<<if $playerDom == true>>
<<goto "Sex">>
<<else>>
<<goto "PassiveSex">>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $brothelClient>>
<<set _refusalResponses = [
"*disappointed* Fine. I'll find someone else then.",
"*shrugs* Your loss. I pay well.",
"*huffs* Whatever. This place isn't that great anyway.",
"*sighs* Alright. Maybe next time."
]>>
<<Chat $brothelClient _refusalResponses.random()>>
/* Delete the client */
<<DeleteCharacter $brothelClient>>
<<unset $brothelClient $brothelClientId $brothelClientPayment $brothelClientRole>>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn neutral"><<button "← Back" "BrothelMasterRoom_Main">><</button>></span>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/City/RedLightDistrict/Brothel/Master Room.jpg">>
<<set _client = $brothelClient>>
<<ShowNpcIcon _client>>
<div class="centre-text" style="font-size: 22px; color: #f44336; text-shadow: 0 0 10px rgba(244, 67, 54, 0.5);">😠 Client Unsatisfied</div>
<<set _angryResponses = [
"*furious* Are you kidding me?! I paid for a service and you can't even finish?! I'm not paying for this!",
"*disgusted* What a waste of my time! You call yourself a professional? I want my money back!",
"*shouting* This is ridiculous! I came here for satisfaction, not this pathetic performance!",
"*sneering* Unbelievable. The worst experience I've ever had. I'm telling everyone about this dump!",
"*storming out* Forget it! I'm leaving and I'm NOT paying a single cent for this disaster!"
]>>
<<Chat _client _angryResponses.random()>>
<<ChatMessage "The client storms out without paying. This reflects badly on your brothel's reputation.">>
/* Lose reputation for failed service */
<<set _repLoss = Random(3, 8)>>
<<set $playerBrothel.reputation = Math.max(0, $playerBrothel.reputation - _repLoss)>>
<<set _repLossMsg = "🔻 Reputation -" + _repLoss>>
<<ChatMessage _repLossMsg>>
/* Delete the client */
<<DeleteCharacter _client>>
<<unset $brothelClient $brothelClientId $brothelClientPayment $brothelClientRole>>
<<set $canShowStatsBtn = true>>
<<set $gameSettings.allowSaves = true>>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn neutral"><<button "← Back to Room" "BrothelMasterRoom_Main">><</button>></span>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/City/RedLightDistrict/Brothel/Master Room.jpg">>
<<set _payment = $brothelClientPayment>>
<<set _client = $brothelClient>>
<<ShowNpcIcon _client>>
<div class="centre-text" style="font-size: 22px; color: #4CAF50; text-shadow: 0 0 10px rgba(76, 175, 80, 0.5);">💰 Service Complete</div>
<<set _satisfiedResponses = [
"*catching breath* That was... incredible. Worth every penny.",
"*dressing up* Wow. I'll definitely be coming back for more.",
"*satisfied smile* You really know what you're doing. Thank you.",
"*stretching* Mmm, I needed that. Best decision I made this week.",
"*grinning* Money well spent. You're amazing."
]>>
<<Chat _client _satisfiedResponses.random()>>
/* Apply Personal Touch perk bonus */
<<set _playerProfitLevel = $playerBrothel.perks ? ($playerBrothel.perks.playerProfitBonus || 0) : 0>>
<<set _bonusMultiplier = 1 + (_playerProfitLevel * 0.1)>>
<<set _finalPayment = Math.floor(_payment * _bonusMultiplier)>>
/* Give player the payment */
<<set $player.money += _finalPayment>>
<<if _playerProfitLevel > 0>>
<<set _paymentMsg = "You received $" + _finalPayment + " for your services (+" + (_playerProfitLevel * 10) + "% Personal Touch bonus).">>
<<else>>
<<set _paymentMsg = "You received $" + _finalPayment + " for your services.">>
<</if>>
<<ChatMessage _paymentMsg>>
/* Add to brothel earnings tracking */
<<set $playerBrothel.dailyEarnings += _finalPayment>>
/* Add to uncollected earnings (capped at $20,000) */
<<if ndef $playerBrothel.uncollectedEarnings>>
<<set $playerBrothel.uncollectedEarnings = 0>>
<</if>>
<<set _newUncollected = $playerBrothel.uncollectedEarnings + _finalPayment>>
<<if _newUncollected > 20000>>
<<set $playerBrothel.uncollectedEarnings = 20000>>
<<else>>
<<set $playerBrothel.uncollectedEarnings = _newUncollected>>
<</if>>
/* Sync totalEarnings with uncollectedEarnings */
<<set $playerBrothel.totalEarnings = $playerBrothel.uncollectedEarnings>>
/* Small reputation boost for personal service */
<<set _repGain = Math.floor(_payment / 100) + 1>>
<<set $playerBrothel.reputation += _repGain>>
/* Check for level up */
<<if $playerBrothel.reputation >= $playerBrothel.maxReputation && $playerBrothel.level < 26>>
<<set $playerBrothel.level += 1>>
<<set $playerBrothel.reputation = 0>>
<<set $playerBrothel.maxReputation = Math.floor($playerBrothel.maxReputation * 1.25)>>
<<set $playerBrothel.skillPoints += 1>>
<<set _levelUpMsg = "🎉 Brothel leveled up to Level " + $playerBrothel.level + "! ⭐ +1 Skill Point!">>
<<ChatMessage _levelUpMsg>>
<</if>>
/* Delete the client */
<<DeleteCharacter _client>>
<<unset $brothelClient $brothelClientId $brothelClientPayment $brothelClientRole>>
<<set $canShowStatsBtn = true>>
<<set $gameSettings.allowSaves = true>>
<div class="brothel-btn-container padding-top">
<span class="brothel-btn neutral"><<button "← Back to Room" "BrothelMasterRoom_Main">><</button>></span>
</div>
<</nobr>><<nobr>>
<<include "PlayerBrothel_InitCheck">>
<<include "UpdateAll">>
<div class="centre-text" style="font-size: 22px; color: #2196f3; text-shadow: 0 0 10px rgba(33, 150, 243, 0.5);">📋 Worker Management</div>
<<ChatMessage "Manage your workers' assignments. Workers assigned to 'Work' will generate income. Other assignments provide different benefits.">>
/* Count workers in each assignment */
<<set _workCount = 0>>
<<set _spaCount = 0>>
<<set _medicalCount = 0>>
<<set _restCount = 0>>
<<for _i = 0; _i < $playerBrothel.prostitutes.length; _i++>>
<<set _prostId = $playerBrothel.prostitutes[_i]>>
<<set _assignment = $playerBrothel.workerAssignments[_prostId] || "work">>
<<if _assignment == "work">><<set _workCount++>>
<<elseif _assignment == "spa">><<set _spaCount++>>
<<elseif _assignment == "medical">><<set _medicalCount++>>
<<elseif _assignment == "relaxation">><<set _restCount++>>
<</if>>
<</for>>
/* Summary */
<fieldset style="background: rgba(0,0,0,0.3); border: 1px solid #2196f3; margin-bottom: 15px;">
<legend style="color: #64b5f6;">Summary</legend>
<div style="display: grid; grid-template-columns: repeat(4, 1fr); gap: 10px; text-align: center; padding: 10px;">
<div style="background: rgba(233, 30, 99, 0.2); padding: 10px; border-radius: 8px;">
<div style="color: #e91e63; font-size: 20px; font-weight: bold;"><<print _workCount>></div>
<div style="color: #aaa; font-size: 11px;">💋 Working</div>
</div>
<div style="background: rgba(0, 188, 212, 0.2); padding: 10px; border-radius: 8px;">
<div style="color: #00bcd4; font-size: 20px; font-weight: bold;"><<print _spaCount>></div>
<div style="color: #aaa; font-size: 11px;">💆 Spa</div>
</div>
<div style="background: rgba(76, 175, 80, 0.2); padding: 10px; border-radius: 8px;">
<div style="color: #4CAF50; font-size: 20px; font-weight: bold;"><<print _medicalCount>></div>
<div style="color: #aaa; font-size: 11px;">🏥 Medical</div>
</div>
<div style="background: rgba(255, 152, 0, 0.2); padding: 10px; border-radius: 8px;">
<div style="color: #ff9800; font-size: 20px; font-weight: bold;"><<print _restCount>></div>
<div style="color: #aaa; font-size: 11px;">🛋️ Rest</div>
</div>
</div>
</fieldset>
/* Worker list with assignment toggles */
<fieldset style="background: linear-gradient(135deg, rgba(33, 150, 243, 0.1) 0%, rgba(33, 33, 33, 0.9) 100%); border: 1px solid #2196f3;">
<legend style="color: #64b5f6;">All Workers</legend>
<div style="max-height: 400px; overflow-y: auto; padding: 10px;">
<<for _i = 0; _i < $playerBrothel.prostitutes.length; _i++>>
<<set _prostId = $playerBrothel.prostitutes[_i]>>
<<set _prost = $Characters.find(c => c.info.id == _prostId)>>
<<if _prost>>
<<set _prostIcon = _prost.getPhotoImage()>>
<<set _prostName = _prost.info.firstName>>
<<set _assignment = $playerBrothel.workerAssignments[_prostId] || "work">>
<<set _energy = _prost.status.energy.value>>
<<set _health = _prost.status.health.value>>
<<capture _prost _prostId _prostIcon _prostName _assignment _energy _health>>
<div style="background: rgba(0,0,0,0.3); border-radius: 10px; padding: 12px; margin-bottom: 10px; display: flex; align-items: center; gap: 15px;">
/* Avatar */
<img @src='_prostIcon' alt='Avatar' style="width: 50px; height: 50px; border-radius: 50%; border: 2px solid #2196f3;">
/* Info */
<div style="flex-grow: 1;">
<div style="color: #fff; font-weight: bold; font-size: 14px;"><<print _prostName>></div>
<div style="color: #888; font-size: 11px;">⚡ <<print _energy>> | ❤️ <<print _health>></div>
</div>
/* Assignment buttons */
<div style="display: flex; gap: 5px;">
<<if _assignment == "work">>
<div style="background: #e91e63; padding: 6px 10px; border-radius: 6px; color: #fff; font-size: 10px;">💋</div>
<<else>>
<span class="brothel-btn primary small" style="padding: 2px;"><<button "💋" "BrothelWorkerManagement_SetAssign">>
<<set $mgmtWorkerId = _prostId>>
<<set $mgmtNewAssignment = "work">>
<</button>></span>
<</if>>
<<if $playerBrothel.upgrades.spa>>
<<if _assignment == "spa">>
<div style="background: #00bcd4; padding: 6px 10px; border-radius: 6px; color: #fff; font-size: 10px;">💆</div>
<<else>>
<span class="brothel-btn spa small" style="padding: 2px;"><<button "💆" "BrothelWorkerManagement_SetAssign">>
<<set $mgmtWorkerId = _prostId>>
<<set $mgmtNewAssignment = "spa">>
<</button>></span>
<</if>>
<</if>>
<<if $playerBrothel.upgrades.medical>>
<<if _assignment == "medical">>
<div style="background: #4CAF50; padding: 6px 10px; border-radius: 6px; color: #fff; font-size: 10px;">🏥</div>
<<else>>
<span class="brothel-btn success small" style="padding: 2px;"><<button "🏥" "BrothelWorkerManagement_SetAssign">>
<<set $mgmtWorkerId = _prostId>>
<<set $mgmtNewAssignment = "medical">>
<</button>></span>
<</if>>
<</if>>
<<if $playerBrothel.upgrades.relaxation>>
<<if _assignment == "relaxation">>
<div style="background: #ff9800; padding: 6px 10px; border-radius: 6px; color: #fff; font-size: 10px;">🛋️</div>
<<else>>
<span class="brothel-btn special small" style="padding: 2px;"><<button "🛋️" "BrothelWorkerManagement_SetAssign">>
<<set $mgmtWorkerId = _prostId>>
<<set $mgmtNewAssignment = "relaxation">>
<</button>></span>
<</if>>
<</if>>
/* Room assignment - always available */
<<if _assignment == "room">>
<div style="background: #607D8B; padding: 6px 10px; border-radius: 6px; color: #fff; font-size: 10px;">🚪</div>
<<else>>
<span class="brothel-btn neutral small" style="padding: 2px;"><<button "🚪" "BrothelWorkerManagement_SetAssign">>
<<set $mgmtWorkerId = _prostId>>
<<set $mgmtNewAssignment = "room">>
<</button>></span>
<</if>>
</div>
</div>
<</capture>>
<</if>>
<</for>>
</div>
</fieldset>
<div class="brothel-btn-container" style="margin-top: 15px;">
<span class="brothel-btn neutral"><<button "← Back to Hall" "PlayerBrothel_Main">><</button>></span>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set $playerBrothel.workerAssignments[$mgmtWorkerId] = $mgmtNewAssignment>>
<<unset $mgmtWorkerId>>
<<unset $mgmtNewAssignment>>
<<goto "BrothelWorkerManagement">>
<</nobr>><<nobr>>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Locations/City/RedLightDistrict/Red_Light_District.png">>
<<timed 0.2s>>
<div class="centre-text">Red Light District</div>
<<GangTurfBadge>>
<<GangStreetMsg>>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn-container gang-base-links">
<<set _gbLbl = siteLinkLabel("GB_Salon")>>
<div class="btn"><<button _gbLbl "GB_Salon">><</button>></div>
</div>
<div class="btn-container">
<div class="btn"><<button "Photo Studio" "PhotoStudio">><</button>></div>
<div class="btn"><<button "Porn Studio" "PornStudio">><</button>></div>
<div class="btn"><<button "Strip Club" "SC_StripClub">><</button>></div>
<div class="btn"><<button "Night Club" "Nightclub_Entry">><</button>></div>
<div class="btn"><<button "Brothel" "PlayerBrothel_Entry">><</button>></div>
</div>
<div class="padding-top"><<Travel "Leave" "Campus">></div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<<WantedLine>>
<div class="btn-container">
<<EachActions>>
<<if ($dateTime.hours gte 18 or $dateTime.hours lt 5) and CheckContentFilter('Male', $player)>><div class="btn"><<button "Work the stroll" "Crime_Solicit">>
<<set $policeCrimeAuthority = { source: "choice", crime: "solicitation", passage: "Crime_Solicit", day: getCurrentAbsoluteDay(), location: $player.info.currentLocation }>>
<</button>></div><</if>>
/* Daytime only: before 05:00 the stroll is still open, and from 17:00
on the jump to 17:00 would turn the clock back. */
<<if $dateTime.hours >= 5 && $dateTime.hours < 17>>
<div class="btn"><<button "Wait until evening" "RedLightDistrict">>
<<set _tempTime = {minutes: 0, hours: 17}>>
<<SetTime _tempTime>>
<<SpendTime 60>>
<</button>></div>
<</if>>
</div>
</fieldset>
</div>
<<PeopleAround>>
<<PoliceChecker>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set $gameSettings.allowSaves = false>>
<<set $canShowStatsBtn = false>>
<<set _charPic = "Media\\Characters\\QuestChars\\Other\\nightclub_bouncer.jpeg">>
<img class="chat-image" @src="_charPic" alt="Avatar">
<<set _ncEntry = $player.dailyEvents.isEventRegistered($player.info.id, "NC_Entry")>>
<<set _repa = $player.info.reputation.nightclub.value >= 50>>
<<ChatMessage 'Entry: $50 for men, free for women'>>
<<if _ncEntry == true>>
<<ChatMessage 'You’ve already paid for admission today.'>>
<<elseif _repa >= 70>>
<<Chat $interactionNpc 'Welcome *Your reputation is very high, so you are allowed to enter free of charge.*'>>
<</if>>
<<if $player.gender() == "Male" && _ncEntry == false && _repa < 70>>
<<if $player.money >= 50>>
<div class="btn padding-top"><<button "Pay ($50)" "NC_DanceFloor">>
<<set $gameSettings.allowSaves = true>>
<<set $canShowStatsBtn = true>>
<<set $player.money -= 50>>
<<run $player.dailyEvents.registerEvent($player.info.id, "NC_Entry", 1)>>
<</button>></div>
<<else>>
<div class="btn non-interacting"><<button "Pay ($50)">><</button>></div>
<</if>>
<<else>>
<div class="btn padding-top"><<button "Enter" "NC_DanceFloor">>
<<set $gameSettings.allowSaves = true>>
<<set $canShowStatsBtn = true>>
<</button>></div>
<</if>>
<div class="btn padding-top"><<button "Leave" $player.info.currentLocation>>
<<set $gameSettings.allowSaves = true>>
<<set $canShowStatsBtn = true>>
<</button>></div>
<</nobr>><<nobr>>
<<EachLoc>>
<<SaveLocation>>
<<SetBackground "Media/Locations/City/RedLightDistrict/PhotoStudio.jpg">>
<<timed 0.2s>>
<div class="centre-text">Photo Studio</div>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn-container">
<div class="btn"><<button "Leave" "RedLightDistrict">><</button>></div>
</div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
<<if $dateTime.hours < 8>>
<div class="btn"><<button "Wait for the photographer" "PhotoStudio">>
<<set _tempTime = {minutes: 0, hours: 7}>>
<<SetTime _tempTime>>
<<SpendTime 60>>
<</button>></div>
<</if>>
</div>
</fieldset>
</div>
<<PeopleAround>>
<</timed>>
<</nobr>><<nobr>>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Locations/City/RedLightDistrict/PornStudio.jpeg">>
<<timed 0.2s>>
<div class="centre-text">Porn studio</div>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn-container">
<div class="btn"><<button "Leave" "RedLightDistrict">><</button>></div>
</div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
<<if $dateTime.hours < 8>>
<div class="btn"><<button "Wait for the director" "PornStudio">>
<<set _tempTime = {minutes: 0, hours: 7}>>
<<SetTime _tempTime>>
<<SpendTime 60>>
<</button>></div>
<</if>>
</div>
</fieldset>
</div>
<<PeopleAround>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Locations/City/RedLightDistrict/Strip Club/SC_Bar.jpg">>
<<timed 0.2s>>
<div class="centre-text">Bar</div>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn"><<button "Back" "SC_StripClub">><</button>></div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
</div>
</fieldset>
</div>
<<PeopleAround>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/City/RedLightDistrict/Strip Club/SC_StripClub.jpg">>
<<SpendTime 30>>
<div class="centre-text">The main stage</div>
/* One of three sets, each with its own clip from EventMedia.STRIP_SHOW_CLIPS. */
<<set _showIndex = random(0, 2)>>
<<switch _showIndex>>
<<case 0>>
<<ChatMessage 'Two girls in neon mesh take the pole together. They grind on each other under the blacklight, peel off what little they wear and finish on their knees, kissing with their tongues out while the front row throws bills.'>>
<<case 1>>
<<ChatMessage 'A blonde in white lace climbs the pole to the ceiling and slides down upside down with her legs spread. By the end of the song the lace is on the floor and she is working the pole naked, her ass bouncing to the bass.'>>
<<default>>
<<ChatMessage 'The house closes the set with a catfight. Two oiled-up dancers wrestle naked across the stage, tits squashed together, pinning each other with their thighs while the crowd yells for the winner.'>>
<</switch>>
<<EventMedia `EventMedia.STRIP_SHOW_CLIPS[_showIndex]`>>
<<run $player.status.horny.increase(8)>>
<div class="btn-container padding-top">
<<if $player.money gte 20>>
<div class="btn"><<button "Tip the dancers ($20)" "SC_StripClub">>
<<set $player.money -= 20>>
<<run $player.status.horny.increase(4)>>
<<if $player.attributes and $player.attributes.corruption and typeof $player.attributes.corruption.increase === "function">><<run $player.attributes.corruption.increase(0.3)>><</if>>
<</button>></div>
<</if>>
<div class="btn"><<button "Back to the floor" "SC_StripClub">><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/City/RedLightDistrict/Strip Club/SC_StripClub.jpg">>
<<SpendTime 20>>
<div class="centre-text">Private room</div>
<<ChatMessage 'A dancer in a white lace set leads you down a red-lit corridor into a booth with a leather couch and a short pole. She pushes you down onto the cushions and starts to move.'>>
<<EventMedia `EventMedia.STRIP_SHOW_CLIPS[1]`>>
<<if $player.gender() is "Male">>
<<ChatMessage 'She straddles your lap and grinds her bare pussy over the bulge in your pants, her tits in your face. House rules say no hands, so you sit on them while she rubs herself off on your cock through the fabric.'>>
<<elseif $player.gender() is "Shemale">>
<<ChatMessage 'She straddles your lap and grinds her bare pussy over the hard cock tenting your skirt, her tits in your face. House rules say no hands, so you sit on them while she rides the outline of your cock.'>>
<<else>>
<<ChatMessage 'She straddles your thigh and grinds her bare pussy along it, leaving a wet streak on your skin, then pulls your face into her tits. House rules say no hands, and she smirks every time you nearly break them.'>>
<</if>>
<<run $player.status.horny.increase(15)>>
<<ChatMessage 'When the song ends she leans close to your ear.'>>
<<ChatWithoutNPC 'Dancer' "Media\\Characters\\QuestChars\\Other\\female_unknown.jpg" 'For another hundred and fifty the curtain stays closed and the rules go out the window.'>>
<div class="btn-container padding-top">
<<if $player.money gte 150 and CheckContentFilter('Female')>>
<div class="btn"><<button "Pay her for more ($150)">><<set $player.money -= 150>><<goto "SC_PrivateRoom_Extra">><</button>></div>
<<else>>
<div class="btn non-interacting"><<button "Pay her for more ($150)">><</button>></div>
<</if>>
<div class="btn"><<button "Thank her and leave" "SC_StripClub">><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/City/RedLightDistrict/Strip Club/SC_StripClub.jpg">>
<<SpendTime 20>>
<div class="centre-text">Behind the curtain</div>
<<if $player.gender() is "Female">>
<<ChatMessage 'She tugs your clothes down, kneels between your legs on the couch and eats your pussy, licking your clit in slow circles until you are grinding against her mouth and cumming on her tongue.'>>
<<SetOralPick "Female" "Female">>
<<elseif $player.gender() is "Shemale">>
<<ChatMessage 'She pulls your skirt up, takes your cock out and sucks it with her tits pressed against your thighs, bobbing her head until you cum in her mouth. She swallows and winks.'>>
<<SetOralPick "Shemale" "Female">>
<<else>>
<<ChatMessage 'She opens your pants, kneels on the carpet and sucks your cock, looking up at you the whole time. When you are close she pulls back and jerks you off onto her tits.'>>
<<SetOralPick "Male" "Female">>
<</if>>
<<if CheckContentFilter('Female')>><<Video _pick>><</if>>
<<run $player.status.horny.value = $player.status.horny.min>>
<<run gainSexExp($player, "sexualKnowledge", 1)>>
<<if $player.attributes and $player.attributes.corruption and typeof $player.attributes.corruption.increase === "function">><<run $player.attributes.corruption.increase(1)>><</if>>
<div class="btn padding-top"><<button "Straighten up and leave" "SC_StripClub">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Locations/City/RedLightDistrict/Strip Club/SC_StripClub.jpg">>
<<timed 0.2s>>
<div class="centre-text">Strip Club</div>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn"><<button "Bar" "SC_Bar">><</button>></div>
<div class="btn padding-top"><<button "Leave" "RedLightDistrict">><</button>></div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
/* Paid on the click, so a reload of the show never charges twice. */
<<if $player.money gte 20>>
<div class="btn"><<button "Watch the show ($20, 30m)">><<set $player.money -= 20>><<goto "SC_StripShow">><</button>></div>
<<else>>
<div class="btn non-interacting"><<button "Watch the show ($20, 30m)">><</button>></div>
<</if>>
<<if $player.money gte 100>>
<div class="btn"><<button "Private dance ($100)">><<set $player.money -= 100>><<goto "SC_PrivateRoom">><</button>></div>
<<else>>
<div class="btn non-interacting"><<button "Private dance ($100)">><</button>></div>
<</if>>
</div>
</fieldset>
</div>
<<PeopleAround>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _dealerImg = "Media\\Locations\\City\\SkidRow\\BlackMarket\\Dealer.jpg">>
<<DrawImg _dealerImg>>
<<set _lockpickAtMax = $player.attributes.lockpick.value >= $player.attributes.lockpick.max>>
<<if _lockpickAtMax>>
<<ChatWithoutNPC 'The Fence' _dealerImg 'You already know everything I can teach you about locks. But I still got picks for sale.'>>
<div class="btn padding-top non-interacting"><<button "Lockpicking (MAX)">><</button>></div>
<<else>>
<<ChatWithoutNPC 'The Fence' _dealerImg 'Need to learn how to crack a lock? I can teach you. I also sell lockpicks.'>>
<div class="btn padding-top"><<button "Train Lockpicking ($250)" "Dealer_TrainLockpick">><</button>></div>
<</if>>
<div class="btn padding-top"><<button "Buy Lockpicks" "Dealer_BuyLockpicks">><</button>></div>
<div class="btn padding-top"><<button "Leave" "SR_BlackMarket">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _dealerImg = "Media\\Locations\\City\\SkidRow\\BlackMarket\\Dealer.jpg">>
<<if $player.money < 250>>
<<ChatWithoutNPC 'The Fence' _dealerImg 'No cash, no class. Come back with $250.'>>
<div class="btn padding-top"><<button "Back" "Dealer_Checker">><</button>></div>
<<else>>
<<set $player.money -= 250>>
<<SpendEnergy $player 20>>
<<SpendTimeWithoutUpdate 30>>
<<set _gain = Random(10,20) + $player.attributes.intelligence.value>>
<<SetCharProgression $player 'lockpick' _gain true>>
<<ChatWithoutNPC 'The Fence' _dealerImg 'Not bad. You are getting the hang of it.'>>
<div class="btn padding-top"><<button "Back" "Dealer_Checker">><</button>></div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _dealerImg = "Media\\Locations\\City\\SkidRow\\BlackMarket\\Dealer.jpg">>
<<DrawImg _dealerImg>>
<<set _lockpickCount = 0>>
<<if $player.inventory.hasItem("Lockpick")>>
<<set _lockpickCount = $player.inventory.getItemByName("Lockpick").quantity>>
<</if>>
<<ChatWithoutNPC 'The Fence' _dealerImg 'Lockpicks. Good quality. $150 each.'>>
<p style="text-align: center; color: #aaa;">
Your money: $<<print $player.money>> | Lockpicks in inventory: <<print _lockpickCount>>
</p>
<div class="btn-container">
<<if $player.money >= 150>>
<div class="btn"><<button "Buy 1 Lockpick ($150)" "Dealer_BuyLockpicks">>
<<set $player.money -= 150>>
<<run $player.inventory.addItemByName("lockpick", 1)>>
<</button>></div>
<<else>>
<div class="btn non-interacting"><<button "Buy 1 Lockpick ($150)">><</button>></div>
<</if>>
<<if $player.money >= 450>>
<div class="btn"><<button "Buy 3 Lockpicks ($450)" "Dealer_BuyLockpicks">>
<<set $player.money -= 450>>
<<run $player.inventory.addItemByName("lockpick", 3)>>
<</button>></div>
<<else>>
<div class="btn non-interacting"><<button "Buy 3 Lockpicks ($450)">><</button>></div>
<</if>>
<<if $player.money >= 750>>
<div class="btn"><<button "Buy 5 Lockpicks ($750)" "Dealer_BuyLockpicks">>
<<set $player.money -= 750>>
<<run $player.inventory.addItemByName("lockpick", 5)>>
<</button>></div>
<<else>>
<div class="btn non-interacting"><<button "Buy 5 Lockpicks ($750)">><</button>></div>
<</if>>
</div>
<div class="btn padding-top"><<button "Back" "Dealer_Checker">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Locations/City/SkidRow/SR_Motel.jpg">>
<<timed 0.2s>>
<div class="centre-text">Motel</div>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<<if $player.dailyEvents.isEventRegistered($player.info.id, "RentAMotelRoom") == false>>
<<if $player.money >= 100>>
<div class="btn"><<button "Rent a room ($100)" "SR_Motel">>
<<run $player.dailyEvents.registerEvent($player.info.id, "RentAMotelRoom", 1)>>
<<set $player.money -= 100>>
<</button>></div>
<<else>>
<div class="btn non-interacting"><<button "Rent a room ($100)">><</button>></div>
<</if>>
<<else>>
<div class="btn"><<button "Motel Room" "SR_Motel_Room">><</button>></div>
<</if>>
<div class="btn padding-top"><<button "Leave" "SR_SkidRow">><</button>></div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
</div>
</fieldset>
</div>
<<PeopleAround>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Locations/City/SkidRow/Motel/Room.jpg">>
<<timed 0.2s>>
<div class="centre-text">Motel Room</div>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn"><<button "Leave" "SR_Motel">><</button>></div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
<<SleepButton>>
</div>
</fieldset>
</div>
<<PeopleAround>>
<<if $player.attributes && $player.attributes.corruption && $player.attributes.corruption.value >= 60 && !$player.dailyEvents.isEventRegistered($player.info.id, "SR_MotelRoom_DomSession")>>
<<LocationEvent 'Answer the flyer' 'SR_MotelRoom_DomSession' "transition" "Media\\Other\\Notice_Event.png">>
<</if>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Locations/City/SkidRow/SR_Shop.jpg">>
<<timed 0.2s>>
<div class="centre-text">Shop</div>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn"><<button "Leave" "SR_SkidRow">><</button>></div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
</div>
</fieldset>
</div>
<<PeopleAround>>
<<if $player.attributes && $player.attributes.corruption && $player.attributes.corruption.value >= 40 && !$player.dailyEvents.isEventRegistered($player.info.id, "SR_Shop_DiscountFavor")>>
<<LocationEvent 'Back-office favor' 'SR_Shop_DiscountFavor' "transition" "Media\\Other\\Notice_Event.png">>
<</if>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Locations/City/SkidRow/SkidRow.jpg">>
<<timed 0.2s>>
<div class="centre-text">Skid Row</div>
<<GangTurfBadge>>
<<set _srSummary = skidRowStreetsSummary()>>
<<if _srSummary>><div class="gang-street-lines"><<print _srSummary>></div><</if>>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn-container">
<div class="btn"><<button "Warehouse" "SR_Warehouse">><</button>></div>
<div class="btn"><<button "Shop" "SR_Shop">><</button>></div>
<div class="btn"><<button "Motel" "SR_Motel">><</button>></div>
<div class="btn"><<button "Underground Fight Gym" "Underground_Fight_Gym">><</button>></div>
<div class="btn"><<button "Black Market" "SR_BlackMarket">><</button>></div>
<<if getQuestState("rayna_voss_quest1") == "active" && getTaskState("rayna_voss_quest1", "Track down Detective Rayna Voss in the city park") == 'completed' && getTaskState("rayna_voss_quest1", "After dark, infiltrate the BioGenesis basement in Skid Row") != 'completed'>>
<div class="btn"><<button "Basement" "BG_Basement_Entrance">><</button>></div>
<</if>>
</div>
<div class="gang-streets-nav">
<div class="gang-hint">Streets</div>
<div class="btn-container">
<div class="btn"><<button "Bar Row" "SR_BarRow">><</button>></div>
<div class="btn"><<button "The Alleys" "SR_Alleys">><</button>></div>
<div class="btn"><<button "The Tenements" "SR_Tenements">><</button>></div>
<div class="btn"><<button "Pawn Row" "SR_PawnRow">><</button>></div>
<div class="btn"><<button "Rail Yard" "SR_RailYard">><</button>></div>
</div>
</div>
<div class="padding-top"><<Travel "Leave" "Campus">></div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<<WantedLine>>
<div class="btn-container">
<div class="btn"><<button "Work the corner" "Crime_Deal">>
<<set $policeCrimeAuthority = { source: "choice", crime: "dealing", passage: "Crime_Deal", day: getCurrentAbsoluteDay(), location: $player.info.currentLocation }>>
<</button>></div>
<div class="btn"><<button "Smash something up" "Crime_Vandalism">>
<<set $policeCrimeAuthority = { source: "choice", crime: "vandalism", passage: "Crime_Vandalism", day: getCurrentAbsoluteDay(), location: $player.info.currentLocation }>>
<</button>></div>
<<if isFugitive($police)>><div class="btn"><<button "Go see the fixer" "Fixer_NewIdentity">><</button>></div><</if>>
<<EachActions>>
</div>
</fieldset>
</div>
<<PeopleAround>>
<<PoliceChecker>>
<<if $player.attributes && $player.attributes.corruption && $player.attributes.corruption.value >= 50>>
<<LocationEvent 'Alley glory hole' 'AlleyGloryHole_Event' "transition" "Media\\Other\\Notice_Event.png">>
<</if>>
<<if $player.attributes && $player.attributes.corruption && $player.attributes.corruption.value >= 35 && !$player.characterEvents.isEventRegistered($player.info.id, "SkidRow_AlleyTitfuckTip")>>
<<LocationEvent 'Loading-dock tip' 'SkidRow_AlleyTitfuckTip' "transition" "Media\\Other\\Notice_Event.png">>
<</if>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Locations/City/SkidRow/Warehouse/Warehouse.jpg">>
<<timed 0.2s>>
<div class="centre-text">Warehouse</div>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn padding-top"><<button "Leave" "SR_SkidRow">><</button>></div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
</div>
</fieldset>
</div>
<<PeopleAround>>
<<done>><<LocationEvent 'Mad Dog' 'MadDog_Interaction' "transition" "Media\\Characters\\QuestChars\\MadDog\\MadDog.jpg" "npc-card" "Gang leader">><</done>>
<</timed>>
<<include "Check_SkidRow_Quests">>
<</nobr>><<nobr>>
<<if getQuestState("meet_mad_dog") == "active">>
<<goto "MadDog_Quest1_Warehouse_Scene">>
<<elseif getQuestState("meet_mad_dog") == undefined>>
<<goto "Check_SkidRow_Quests_Leave">>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "GetCharactersMadDog_Quest1">>
<<ChatWithoutNPC 'Gangster' _gangsterImg 'Hey, you! You\'re fucked if you don\'t fuck off right now!'>>
<<LockSettings>>
<div class="btn padding-top"><<button "Leave" "SR_SkidRow">><<LeaveInteractionSettings>><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<EachLoc>>
<<set _bg = streetBg("SR_BarRow")>>
<<SetBackground _bg>>
<<timed 0.2s>>
<div class="centre-text">Bar Row</div>
<<GangTurfBadge>>
<<GangStreetLines>>
<<GangStreetMsg>>
<div class="grid-row-twice gang-place">
<fieldset>
<legend>Navigation</legend>
<div class="btn-container gang-base-links">
<<set _gbLbl = siteLinkLabel("GB_DiveBar")>>
<div class="btn"><<button _gbLbl "GB_DiveBar">><</button>></div>
</div>
<div class="btn padding-top"><<button "Back to Skid Row" "SR_SkidRow">><</button>></div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<if !streetActionDone(getGangWorld(), "barDrink")>>
<div class="btn"><<button "Have a drink and listen ($8)" "SR_BarRow">>
<<set $gangStreetMsg = streetBarDrink()>>
<<SpendTime 30>>
<</button>></div>
<</if>>
<<if !streetActionDone(getGangWorld(), "barBrawl")>>
<div class="btn"><<button "Pick a fight">>
<<set _sf = prepareStreetFight("SR_BarRow", "brawl")>>
<<if _sf>>
<<run markStreetAction(getGangWorld(), "barBrawl")>>
<<set $gangFight = _sf.token>>
<<set $interactionNpc = _sf.character>>
<<set _gfControls = { attack: true, seduce: false, items: false, actions: true, forcePhysical: true }>>
<<SpendTime 10>>
<<StartFight $player $interactionNpc _gfControls "GangStreetFightWon" "GangStreetFightLost" "Fight" true>>
<</if>>
<</button>></div>
<</if>>
<<GangRumorLever>>
<<EachActions>>
</div>
</fieldset>
</div>
<<PeopleAround>>
<<PoliceChecker>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<EachLoc>>
<<set _bg = streetBg("SR_Alleys")>>
<<SetBackground _bg>>
<<timed 0.2s>>
<div class="centre-text">The Alleys</div>
<<GangTurfBadge>>
<<GangStreetLines>>
<<GangStreetMsg>>
<div class="grid-row-twice gang-place">
<fieldset>
<legend>Navigation</legend>
<div class="btn padding-top"><<button "Back to Skid Row" "SR_SkidRow">><</button>></div>
</fieldset>
<fieldset>
<legend>The dead drop</legend>
<div class="gang-hint">A loose brick behind a dumpster. Money goes in, notes come out.</div>
<div class="btn-container">
<<set _intel = streetIntelOptions()>>
<<for _i, _o range _intel>>
<<capture _o>>
<<if _o.level lt 2>>
<<set _lbl = "Buy word on " + _o.name + " ($" + _o.price + ")">>
<div class="btn"><<button _lbl "SR_Alleys">>
<<set $gangStreetMsg = streetBuyIntel(_o.id)>>
<<SpendTime 60>>
<</button>></div>
<</if>>
<</capture>>
<</for>>
<<if !streetActionDone(getGangWorld(), "sellIntel")>>
<<for _i, _o range _intel>>
<<capture _o>>
<<if _o.level gte 2 and not _o.own>>
<<set _lbl = "Sell what you know about " + _o.name>>
<div class="btn"><<button _lbl "SR_Alleys">>
<<set $gangIntelAbout = _o.id>>
<</button>></div>
<</if>>
<</capture>>
<</for>>
<</if>>
<<if $gangIntelAbout>>
<<set _buyers = streetIntelBuyers($gangIntelAbout)>>
<<if _buyers.length eq 0>>
<div class="gang-hint">Nobody hates them enough to pay right now.</div>
<<set $gangIntelAbout = "">>
<<else>>
<<for _j, _b range _buyers>>
<<capture _b>>
<<set _lbl = "Leave it for " + _b.name>>
<div class="btn"><<button _lbl "SR_Alleys">>
<<set $gangStreetMsg = streetSellIntel($gangIntelAbout, _b.id)>>
<<set $gangIntelAbout = "">>
<<SpendTime 20>>
<</button>></div>
<</capture>>
<</for>>
<</if>>
<</if>>
<<EachActions>>
</div>
</fieldset>
</div>
<<PeopleAround>>
<<PoliceChecker>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<EachLoc>>
<<set _bg = streetBg("SR_Tenements")>>
<<SetBackground _bg>>
<<timed 0.2s>>
<div class="centre-text">The Tenements</div>
<<GangTurfBadge>>
<<GangStreetLines>>
<<GangStreetMsg>>
<div class="grid-row-twice gang-place">
<fieldset>
<legend>Navigation</legend>
<div class="btn-container gang-base-links">
<<set _gbLbl = siteLinkLabel("GB_Tenement")>>
<div class="btn"><<button _gbLbl "GB_Tenement">><</button>></div>
<<set _gbLbl = siteLinkLabel("GB_Chapel")>>
<div class="btn"><<button _gbLbl "GB_Chapel">><</button>></div>
</div>
<div class="btn-container">
<div class="btn"><<button "The Cage (courtyard)" "SR_Courtyard">><</button>></div>
<div class="btn"><<button "Climb to the rooftops" "SR_Rooftops">><</button>></div>
</div>
<div class="btn padding-top"><<button "Back to Skid Row" "SR_SkidRow">><</button>></div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<if !streetActionDone(getGangWorld(), "stairwell")>>
<div class="btn"><<button "Listen in the stairwell" "SR_Tenements">>
<<set $gangStreetMsg = streetListenStairwell()>>
<<SpendTime 20>>
<</button>></div>
<</if>>
<<if !streetActionDone(getGangWorld(), "neighbour")>>
<div class="btn"><<button "Help a neighbor" "SR_Tenements">>
<<set $gangStreetMsg = streetHelpNeighbour()>>
<<SpendTime 30>>
<</button>></div>
<</if>>
<<EachActions>>
</div>
</fieldset>
</div>
<<PeopleAround>>
<<PoliceChecker>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<EachLoc>>
<<set _bg = streetBg("SR_Courtyard")>>
<<SetBackground _bg>>
<<set _night = ($dateTime.hours gte 20 or $dateTime.hours lt 4)>>
<<timed 0.2s>>
<div class="centre-text">The Cage</div>
<<GangTurfBadge>>
<<GangStreetLines>>
<<GangStreetMsg>>
<div class="grid-row-twice gang-place">
<fieldset>
<legend>Navigation</legend>
<div class="btn padding-top"><<button "Back to the Tenements" "SR_Tenements">><</button>></div>
</fieldset>
<fieldset>
<legend>Fight night</legend>
<<if not _night>>
<div class="gang-hint">The ring is empty in daylight. The fights start after dark.</div>
<<else>>
<<set _card = streetRingCard()>>
<<if _card>>
<div class="gang-hint">Tonight: <<print _card.a.name>> against <<print _card.b.name>>. The bookie gives <<print _card.a.name>> a <<print _card.oddsA>>% chance.</div>
<</if>>
<div class="btn-container">
<<if _card and !streetActionDone(getGangWorld(), "ringBet")>>
<<set _lblA = "Bet $50 on " + _card.a.name>>
<<set _lblB = "Bet $50 on " + _card.b.name>>
<div class="btn"><<button _lblA "SR_Courtyard">><<set $gangStreetMsg = streetRingBet(true, 50)>><<SpendTime 40>><</button>></div>
<div class="btn"><<button _lblB "SR_Courtyard">><<set $gangStreetMsg = streetRingBet(false, 50)>><<SpendTime 40>><</button>></div>
<</if>>
<<if !streetActionDone(getGangWorld(), "ringFight")>>
<div class="btn"><<button "Step into the ring">>
<<set _sf = prepareStreetFight("SR_Courtyard", "ring")>>
<<if _sf>>
<<run markStreetAction(getGangWorld(), "ringFight")>>
<<set $gangFight = _sf.token>>
<<set $interactionNpc = _sf.character>>
<<set _gfControls = { attack: true, seduce: false, items: false, actions: true, forcePhysical: true, isolated: true, noWeapons: true }>>
<<SpendTime 20>>
<<StartFight $player $interactionNpc _gfControls "GangStreetFightWon" "GangStreetFightLost" "Fight" false>>
<</if>>
<</button>></div>
<</if>>
</div>
<</if>>
<div class="btn-container"><<EachActions>></div>
</fieldset>
</div>
<<PeopleAround>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<EachLoc>>
<<set _bg = streetBg("SR_Rooftops")>>
<<SetBackground _bg>>
<<timed 0.2s>>
<div class="centre-text">Rooftops</div>
<<GangTurfBadge>>
<<GangStreetLines>>
<<GangStreetMsg>>
<div class="grid-row-twice gang-place">
<fieldset>
<legend>Navigation</legend>
<div class="btn padding-top"><<button "Back down to the Tenements" "SR_Tenements">><</button>></div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<if !streetActionDone(getGangWorld(), "roof")>>
<div class="btn"><<button "Watch the blocks" "SR_Rooftops">>
<<set $gangStreetMsg = streetRooftops()>>
<<SpendTime 60>>
<</button>></div>
<<else>>
<div class="gang-hint">You have already watched these streets today. The corners change after you sleep.</div>
<</if>>
<<EachActions>>
</div>
</fieldset>
</div>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<EachLoc>>
<<set _bg = streetBg("SR_PawnRow")>>
<<SetBackground _bg>>
<<timed 0.2s>>
<div class="centre-text">Pawn Row</div>
<<GangTurfBadge>>
<<GangStreetLines>>
<<GangStreetMsg>>
<div class="grid-row-twice gang-place">
<fieldset>
<legend>Navigation</legend>
<div class="btn-container gang-base-links">
<<set _gbLbl = siteLinkLabel("GB_Laundromat")>>
<div class="btn"><<button _gbLbl "GB_Laundromat">><</button>></div>
</div>
<div class="btn-container">
<div class="btn"><<button "Pawn shop" "SR_PawnShop">><</button>></div>
<div class="btn"><<button "Street doctor" "SR_StreetDoc">><</button>></div>
</div>
<div class="btn padding-top"><<button "Back to Skid Row" "SR_SkidRow">><</button>></div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container"><<EachActions>></div>
</fieldset>
</div>
<<PeopleAround>>
<<PoliceChecker>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<EachLoc>>
<<set _bg = streetBg("SR_PawnShop")>>
<<SetBackground _bg>>
<<set _goods = streetPawnGoods()>>
<<set _loan = streetLoanView()>>
<<timed 0.2s>>
<div class="centre-text">Pawn shop</div>
<<GangStreetLines>>
<<GangStreetMsg>>
<div class="grid-row-twice gang-place">
<fieldset>
<legend>Sell</legend>
<div class="btn-container">
<<if _goods.length eq 0>>
<div class="gang-hint">You have nothing the owner wants. He buys stolen goods and guns, no questions asked.</div>
<</if>>
<<for _i, _gd range _goods>>
<<capture _gd>>
<<set _lbl = "Sell " + _gd.what + " ($" + (_gd.qty * _gd.price) + ")">>
<div class="btn"><<button _lbl "SR_PawnShop">>
<<set $gangStreetMsg = streetSellGood(_gd.good)>>
<<SpendTime 10>>
<</button>></div>
<</capture>>
<</for>>
</div>
<div class="btn padding-top"><<button "Back to Pawn Row" "SR_PawnRow">><</button>></div>
</fieldset>
<fieldset>
<legend>The back room</legend>
<<if _loan.has>>
<div class="gang-hint">You owe <<print _loan.offer>> $<<print _loan.owed>>.
<<if _loan.overdue>><b>You are late. People are asking about you.</b><<else>><<print _loan.dueText>><</if>></div>
<div class="btn-container">
<<set _lbl = "Pay back $" + _loan.owed>>
<div class="btn"><<button _lbl "SR_PawnShop">><<set $gangStreetMsg = streetRepayLoan()>><</button>></div>
</div>
<<elseif _loan.offer>>
<div class="gang-hint"><<print _loan.offer>> lend money here at <<print _loan.rate>>% a day, due in a week.</div>
<<if _loan.amounts.length eq 0>>
<div class="gang-hint">The lender opens an empty cash box and shrugs. There is nothing to lend this week.</div>
<</if>>
<div class="btn-container">
<<for _i, _amt range _loan.amounts>>
<<capture _amt>>
<<set _lbl = "Borrow $" + _amt>>
<div class="btn"><<button _lbl "SR_PawnShop">><<set $gangStreetMsg = streetTakeLoan(_amt)>><</button>></div>
<</capture>>
<</for>>
</div>
<<else>>
<div class="gang-hint">The back room is locked. Nobody is lending on Pawn Row right now.</div>
<</if>>
</fieldset>
</div>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<EachLoc>>
<<set _bg = streetBg("SR_StreetDoc")>>
<<SetBackground _bg>>
<<set _quote = streetDoctorQuote()>>
<<timed 0.2s>>
<div class="centre-text">Street doctor</div>
<<GangStreetLines>>
<<GangStreetMsg>>
<div class="grid-row-twice gang-place">
<fieldset>
<legend>Navigation</legend>
<div class="btn padding-top"><<button "Back to Pawn Row" "SR_PawnRow">><</button>></div>
</fieldset>
<fieldset>
<legend>Treatment</legend>
<div class="btn-container">
<<if _quote gt 0>>
<<set _lbl = "Get patched up ($" + _quote + ")">>
<div class="btn"><<button _lbl "SR_StreetDoc">>
<<set $gangStreetMsg = streetDoctorHeal()>>
<<SpendTime 60>>
<</button>></div>
<<else>>
<div class="gang-hint">You are in one piece. The doctor has no time for healthy people.</div>
<</if>>
</div>
</fieldset>
</div>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<EachLoc>>
<<set _bg = streetBg("SR_RailYard")>>
<<SetBackground _bg>>
<<set _night = ($dateTime.hours gte 21 or $dateTime.hours lt 5)>>
<<timed 0.2s>>
<div class="centre-text">Rail Yard</div>
<<GangTurfBadge>>
<<GangStreetLines>>
<<GangStreetMsg>>
<div class="grid-row-twice gang-place">
<fieldset>
<legend>Navigation</legend>
<div class="btn-container gang-base-links">
<<set _gbLbl = siteLinkLabel("GB_RailDepot")>>
<div class="btn"><<button _gbLbl "GB_RailDepot">><</button>></div>
<<set _gbLbl = siteLinkLabel("GB_Garage")>>
<div class="btn"><<button _gbLbl "GB_Garage">><</button>></div>
</div>
<div class="btn padding-top"><<button "Back to Skid Row" "SR_SkidRow">><</button>></div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<if _night and !streetActionDone(getGangWorld(), "boxcar")>>
<div class="btn"><<button "Break into a boxcar" "SR_RailYard">>
<<set $gangStreetMsg = streetRobBoxcar()>>
<<SpendTime 45>>
<</button>></div>
<<elseif not _night>>
<div class="gang-hint">Too many eyes in daylight. The boxcars can wait for dark.</div>
<</if>>
<<GangShipmentLever>>
<<EachActions>>
</div>
</fieldset>
</div>
<<PeopleAround>>
<<PoliceChecker>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _res = finishStreetFight($gangFight, true)>>
<<set _back = ($gangFight and $gangFight.place) ? $gangFight.place : "SR_SkidRow">>
<<set $player.money += _res.money>>
<<unset $gangFight>>
<<unset $interactionNpc>>
<<SetBackground>>
<div class="gang-street-msg"><p><<print _res.text>></p></div>
<div class="btn padding-top"><<button "Walk it off" _back>><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _res = finishStreetFight($gangFight, false)>>
<<set _back = ($gangFight and $gangFight.place) ? $gangFight.place : "SR_SkidRow">>
<<unset $gangFight>>
<<unset $interactionNpc>>
<<SetBackground>>
<div class="gang-street-msg"><p><<print _res.text>></p></div>
<div class="btn padding-top"><<button "Get up" _back>><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Locations/City/SkidRow/Warehouse/Locker_Room.jpg">>
<<timed 0.2s>>
<div class="centre-text">Locker Room</div>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn"><<button "Shower Room" "UFG_Shower_Room">><</button>></div>
<div class="btn padding-top"><<button "Leave" "Underground_Fight_Gym">><</button>></div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
<<HiddenCamPlantButton "ufg">>
</div>
</fieldset>
</div>
<<if $player.attributes && $player.attributes.corruption && $player.attributes.corruption.value >= 35 && !$player.dailyEvents.isEventRegistered($player.info.id, "UFG_LockerRoom_PostFightHookup")>>
<<LocationEvent 'Linger by the lockers' 'UFG_LockerRoom_PostFightHookup' "transition" "Media\\Other\\Notice_Event.png">>
<</if>>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Locations/City/SkidRow/Warehouse/Shower_Room.jpg">>
<<timed 0.2s>>
<div class="centre-text">Shower Room</div>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn"><<button "Leave" "UFG_Locker_Room">><</button>></div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
</div>
</fieldset>
</div>
<<RandomEvent "UFG_Shower">>
<</timed>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Locations/City/SkidRow/Warehouse/Warehouse_Basement.jpg">>
<<timed 0.2s>>
<div class="centre-text">Fight Club</div>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn"><<button "Locker Room" "UFG_Locker_Room">><</button>></div>
<div class="btn padding-top"><<button "Leave" "SR_SkidRow">><</button>></div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
</div>
</fieldset>
</div>
<<PeopleAround>>
<<if $player.characterEvents.isEventRegistered($player.info.id, "GrantMeet") == false>>
<<done>><<LocationEvent 'Grant Maddox' 'Grant_FirstMeet' "transition" "Media\\Characters\\QuestChars\\UFG\\Grant Maddox.jpg" "npc-card" "Combat coach">><</done>>
<<else>>
<<done>><<LocationEvent 'Grant Maddox' 'Grant_Checker' "transition" "Media\\Characters\\QuestChars\\UFG\\Grant Maddox.jpg" "npc-card" "Combat coach">><</done>>
<</if>>
<<done>><<LocationEvent 'Tess Carter' 'Tess_Checker' "transition" "Media\\Characters\\QuestChars\\UFG\\Tess Carter.jpg" "npc-card" "Defense trainer">><</done>>
<<done>><<LocationEvent 'Clay Harper' 'Clay_Checker' "transition" "Media\\Characters\\QuestChars\\UFG\\Clay Harper.jpg" "npc-card" "Dexterity trainer">><</done>>
<<done>><<LocationEvent 'Marcus Bell' 'Marcus_Checker' "transition" "Media\\Characters\\QuestChars\\UFG\\Marcus Bell_M.jpg" "npc-card" "Strength trainer">><</done>>
<</timed>>
<</nobr>><<nobr>>
/* The old Slums stub (nothing linked to it) now leads to the Tenements of
Skid Row, which took over its role (gang plan decision R15). */
<<goto "SR_Tenements">>
<</nobr>><<widget "WorkplaceLocation">>
<<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<EachLoc>>
<<set _wpTitle = _args[0]>>
<<set _wpImage = _args[1]>>
<<set _wpHubTitle = _args[2]>>
<<set _wpHubPassage = _args[3]>>
<<set _wpDescription = _args[4]>>
<<set _wpObservation = _args[5]>>
<<set _wpHours = _args[6]>>
<<SetBackground _wpImage>>
<<timed 0.2s>>
<div class="centre-text"><<= _wpTitle>></div>
<<ChatMessage _wpDescription>>
<div class="grid-row-twice">
<fieldset>
<legend>Navigation</legend>
<div class="btn"><<button `"Back to " + _wpHubTitle` _wpHubPassage>><</button>></div>
<div class="padding-top"><i><<= _wpHours>></i></div>
</fieldset>
<fieldset>
<legend>Activity</legend>
<div class="btn-container">
<<EachActions>>
<<capture _wpObservation>>
<div class="btn"><<button "Observe the work">>
<<SpendTime 10>>
<<replace "#workplace-observation">><<ChatMessage _wpObservation>><</replace>>
<</button>></div>
<</capture>>
</div>
<div id="workplace-observation"></div>
</fieldset>
</div>
<<PeopleAround>>
<<PoliceChecker>>
<</timed>>
<</nobr>>
<</widget>><<WorkplaceLocation "Construction Site" "Media/Locations/Workplaces/construction_site.png" "Downtown" "Downtown" "A controlled visitor lane runs beside a half-built tower. Cranes, concrete crews and delivery teams keep the site moving behind the barriers." "A crane eases a load of rebar into place while two workers guide it with tag lines and precise hand signals. The lift pauses until the route below is completely clear." "Active work: 07:00-18:00. Visitors remain inside the marked safe lane.">><<WorkplaceLocation "Tech Company" "Media/Locations/Workplaces/tech_company.png" "Business District" "Business_District" "Glass meeting rooms and rows of monitors overlook Viceburg's skyline. Most conversations happen in low voices between desks and the server room." "A short stand-up meeting turns into a focused debugging session. A tester reproduces a failure while a programmer traces it and the rest of the team quietly updates the release plan." "Office hours: weekdays, 08:00-19:00. Guests use the reception area.">><<WorkplaceLocation "Fire Station" "Media/Locations/Workplaces/fire_station.png" "Downtown" "Downtown" "The apparatus bay smells of rubber, metal and clean canvas. Engines are kept ready while the duty crew checks medical and rescue equipment." "The crew works through a methodical engine check: air tanks are counted, hose couplings are tested and a paramedic replaces a sealed medical kit before the next call." "Staffed around the clock. The public desk and apparatus-bay viewing line remain accessible.">><<WorkplaceLocation "Factory" "Media/Locations/Workplaces/factory.png" "Downtown" "Downtown" "A visitor aisle looks across a busy metal-products line. Presses, conveyors and inspection tables run in a steady industrial rhythm." "A quality inspector stops one station after finding a rough edge. The operator changes a worn tool, checks the guard and sends a clean test piece down the line." "Three-shift operation. Visitor access is supervised during 08:00-18:00.">><<WorkplaceLocation "Power Plant" "Media/Locations/Workplaces/power_plant.png" "Downtown" "Downtown" "From the supervised walkway, rows of turbines and steel pipework fill the hall. Technicians move between control cabinets without interrupting the constant mechanical hum." "A technician compares a vibration reading with the control-room log, then makes a small load adjustment. The change is checked by a second operator before it is accepted." "Staffed around the clock. The visitor walkway operates 09:00-17:00.">><<WorkplaceLocation "Post Office" "Media/Locations/Workplaces/post_office.png" "Business District" "Business_District" "The public counter faces a compact sorting floor filled with parcel cages and mail tubs. Couriers come and go through a rear loading door." "A late delivery reaches the sorting floor. Clerks divide envelopes by route while a courier reorganizes the van run so priority parcels still leave on time." "Public counter: 08:00-18:00.">><<WorkplaceLocation "Logistics Center" "Media/Locations/Workplaces/logistics_center.png" "Downtown" "Downtown" "Conveyors, pallet racks and loading bays stretch across the distribution hall. Visitors watch from a painted walkway above the vehicle lanes." "A scanner flags a parcel for the wrong route. A dispatcher diverts it to another belt while a forklift driver clears space at the correct outbound dock." "Active operation: 06:00-22:00. Visitors remain on the marked walkway.">><<WorkplaceLocation "City Hall" "Media/Locations/Workplaces/city_hall.png" "Business District" "Business_District" "The old stone atrium holds modern service counters for permits, records and social services. Clerks move between the public desks and secured offices." "A clerk notices that two permit applications depend on the same inspection. After a quick call upstairs, both citizens receive one coordinated appointment instead of conflicting dates." "Public offices: weekdays, 08:00-17:00.">><<WorkplaceLocation "News Office" "Media/Locations/Workplaces/news_office.png" "Business District" "Business_District" "Reporters, editors and camera crews share an open newsroom beside small edit suites and a local broadcast set." "A producer reshuffles the evening rundown when a reporter brings in new footage. An editor verifies the source while the camera team prepares a short live segment." "Newsroom staffed daily. Visitor desk: 08:00-20:00.">><<WorkplaceLocation "Auto Repair Shop" "Media/Locations/Workplaces/auto_repair_shop.png" "Downtown" "Downtown" "Several service bays open off a small customer reception area. Tools and diagnostic carts are organized around cars in different stages of repair." "A mechanic traces an intermittent charging fault to a loose ground rather than replacing the alternator. The connection is cleaned, tightened and tested under load." "Open daily: 08:00-20:00. Customers stay behind the marked bay line.">><<WorkplaceLocation "Taxi Depot" "Media/Locations/Workplaces/taxi_depot.png" "Downtown" "Downtown" "Drivers cycle through the dispatch office, fuel lane and maintenance garage before heading back into the city." "A dispatcher balances three new fares against traffic conditions, sending the nearest free cars while a mechanic clears another taxi for the evening shift." "Dispatch operates around the clock. The office counter is open to visitors.">><<WorkplaceLocation "Sanitation Depot" "Media/Locations/Workplaces/waste_depot.png" "Downtown" "Downtown" "Collection trucks pass through the wash and weigh lanes beside a covered sorting hall. The visitor route stays separated from heavy equipment." "A returning truck is weighed and sent to the correct unloading bay. A shift supervisor spots a blocked lane and reroutes the next crew before a queue can form." "Main shift: 05:00-18:00. Access is limited to the supervised visitor route.">><<WorkplaceLocation "Law Office" "Media/Locations/Workplaces/law_office.png" "Business District" "Business_District" "A quiet reception area opens onto glass-fronted meeting rooms and a working legal library. Assistants move case files between offices and conference tables." "A paralegal catches a date mismatch in a case file. The attorney checks the original record, corrects the draft and calls the client before the error reaches court." "Office hours: weekdays, 09:00-18:00.">><<nobr>>
<<include "UpdateAll">>
<<set _aliceIcon = "Media\\Characters\\QuestChars\\Alice\\Alice.png">>
<<DrawImg _aliceIcon>>
<<ChatMessage 'You step into Sarah\'s room, but she isn\'t there. Instead Alice - your friend\'s sister\'s friend - lounges on the couch, dark hair cascading over her shoulders. A black T‑shirt hugs her firm breasts, nipples faintly imprinting the fabric. She doesn\'t even glance up as you approach, yet you already know you won\'t back down.'>>
<<switch $player.gender()>>
<<case "Male">>
<div class="btn padding-top"><<button "Dominant path" "AliceQuest1_Start_Male_Dom">><<run $player.characterEvents.registerEvent($player.info.id, "AliceQuest1", 1)>><</button>></div>
<div class="btn padding-top"><<button "Submissive path" "AliceQuest1_Start_Male_Sub">><<run $player.characterEvents.registerEvent($player.info.id, "AliceQuest1", 1)>><</button>></div>
<<case "Female">>
<div class="btn padding-top"><<button "Dominant path" "AliceQuest1_Start_Female_Dom">><<run $player.characterEvents.registerEvent($player.info.id, "AliceQuest1", 1)>><</button>></div>
<div class="btn padding-top"><<button "Submissive path" "AliceQuest1_Start_Female_Sub">><<run $player.characterEvents.registerEvent($player.info.id, "AliceQuest1", 1)>><</button>></div>
<<case "Shemale">>
<div class="btn padding-top"><<button "Dominant path" "AliceQuest1_Start_Trans_Dom">><<run $player.characterEvents.registerEvent($player.info.id, "AliceQuest1", 1)>><</button>></div>
<div class="btn padding-top"><<button "Submissive path" "AliceQuest1_Start_Trans_Sub">><<run $player.characterEvents.registerEvent($player.info.id, "AliceQuest1", 1)>><</button>></div>
<</switch>>
<div class="btn padding-top"><<button "Leave" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _aliceIcon = "Media\\Characters\\QuestChars\\Alice\\Alice.png">>
<<DrawImage _aliceIcon>>
<<ChatWithoutNPC 'Alice' _aliceIcon 'Hey, I\'m Sarah\'s friend… well, her brother\'s, actually *- you say, voice confident with a hint of mockery.*'>>
<<ChatMessage 'Alice finally looks up, lips curling into a smug smirk. She sets her phone aside, crosses one leg over the other, and leans forward-clearly ready to put you in your place.'>>
<<ChatWithoutNPC 'Alice' _aliceIcon 'Seriously? That\'s all you\'ve got? I almost told you to fuck off, but… *She squints, studying you.* Tell me, you like being in charge, don\'t you?'>>
<<Chat $player '*Warmth spreads between your legs at the challenge; you hold her gaze and step closer.* Yeah, I do. What about you? Wanna try submitting to me for a change?'>>
<<ChatMessage 'Alice freezes, brows shooting up; she clearly didn\'t expect that.'>>
<<ChatWithoutNPC 'Alice' _aliceIcon 'Me? Submit? Are you fucking kidding?'>>
<<Chat $player '*You close the distance, faces nearly touching, and murmur firmly:* Not kidding. Come on, Alice, I can see you\'re curious. Try it - I promise you\'ll like it.'>>
<<ChatMessage 'She swallows; a faint flush tints her cheeks, dominance faltering.'>>
<<ChatWithoutNPC 'Alice' _aliceIcon 'Fine… but if I don\'t like it, you\'ll regret it.'>>
<<ChatMessage 'Grinning, you seize her wrist, yank her upright, and spin her so her back presses to your chest. She gasps but doesn\'t resist.'>>
<<Chat $player 'Take off your jeans. You\'re mine now.'>>
<<ChatMessage 'Hands trembling, she unbuttons her jeans and slides them, along with black lace panties, to her knees-baring a firm, faintly pink ass. You caress the smooth skin; your own pussy dampens with anticipation.'>>
<<Chat $player 'Bend over.'>>
<<ChatMessage 'Slowly she obeys, bracing on the couch. Between her parted thighs her pussy already glistens. You step back to admire, then deliver a sharp smack. *Slap!* The sound echoes; Alice yelps, and wetness beads along her slit. A second, harder strike leaves a red print; your fingers graze slick lips, making her tremble.'>>
<<Video "Media\\Characters\\QuestChars\\Alice\\sex\\spanking_female.mp4">>
<<Chat $player 'You like it, don\'t you?'>>
<<ChatWithoutNPC 'Alice' _aliceIcon 'I… don\'t know, *she breathes, voice shaking with lust.*'>>
<<ChatMessage 'You spank her again - then again - each blow drawing louder moans. Droplets trail down her thigh; her legs wobble. After a ringing smack she convulses, moans rising to a scream as orgasm rips through her: pussy clenching, heat squirting, ass glowing red.'>>
<<ChatMessage 'Alice collapses onto the couch, panting, face awash with shock and pleasure. You stand over her, chest heaving, cunt throbbing with need.'>>
<<Chat $player 'So, Alice, how\'d you like being my little slut?'>>
<<ChatMessage 'Still catching her breath, she looks up-eyes bright, cheeks flushed.'>>
<<ChatWithoutNPC 'Alice' _aliceIcon 'Maybe… yeah. But don\'t think I\'m giving up.'>>
<<ChatMessage 'You laugh softly, knowing this is only the beginning.'>>
<div class="btn padding-top"><<button "Continue" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _aliceIcon = "Media\\Characters\\QuestChars\\Alice\\Alice.png">>
<<DrawImage _aliceIcon>>
<<ChatMessage 'You step into Sarah\'s room, but she isn\'t there. Instead Alice - your friend\'s sister\'s friend - lounges on the couch, dark hair spilling over her shoulders. A black T‑shirt clings to her firm breasts, nipples faintly pressing through the fabric. She doesn\'t even glance up as you approach, yet you know you won\'t back down.'>>
<<Chat $player 'Hey, I\'m Sarah\'s friend… well, her brother\'s, actually *- you start, voice confident with a hint of mockery.*'>>
<<ChatMessage 'Alice looks up, lips curling into a smug smirk. She sets her phone aside, crosses her legs, and leans forward-clearly ready to put you in your place.'>>
<<ChatWithoutNPC 'Alice' _aliceIcon 'Seriously? That\'s all you\'ve got? I almost told you to fuck off, but… *She pauses, squinting.* Tell me, you like being in charge, don\'t you?'>>
<<Chat $player '*Your cock stiffens at the challenge.* Yeah, I do. What about you? Wanna try submitting to me for a change?'>>
<<ChatMessage 'Alice freezes, brows shooting up.'>>
<<ChatWithoutNPC 'Alice' _aliceIcon 'Me? Submit? Are you fucking kidding?'>>
<<Chat $player '*You lean in, faces almost touching, and murmur firmly:* Not kidding. Come on, Alice, I can see you\'re curious. Try it - I promise you\'ll like it.'>>
<<ChatMessage 'She swallows; a faint flush colors her cheeks.'>>
<<ChatWithoutNPC 'Alice' _aliceIcon 'Fine… but if I don\'t like it, you\'ll regret it.'>>
<<ChatMessage 'Grinning, you seize her wrist, yank her up, spin her so her back presses to your chest. She gasps but doesn\'t resist; heat radiates through the thin fabric between you.'>>
<<ChatMessage 'You shove her face-down over the arm of the couch and start on her ass through the tight denim. Each swat makes her jerk, and by the fifth one she is pushing her ass back to meet your hand.'>>
<<Video "Media\\Characters\\QuestChars\\Alice\\sex\\spanking_clothed.mp4">>
<<Chat $player 'Take off your jeans. You\'re mine now.'>>
<<ChatMessage 'Hands trembling, she unbuttons her jeans and slides them-along with black lace panties-to her knees, baring a smooth, faintly pink ass. Your palm glides over her skin; she tenses under your touch.'>>
<<Chat $player 'Bend over.'>>
<<ChatMessage 'Slowly she obeys, bracing on the couch. Between parted thighs her pussy glistens, already wet despite her doubts. You step back, admire the view, then deliver a sharp smack-*slap!*-echoing through the room. Alice yelps; wetness beads along her slit. A second, harder strike leaves a red print.'>>
<<Video "Media\\Characters\\QuestChars\\Alice\\sex\\spanking.mp4">>
<<Chat $player 'You like it, don\'t you?'>>
<<ChatWithoutNPC 'Alice' _aliceIcon 'I… don\'t know, *she breathes, voice quivering with lust.*'>>
<<ChatMessage 'You spank her again and again; each blow elicits louder moans. Droplets trail down her thigh, legs beginning to buckle. After another ringing smack she shudders violently, moans rising to a scream as orgasm tears through her - pussy clenching, wet heat squirting, ass glowing red.'>>
<<ChatMessage 'Alice collapses onto the couch, panting, face a blend of shock and pleasure. You stand over her, smirking, cock rock‑hard from the sight of her submission.'>>
<<Chat $player 'So, Alice, how\'d you like being my little slut?'>>
<<ChatMessage 'She looks up, still catching her breath.'>>
<<ChatWithoutNPC 'Alice' _aliceIcon 'Maybe… yeah. But don\'t think I\'m giving up.'>>
<<ChatMessage 'You laugh softly, knowing this is only the beginning.'>>
<div class="btn padding-top"><<button "Continue" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _aliceIcon = "Media\\Characters\\QuestChars\\Alice\\Alice.png">>
<<DrawImage _aliceIcon>>
<<ChatMessage 'You step into Sarah\'s room, but she isn\'t there. Instead Alice - your friend\'s sister\'s friend - lounges on the couch, dark hair cascading over her shoulders. A black T‑shirt clings to her firm breasts, nipples faintly pressing through the fabric. She doesn\'t even glance up as you approach, yet your cock hardens beneath your skirt at the thought of what comes next.'>>
<<Chat $player 'Hey, I\'m Sarah\'s friend… well, her brother\'s, actually *- you say, voice confident with a hint of mockery.*'>>
<<ChatMessage 'Alice looks up, lips curling into a smug smirk. She sets her phone aside, crosses her legs, and leans forward-clearly ready to put you in your place.'>>
<<ChatWithoutNPC 'Alice' _aliceIcon 'Seriously? That\'s all you\'ve got? I almost told you to fuck off, but… *She squints at you.* Tell me, you like being in charge, don\'t you?'>>
<<Chat $player '*Your cock throbs at the challenge as you step closer.* Yeah, I do. What about you? Wanna try submitting to me for a change?'>>
<<ChatMessage 'Alice freezes, brows shooting up.'>>
<<ChatWithoutNPC 'Alice' _aliceIcon 'Me? Submit? Are you fucking kidding?'>>
<<Chat $player '*Leaning in until your faces nearly touch, you murmur:* Not kidding. Come on, Alice, I can see you\'re curious. Try it - I promise you\'ll like it.'>>
<<ChatMessage 'She swallows; a faint flush tints her cheeks.'>>
<<ChatWithoutNPC 'Alice' _aliceIcon 'Fine… but if I don\'t like it, you\'ll regret it.'>>
<<ChatMessage 'Grinning, you seize her wrist, yank her from the couch, and spin her so her back presses to your chest. She gasps but doesn\'t resist; your cock, rock‑hard, strains against your panties.'>>
<<Chat $player 'Take off your jeans. You\'re mine now.'>>
<<ChatMessage 'Hands trembling, she unbuttons her jeans and slides them-along with black lace panties-to her knees, baring a firm, faintly pink ass. Your palm glides over her skin; your cock pulses, lifting the hem of your skirt.'>>
<<Chat $player 'Bend over.'>>
<<ChatMessage 'Slowly she obeys, bracing on the couch. Between parted thighs her pussy glistens. You step back to admire, then deliver a sharp smack-*slap!*-echoing through the room. Alice yelps; wetness beads along her slit. A second, harder strike leaves a red print as your fingers graze slick lips, drawing a moan.'>>
<<Video "Media\\Characters\\QuestChars\\Alice\\sex\\spanking_female.mp4">>
<<Chat $player 'You like it, don\'t you?'>>
<<ChatWithoutNPC 'Alice' _aliceIcon 'I… don\'t know, *she breathes, voice shaking with lust.*'>>
<<ChatMessage 'You spank her again - then again - each blow louder than the last. Droplets trail her thigh; your cock juts hot and hard beneath the skirt. After a ringing smack she convulses, moans ripping into a scream as orgasm floods her - pussy clenching, heat squirting, ass glowing red.'>>
<<ChatMessage 'Alice collapses onto the couch, panting, face a mix of shock and pleasure. You stand over her, smirking, cock still protruding and glistening with precum.'>>
<<Chat $player 'So, Alice, how\'d you like being my little slut?'>>
<<ChatMessage 'She looks up through heavy breaths.'>>
<<ChatWithoutNPC 'Alice' _aliceIcon 'Maybe… yeah. But don\'t think I\'m giving up.'>>
<<ChatMessage 'You laugh softly, knowing this is only the beginning.'>>
<div class="btn padding-top"><<button "Continue" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _aliceIcon = "Media\\Characters\\QuestChars\\Alice\\Alice.png">>
<<DrawImage _aliceIcon>>
<<ChatMessage 'You step into Sarah\'s room, but she isn\'t there. Instead Alice - your friend\'s sister\'s friend - lies sprawled on the couch, sharp gaze and commanding posture quickening your pulse. Dark hair flows over her shoulders, and a black T‑shirt clings to her firm breasts, nipples faintly visible through the fabric. She doesn\'t glance up as you approach, yet your body already reacts to her vibe.'>>
<<Chat $player 'Hey, I\'m Sarah\'s friend… well, her brother\'s, really *- you say, trying to mask the slight tremor in your voice.*'>>
<<ChatMessage 'Alice finally looks up, lips twisting into a disdainful - yet undeniably sexy - smirk. She sets her phone aside, slowly crosses her legs (giving you a fleeting glimpse of tight‑jean‑wrapped thighs), and leans forward, eyes stripping you bare.'>>
<<ChatWithoutNPC 'Alice' _aliceIcon 'Seriously? That\'s all you can muster? I almost told you to fuck off, but… *She narrows her green eyes.* Tell me, do you like it when someone like me dominates you?'>>
<<ChatMessage 'Heat pools between your legs at her words; her challenge only turns you on more.'>>
<<Chat $player 'Yeah, I do. *You whisper, voice thick with desire.*'>>
<<ChatMessage 'Alice laughs - a low, throaty sound that sends shivers down your spine. Rising, she closes the distance; her sharp, musky scent makes you dizzy. Her hand presses to your chest, fingers gripping your blouse lightly… then shoves you back.'>>
<<ChatWithoutNPC 'Alice' _aliceIcon 'On your knees, slut.'>>
<<ChatMessage 'You drop instantly, staring up at her; your pussy already throbs with excitement. Alice looms above, hands on hips, almost godlike.'>>
<<ChatWithoutNPC 'Alice' _aliceIcon 'Wanna lick my pussy? Prove you\'re worth it first-tell me how pathetic you are, right now.'>>
<<Chat $player '*Heat consumes you; panties soaked, you lower your head and rasp:* I\'m pathetic… I\'ll do anything you want, Alice.'>>
<<ChatMessage 'Eyes flashing with lust, she unbuttons her jeans, sliding them and black lace panties down. Her pussy-pink, swollen, glistening-greets you beneath a neat triangle of dark hair. She sinks onto the couch, legs spread wide.'>>
<<ChatWithoutNPC 'Alice' _aliceIcon 'Crawl to me *- she pats her thigh.* Lick me until I cum all over your face.'>>
<<ChatMessage 'Completely under her spell, you crawl forward, inner thighs rubbing, wetness trickling downward. Between her legs you inhale her sweet‑tangy scent and press your lips to slick flesh. Your tongue parts her folds, tasting heat and juice. Alice moans, hips twitching; she grabs your hair, pulling you closer.'>>
<<Video "Media\\Characters\\QuestChars\\Alice\\sex\\lick.mp4">>
<<ChatWithoutNPC 'Alice' _aliceIcon 'Deeper.'>>
<<ChatMessage 'Obedient, you bury your tongue inside her, then suck her swelling clit. Flow gathers, coating your chin. Her moans rise; hips grind against your face, smearing wetness over your skin.'>>
<<ChatWithoutNPC 'Alice' _aliceIcon 'On your back. I want to sit on that pretty face.'>>
<<ChatMessage 'She drags you up onto the couch, pushes you flat on your back, kicks her jeans off and climbs over you. Her dripping cunt settles on your mouth, and she rides your tongue with her full weight, rolling her hips while you lick and swallow.'>>
<<Video "Media\\Characters\\QuestChars\\Alice\\sex\\lick_facesit.mp4">>
<<ChatWithoutNPC 'Alice' _aliceIcon 'Yes-lick me like the slut you are!'>>
<<ChatMessage 'Her grip in your hair hurts, but you keep pace until her thighs quake and her pussy clenches. With a scream she orgasms, hot juices flooding your mouth as she grinds down harder on your face.'>>
<<ChatMessage 'When she finally climbs off, you lie there gasping-cheeks slick, chest heaving, pussy burning with unmet need. Alice wipes her thighs with her shirt\'s hem, pulls her panties and jeans back on, then regards you with a lazy, satisfied smirk.'>>
<<ChatWithoutNPC 'Alice' _aliceIcon 'Not bad for a first go. Maybe I\'ll fuck your face again-if you\'re good.'>>
<<ChatMessage 'You stay sprawled on the couch, drenched in her scent and taste, wholly surrendered to her will.'>>
<div class="btn padding-top"><<button "Continue" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _aliceIcon = "Media\\Characters\\QuestChars\\Alice\\Alice.png">>
<<DrawImage _aliceIcon>>
<<ChatMessage 'You step into Sarah\'s room, but she isn\'t there. Instead Alice - your friend\'s sister\'s friend - lies sprawled on the couch, sharp gaze and commanding posture drying your mouth. Long dark hair drapes her shoulders, and a black T‑shirt hugs firm breasts, nipples faint beneath the fabric. She doesn\'t even glance up, yet your heart already pounds.'>>
<<Chat $player 'Hey, I\'m Sarah\'s friend… well, her brother\'s, really *- you say, trying to hide the tremor in your voice.*'>>
<<ChatMessage 'Alice looks up, lips twisting into a disdainful - yet damn sexy - smirk. She sets her phone aside, slowly crosses her legs, and leans forward, eyes stripping you bare.'>>
<<ChatWithoutNPC 'Alice' _aliceIcon 'Seriously? That\'s all you can muster? I almost told you to fuck off, but… *She narrows green eyes.* Tell me, do you like it when someone like me dominates you?'>>
<<ChatMessage 'Heat flares; your cock stiffens at her words.'>>
<<Chat $player 'Yeah, I do.'>>
<<ChatMessage 'A low, throaty laugh rolls from Alice, shivering down your spine. She stands, closes the distance, musky scent dizzying. Fingers grip your shirt - then shove you back.'>>
<<ChatWithoutNPC 'Alice' _aliceIcon 'On your knees, slut.'>>
<<ChatMessage 'You drop instantly; your cock throbs as you stare up. Alice looms, hands on hips.'>>
<<ChatWithoutNPC 'Alice' _aliceIcon 'Wanna lick my pussy? Prove you\'re worth it first-tell me how pathetic you are, right now.'>>
<<Chat $player 'I\'m pathetic… I\'ll do anything you want, Alice.'>>
<<ChatMessage 'Her smirk widens; lust flashes in her eyes. She unbuttons jeans, sliding them and black lace panties down, baring a pink, glistening pussy beneath a neat triangle of dark hair. Sinking onto the couch, she spreads wide.'>>
<<ChatWithoutNPC 'Alice' _aliceIcon 'Crawl to me, *- she pats her thigh-* and lick me until I cum all over your face.'>>
<<ChatMessage 'Completely enthralled, you crawl forward; your cock rubs your pants. Between her thighs you inhale sweet‑tangy arousal and press lips to slick flesh. Tongue parts her folds; Alice moans, hips twitch, and she fists your hair.'>>
<<Video "Media\\Characters\\QuestChars\\Alice\\sex\\lick_male.mp4">>
<<ChatWithoutNPC 'Alice' _aliceIcon 'Deeper.'>>
<<ChatMessage 'You bury your tongue, suck her swelling clit; wetness coats your chin. Her hips grind harder, smearing juice across your face.'>>
<<ChatWithoutNPC 'Alice' _aliceIcon 'Yes, lick me like the slut you are.'>>
<<ChatMessage 'You work faster until her thighs quake; pussy clenches around your tongue. With a scream she climaxes, hot wave flooding your mouth while she holds you tight. When she finally releases, you fall back-gasping, cock aching. She wipes glistening thighs, pulls panties and jeans up, then tosses a lazy, satisfied smirk.'>>
<<ChatWithoutNPC 'Alice' _aliceIcon 'Not bad for a first go. Maybe I\'ll fuck your face again-if you\'re good.'>>
<<ChatMessage 'You remain on your knees, drenched in her scent and taste, utterly surrendered to her will.'>>
<div class="btn padding-top"><<button "Continue" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _aliceIcon = "Media\\Characters\\QuestChars\\Alice\\Alice.png">>
<<DrawImage _aliceIcon>>
<<ChatMessage 'You step into Sarah’s room, but she isn’t there. Instead Alice - your friend’s sister’s friend - lies sprawled on the couch, sharp gaze and commanding posture sending your pulse racing. Dark hair flows over her shoulders, and a black T‑shirt hugs firm breasts, nipples faint beneath the fabric. Your cock already stirs beneath your skirt in response to her aura.'>>
<<Chat $player 'Hey, I\'m Sarah’s friend… well, her brother’s, really *- you say, trying to mask the tremor in your voice.*'>>
<<ChatMessage 'Alice looks up, lips twisting into a disdainful - yet undeniably sexy - smirk. She sets her phone aside, slowly crosses her legs, and leans forward, eyes stripping you bare.'>>
<<ChatWithoutNPC 'Alice' _aliceIcon 'Seriously? That’s all you can muster? I almost told you to fuck off, but… *She narrows her green eyes.* Tell me, do you like it when someone like me dominates you?'>>
<<Chat $player '*A jolt of heat surges; your cock hardens fully.* Yeah, I do.'>>
<<ChatMessage 'A low, throaty laugh rolls from Alice, shivering down your spine. She rises and closes the distance - musk sharp and dizzying - then grips your blouse and shoves you back.'>>
<<ChatWithoutNPC 'Alice' _aliceIcon 'On your knees, slut.'>>
<<ChatMessage 'You drop instantly; your cock throbs, straining the skirt. Alice looms godlike, hands on hips.'>>
<<ChatWithoutNPC 'Alice' _aliceIcon 'Wanna lick my pussy? Prove you’re worth it first-tell me how pathetic you are, right now.'>>
<<Chat $player '*Heat floods you; precum stains your panties.* I’m pathetic… I’ll do anything you want, Alice.'>>
<<ChatMessage 'Smirking, she unbuttons her jeans and slides them, along with black lace panties, to mid‑thigh-revealing a pink, glistening pussy beneath a neat triangle of dark hair. She reclines on the couch, legs spread wide.'>>
<<ChatWithoutNPC 'Alice' _aliceIcon 'Crawl to me *- she pats her thigh-* and lick me until I cum all over your face.'>>
<<ChatMessage 'Under her spell, you crawl forward; your cock swings heavy and hot. Inhaling her sweet‑tangy arousal, you press lips to slick folds and part them with your tongue. Alice moans, hips twitching, fingers knotting in your hair.'>>
<<Video "Media\\Characters\\QuestChars\\Alice\\sex\\lick_trans.mp4">>
<<ChatWithoutNPC 'Alice' _aliceIcon 'Deeper.'>>
<<ChatMessage 'You bury your tongue, then suck her swelling clit; juice coats your chin while her hips grind against your face.'>>
<<ChatWithoutNPC 'Alice' _aliceIcon 'Yes, lick me like the slut you are!'>>
<<ChatMessage 'You quicken the pace until her thighs quake and pussy clenches. With a scream she erupts, hot waves flooding your mouth as she holds you tight. At last she releases you; you fall back gasping, cock jutting from beneath the skirt, slick with precum.'>>
<<ChatMessage 'Alice wipes her thighs with her shirt’s edge, pulls panties and jeans up, and tosses a lazy, satisfied smirk.'>>
<<ChatWithoutNPC 'Alice' _aliceIcon 'Not bad for a first go. Maybe I’ll fuck your face again-if you’re good.'>>
<<ChatMessage 'You remain on your knees, drenched in her scent and taste, cock still pulsing with unmet desire-utterly surrendered to her will.'>>
<div class="btn padding-top"><<button "Continue" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _aliceIcon = "Media\\Characters\\QuestChars\\Alice\\Alice.png">>
<<DrawImg _aliceIcon>>
<<ChatWithoutNPC 'Alice' _aliceIcon 'Ah, it\'s you again. You did well last time; how about continuing?'>>
<<Chat $player 'What do you mean?'>>
<<ChatWithoutNPC 'Alice' _aliceIcon 'Last time was just child\'s play; I see you\'re capable of more.'>>
<<ChatWithoutNPC 'Alice' _aliceIcon 'You can train your pets. I recently acquired an apartment and set it up for training my bitches. Here, take the key if you want to train someone there. But it\'s not free; each session will cost you $200, since I spent money on the apartment and equipment.'>>
<<if $player.characterEvents.isEventRegistered($player.info.id, "CanTrainNPC") == false>>
<<run $player.characterEvents.registerEvent($player.info.id, "CanTrainNPC", 1)>>
<</if>>
<div class="btn padding-top"><<button "Continue" $player.info.currentLocation>><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _aliceIcon = "Media\\Characters\\QuestChars\\Alice\\Alice.png">>
<<DrawImage _aliceIcon>>
<<if $player.characterEvents.isEventRegistered($player.info.id, "AliceQuest1") == false>>
<<goto "AliceQuest1_Start">>
<<elseif $player.characterEvents.isEventRegistered($player.info.id, "CanTrainNPC") == false>>
<<goto "AliceQuest2_Start">>
<</if>>
<div class="btn padding-top"><<button "Leave" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
/* Use $interactionNpc directly - it references the character in $Characters array */
<<set _npcName = $interactionNpc.info.firstName>>
/* Get submission stats */
<<set $targetSubmission = $interactionNpc.attributes.submission>>
<<set $targetSubmissionProgression = $interactionNpc.progression.submission>>
<<set $playerDominance = $player.attributes.dominance>>
<<set $playerEnergy = $player.status.energy.value>>
<<set $npcEnergy = $interactionNpc.status.energy.value>>
<<ShowNpcIcon $interactionNpc>>
<<Chat $interactionNpc "So... this is the place, huh? It's... intense.">>
<div class="bdsm-training-container">
<div class="room-header">
<h2>⛓️ BDSM Training Room</h2>
<p class="room-description">Alice's private training space. Dim red lighting, leather furniture, and various equipment.</p>
</div>
/* Custom progress bar */
<fieldset class="bdsm-fieldset">
<legend><<print _npcName>> - Submission Stats</legend>
<div class="bdsm-stats-grid">
<div class="bdsm-stat-row">
<span class="bdsm-stat-label">⛓️ Submission Level:</span>
<span class="bdsm-stat-value"><<print $targetSubmission.value>>/10</span>
</div>
<div class="bdsm-stat-row">
<span class="bdsm-stat-label">📈 Progress to Next:</span>
<div class="bdsm-progress-container">
<<set _progressPercent = Math.floor(($targetSubmissionProgression.value / $targetSubmissionProgression.max) * 100)>>
<div class="bdsm-progress-bar">
<div class="bdsm-progress-fill" @style="'width: ' + _progressPercent + '%'"></div>
</div>
<span class="bdsm-progress-text"><<print _progressPercent>>%</span>
</div>
</div>
<div class="bdsm-stat-row">
<span class="bdsm-stat-label">👑 Your Dominance:</span>
<span class="bdsm-stat-value"><<print $playerDominance.value>>/10</span>
</div>
<div class="bdsm-stat-row">
<span class="bdsm-stat-label">⚡ Your Energy:</span>
<span class="bdsm-stat-value"><<print $playerEnergy>></span>
</div>
<div class="bdsm-stat-row">
<span class="bdsm-stat-label">⚡ <<print _npcName>>'s Energy:</span>
<span class="bdsm-stat-value"><<print $npcEnergy>></span>
</div>
</div>
</fieldset>
<fieldset class="bdsm-fieldset">
<legend>Training Options</legend>
<div class="bdsm-btn-container">
/* Insult - always available */
<<if $playerEnergy >= 5>>
<span class="bdsm-btn special"><<button "😈 Insult" "BDSM_Insult">><</button>></span>
<<else>>
<span class="bdsm-btn disabled" title="Requires: 5 Energy"><<button "😈 Insult">><</button>></span>
<</if>>
/* Lick feet - Dominance 1, Submission 1 */
<<if $targetSubmission.value >= 1 && $playerDominance.value >= 1 && $playerEnergy >= 5>>
<span class="bdsm-btn primary"><<button "🦶 Lick Feet" "BDSM_LickFeet">><</button>></span>
<<else>>
<span class="bdsm-btn disabled" title="Requires: Dominance 1, Submission 1, Energy 5"><<button "🦶 Lick Feet">><</button>></span>
<</if>>
/* Play with a leash - Dominance 2, Submission 2 */
<<if $targetSubmission.value >= 2 && $playerDominance.value >= 2 && $playerEnergy >= 5>>
<span class="bdsm-btn primary"><<button "🐕 Leash Play" "BDSM_LeashPlay">><</button>></span>
<<else>>
<span class="bdsm-btn disabled" title="Requires: Dominance 2, Submission 2, Energy 5"><<button "🐕 Leash Play">><</button>></span>
<</if>>
/* Tie up - Dominance 3, Submission 3 */
<<if $targetSubmission.value >= 3 && $playerDominance.value >= 3 && $playerEnergy >= 5>>
<span class="bdsm-btn dark"><<button "🔗 Tie Up" "BDSM_TieUp">><</button>></span>
<<else>>
<span class="bdsm-btn disabled" title="Requires: Dominance 3, Submission 3, Energy 5"><<button "🔗 Tie Up">><</button>></span>
<</if>>
/* Oral - Dominance 4, Submission 4 */
<<if $targetSubmission.value >= 4 && $playerDominance.value >= 4 && $playerEnergy >= 5>>
<<if $player.genitalia() == "Vagina">>
<span class="bdsm-btn primary"><<button "👅 Pussy Licking" "BDSM_PussyLicking">><</button>></span>
<<elseif $player.genitalia() == "Penis">>
<span class="bdsm-btn primary"><<button "👅 Blowjob" "BDSM_Blowjob">><</button>></span>
<</if>>
<<else>>
<<if $player.genitalia() == "Vagina">>
<span class="bdsm-btn disabled" title="Requires: Dominance 4, Submission 4, Energy 5"><<button "👅 Pussy Licking">><</button>></span>
<<else>>
<span class="bdsm-btn disabled" title="Requires: Dominance 4, Submission 4, Energy 5"><<button "👅 Blowjob">><</button>></span>
<</if>>
<</if>>
/* Anus licking - Dominance 5, Submission 5 */
<<if $targetSubmission.value >= 5 && $playerDominance.value >= 5 && $playerEnergy >= 5>>
<span class="bdsm-btn dark"><<button "🍑 Anus Licking" "BDSM_AnusLicking">><</button>></span>
<<else>>
<span class="bdsm-btn disabled" title="Requires: Dominance 5, Submission 5, Energy 5"><<button "🍑 Anus Licking">><</button>></span>
<</if>>
/* Toys - Dominance 6, Submission 6 */
<<if $targetSubmission.value >= 6 && $playerDominance.value >= 6 && $playerEnergy >= 5>>
<span class="bdsm-btn special"><<button "🎀 Toys" "BDSM_Toys">><</button>></span>
<<else>>
<span class="bdsm-btn disabled" title="Requires: Dominance 6, Submission 6, Energy 5"><<button "🎀 Toys">><</button>></span>
<</if>>
/* Sex Vaginal - Dominance 7, Submission 7, NPC has vagina */
<<if $targetSubmission.value >= 7 && $playerDominance.value >= 7 && $playerEnergy >= 5 && $interactionNpc.genitalia() == "Vagina">>
<span class="bdsm-btn primary"><<button "💕 Sex (Vaginal)" "BDSM_SexVaginal">><</button>></span>
<<elseif $interactionNpc.genitalia() == "Vagina">>
<span class="bdsm-btn disabled" title="Requires: Dominance 7, Submission 7, Energy 5"><<button "💕 Sex (Vaginal)">><</button>></span>
<</if>>
/* Sex Anal - Dominance 7, Submission 7 */
<<if $targetSubmission.value >= 7 && $playerDominance.value >= 7 && $playerEnergy >= 5>>
<span class="bdsm-btn dark"><<button "🔥 Sex (Anal)" "BDSM_SexAnal">><</button>></span>
<<else>>
<span class="bdsm-btn disabled" title="Requires: Dominance 7, Submission 7, Energy 5"><<button "🔥 Sex (Anal)">><</button>></span>
<</if>>
</div>
</fieldset>
<div class="bdsm-btn-container padding-top">
<span class="bdsm-btn neutral"><<button "← Leave Training Room" "NudeCheck">>
/* Return to original location */
<<set _returnLoc = $bdsmReturnLocation || $player.info.currentLocation>>
<<set $player.info.currentLocation = _returnLoc>>
<<set $interactionNpc.info.currentLocation = _returnLoc>>
<<unset $bdsmSessionPaid>>
<<unset $bdsmReturnLocation>>
<</button>></span>
</div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _npcName = $interactionNpc.info.firstName>>
/* Calculate acceptance based on submission progress */
<<set _subLevel = $interactionNpc.attributes.submission.value>>
<<set _subProgress = $interactionNpc.progression.submission.value>>
<<set _subMax = $interactionNpc.progression.submission.max>>
<<set _progressPercent = Math.floor((_subProgress / _subMax) * 100)>>
/* Success is based on submission progress */
<<set _baseChance = 20>>
<<set _progressMod = Math.floor(_progressPercent * 0.5)>>
<<set _levelMod = _subLevel * 10>>
<<set _successChance = Math.min(95, _baseChance + _progressMod + _levelMod)>>
<<set _roll = random(1, 100)>>
<<set _success = _roll <= _successChance || _subLevel >= 1>>
<<Chat $player "You're such a filthy little slut, aren't you?">>
<<if _success>>
<<if _progressPercent < 45 && _subLevel == 0>>
<<switch $player.gender()>>
<<case "Male">>
<<Chat $interactionNpc "Uh, I guess you can call me that, sir.">>
<<case "Female">>
<<Chat $interactionNpc "If you say so, mistress, fine.">>
<<default>>
<<Chat $interactionNpc "Alright, I'll take it, go ahead.">>
<</switch>>
<<else>>
<<switch $player.gender()>>
<<case "Male">>
<<Chat $interactionNpc "Yes, sir, I'm your dirty slut, keep going.">>
<<case "Female">>
<<Chat $interactionNpc "Oh, mistress, I'm your naughty pet, tell me more.">>
<<default>>
<<Chat $interactionNpc "Yes, I'm your filthy pet, degrade me harder.">>
<</switch>>
<</if>>
<<run $player.status.energy.decrease(10)>>
/* NPC energy also decreases from the activity */
<<set _npcEnergyLoss = random(2, 5)>>
<<run $interactionNpc.status.energy.decrease(_npcEnergyLoss)>>
<<SpendTimeWithoutUpdate 5>>
<<set _progressGain = random(5, 20)>>
<<if _subLevel < 1>>
<<SetCharProgression $interactionNpc 'submission' _progressGain true>>
<</if>>
<div class="interaction-result-panel bdsm-result">
<div class="result-banner critical-success">
<span class="result-icon">😈</span>
<span class="result-text">Verbal Degradation - Success!</span>
</div>
<div class="result-description"><<print _npcName>> accepted your degradation.</div>
<div class="metric-changes">
<div class="metric-change positive">
<span class="metric-icon">⛓️</span>
<span class="metric-name">Submission Progress:</span>
<span class="metric-value">+<<print _progressGain>></span>
</div>
<div class="metric-change negative">
<span class="metric-icon">⚡</span>
<span class="metric-name">Your Energy:</span>
<span class="metric-value">-5</span>
</div>
<div class="metric-change negative">
<span class="metric-icon">⚡</span>
<span class="metric-name"><<print _npcName>>'s Energy:</span>
<span class="metric-value">-<<print _npcEnergyLoss>></span>
</div>
</div>
<div class="chance-breakdown">
<div class="chance-header">
Success Chance: <span class="chance-value"><<print _successChance>>%</span>
(Rolled: <<print _roll>>)
</div>
<div class="modifiers-list">
<div class="modifier-item positive">
<span>Base Chance:</span>
<span>+<<print _baseChance>>%</span>
</div>
<div class="modifier-item <<if _progressMod > 0>>positive<<else>>neutral<</if>>">
<span>Submission Progress (<<print _progressPercent>>%):</span>
<span>+<<print _progressMod>>%</span>
</div>
<div class="modifier-item <<if _levelMod > 0>>positive<<else>>neutral<</if>>">
<span>Submission Level (<<print _subLevel>>):</span>
<span>+<<print _levelMod>>%</span>
</div>
</div>
</div>
</div>
<<else>>
<<switch $player.gender()>>
<<case "Male">>
<<Chat $interactionNpc "Fuck off, I'm not your slut, asshole.">>
<<case "Female">>
<<Chat $interactionNpc "Screw you, I'm not that pathetic.">>
<<default>>
<<Chat $interactionNpc "Screw you, I'm not that pathetic.">>
<</switch>>
<<run $player.status.energy.decrease(10)>>
/* NPC energy also decreases from stress */
<<set _npcEnergyLoss = random(3, 8)>>
<<run $interactionNpc.status.energy.decrease(_npcEnergyLoss)>>
<<SpendTimeWithoutUpdate 5>>
/* Relationship penalties for failure */
<<set _friendLoss = random(2, 5)>>
<<set _angerGain = random(2, 4)>>
<<set _negativeFriend = -_friendLoss>>
<<IncreaseFriendship $player $interactionNpc _negativeFriend>>
<<set _angerRelations = {anger: _angerGain}>>
<<run $interactionNpc.setRelationship($player.info.id, _angerRelations, true)>>
<<run $player.setRelationship($interactionNpc.info.id, _angerRelations, true)>>
<div class="interaction-result-panel bdsm-result">
<div class="result-banner failure">
<span class="result-icon">❌</span>
<span class="result-text">Verbal Degradation - Failed!</span>
</div>
<div class="result-description"><<print _npcName>> rejected your degradation.</div>
<div class="metric-changes">
<div class="metric-change negative">
<span class="metric-icon">💔</span>
<span class="metric-name">Friendship:</span>
<span class="metric-value">-<<print _friendLoss>></span>
</div>
<div class="metric-change negative">
<span class="metric-icon">😠</span>
<span class="metric-name">Anger:</span>
<span class="metric-value">+<<print _angerGain>></span>
</div>
<div class="metric-change negative">
<span class="metric-icon">⚡</span>
<span class="metric-name">Your Energy:</span>
<span class="metric-value">-5</span>
</div>
<div class="metric-change negative">
<span class="metric-icon">⚡</span>
<span class="metric-name"><<print _npcName>>'s Energy:</span>
<span class="metric-value">-<<print _npcEnergyLoss>></span>
</div>
</div>
<div class="chance-breakdown">
<div class="chance-header">
Success Chance: <span class="chance-value"><<print _successChance>>%</span>
(Rolled: <<print _roll>>)
</div>
<div class="modifiers-list">
<div class="modifier-item positive">
<span>Base Chance:</span>
<span>+<<print _baseChance>>%</span>
</div>
<div class="modifier-item <<if _progressMod > 0>>positive<<else>>neutral<</if>>">
<span>Submission Progress (<<print _progressPercent>>%):</span>
<span>+<<print _progressMod>>%</span>
</div>
<div class="modifier-item <<if _levelMod > 0>>positive<<else>>neutral<</if>>">
<span>Submission Level (<<print _subLevel>>):</span>
<span>+<<print _levelMod>>%</span>
</div>
</div>
</div>
</div>
<</if>>
<div class="bdsm-btn-container padding-top">
<span class="bdsm-btn secondary"><<button "→ Continue" "BDSMTrainingRoom">><</button>></span>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _npcName = $interactionNpc.info.firstName>>
<<set _subLevel = $interactionNpc.attributes.submission.value>>
<<set _subProgress = $interactionNpc.progression.submission.value>>
<<set _subMax = $interactionNpc.progression.submission.max>>
<<set _progressPercent = Math.floor((_subProgress / _subMax) * 100)>>
<<set _domLevel = $player.attributes.dominance.value>>
<<set _baseChance = 30>>
<<set _progressMod = Math.floor(_progressPercent * 0.4)>>
<<set _levelMod = _subLevel * 8>>
<<set _domMod = _domLevel * 5>>
<<set _successChance = Math.min(95, _baseChance + _progressMod + _levelMod + _domMod)>>
<<set _roll = random(1, 100)>>
<<set _success = _roll <= _successChance || _subLevel >= 2>>
<<Chat $player "Get down and worship my feet, now.">>
<<if _success>>
<<if _progressPercent < 75 && _subLevel == 1>>
<<switch $player.gender()>>
<<case "Male">>
<<Chat $interactionNpc "Fine, I'll do it, but don't expect much.">>
<<case "Female">>
<<Chat $interactionNpc "Okay, I'll lick them, whatever.">>
<<default>>
<<Chat $interactionNpc "Alright, I'll give it a try, I guess.">>
<</switch>>
<<else>>
<<switch $player.gender()>>
<<case "Male">>
<<Chat $interactionNpc "Mmm, your feet are perfect, sir, let me taste them.">>
<<case "Female">>
<<Chat $interactionNpc "Oh, mistress, I love serving your feet like this.">>
<<default>>
<<Chat $interactionNpc "Your feet are divine, I'm so lucky to lick them.">>
<</switch>>
<</if>>
<<DominateTrainingShowVideo $player.gender() $interactionNpc.gender() "Lick feet" true true false>>
<<run $player.status.energy.decrease(10)>>
/* NPC energy also decreases from the activity */
<<set _npcEnergyLoss = random(3, 6)>>
<<run $interactionNpc.status.energy.decrease(_npcEnergyLoss)>>
<<SpendTimeWithoutUpdate 5>>
<<set _progressGain = random(5, 20)>>
<<if _subLevel < 2>>
<<SetCharProgression $interactionNpc 'submission' _progressGain true>>
<</if>>
<div class="interaction-result-panel bdsm-result">
<div class="result-banner critical-success">
<span class="result-icon">🦶</span>
<span class="result-text">Foot Worship - Success!</span>
</div>
<div class="result-description"><<print _npcName>> worshipped your feet.</div>
<div class="metric-changes">
<div class="metric-change positive">
<span class="metric-icon">⛓️</span>
<span class="metric-name">Submission Progress:</span>
<span class="metric-value">+<<print _progressGain>></span>
</div>
<div class="metric-change negative">
<span class="metric-icon">⚡</span>
<span class="metric-name">Your Energy:</span>
<span class="metric-value">-5</span>
</div>
<div class="metric-change negative">
<span class="metric-icon">⚡</span>
<span class="metric-name"><<print _npcName>>'s Energy:</span>
<span class="metric-value">-<<print _npcEnergyLoss>></span>
</div>
</div>
<div class="chance-breakdown">
<div class="chance-header">
Success Chance: <span class="chance-value"><<print _successChance>>%</span>
(Rolled: <<print _roll>>)
</div>
<div class="modifiers-list">
<div class="modifier-item positive">
<span>Base Chance:</span>
<span>+<<print _baseChance>>%</span>
</div>
<div class="modifier-item <<if _progressMod > 0>>positive<<else>>neutral<</if>>">
<span>Submission Progress (<<print _progressPercent>>%):</span>
<span>+<<print _progressMod>>%</span>
</div>
<div class="modifier-item <<if _levelMod > 0>>positive<<else>>neutral<</if>>">
<span>Submission Level (<<print _subLevel>>):</span>
<span>+<<print _levelMod>>%</span>
</div>
<div class="modifier-item <<if _domMod > 0>>positive<<else>>neutral<</if>>">
<span>Your Dominance (<<print _domLevel>>):</span>
<span>+<<print _domMod>>%</span>
</div>
</div>
</div>
</div>
<<else>>
<<switch $player.gender()>>
<<case "Male">>
<<Chat $interactionNpc "No way, I'm not licking your damn feet.">>
<<case "Female">>
<<Chat $interactionNpc "Ugh, that's gross, I'm not doing it.">>
<<default>>
<<Chat $interactionNpc "Hell no, find someone else for that.">>
<</switch>>
<<run $player.status.energy.decrease(10)>>
/* NPC energy also decreases from stress */
<<set _npcEnergyLoss = random(3, 8)>>
<<run $interactionNpc.status.energy.decrease(_npcEnergyLoss)>>
<<SpendTimeWithoutUpdate 5>>
/* Relationship penalties for failure */
<<set _friendLoss = random(2, 5)>>
<<set _angerGain = random(2, 4)>>
<<set _negativeFriend = -_friendLoss>>
<<IncreaseFriendship $player $interactionNpc _negativeFriend>>
<<set _angerRelations = {anger: _angerGain}>>
<<run $interactionNpc.setRelationship($player.info.id, _angerRelations, true)>>
<<run $player.setRelationship($interactionNpc.info.id, _angerRelations, true)>>
<div class="interaction-result-panel bdsm-result">
<div class="result-banner failure">
<span class="result-icon">❌</span>
<span class="result-text">Foot Worship - Failed!</span>
</div>
<div class="result-description"><<print _npcName>> refused to worship your feet.</div>
<div class="metric-changes">
<div class="metric-change negative">
<span class="metric-icon">💔</span>
<span class="metric-name">Friendship:</span>
<span class="metric-value">-<<print _friendLoss>></span>
</div>
<div class="metric-change negative">
<span class="metric-icon">😠</span>
<span class="metric-name">Anger:</span>
<span class="metric-value">+<<print _angerGain>></span>
</div>
<div class="metric-change negative">
<span class="metric-icon">⚡</span>
<span class="metric-name">Your Energy:</span>
<span class="metric-value">-5</span>
</div>
<div class="metric-change negative">
<span class="metric-icon">⚡</span>
<span class="metric-name"><<print _npcName>>'s Energy:</span>
<span class="metric-value">-<<print _npcEnergyLoss>></span>
</div>
</div>
<div class="chance-breakdown">
<div class="chance-header">
Success Chance: <span class="chance-value"><<print _successChance>>%</span>
(Rolled: <<print _roll>>)
</div>
<div class="modifiers-list">
<div class="modifier-item positive">
<span>Base Chance:</span>
<span>+<<print _baseChance>>%</span>
</div>
<div class="modifier-item <<if _progressMod > 0>>positive<<else>>neutral<</if>>">
<span>Submission Progress (<<print _progressPercent>>%):</span>
<span>+<<print _progressMod>>%</span>
</div>
<div class="modifier-item <<if _levelMod > 0>>positive<<else>>neutral<</if>>">
<span>Submission Level (<<print _subLevel>>):</span>
<span>+<<print _levelMod>>%</span>
</div>
<div class="modifier-item <<if _domMod > 0>>positive<<else>>neutral<</if>>">
<span>Your Dominance (<<print _domLevel>>):</span>
<span>+<<print _domMod>>%</span>
</div>
</div>
</div>
</div>
<</if>>
<div class="bdsm-btn-container padding-top">
<span class="bdsm-btn secondary"><<button "→ Continue" "BDSMTrainingRoom">><</button>></span>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _npcName = $interactionNpc.info.firstName>>
<<set _subLevel = $interactionNpc.attributes.submission.value>>
<<set _subProgress = $interactionNpc.progression.submission.value>>
<<set _subMax = $interactionNpc.progression.submission.max>>
<<set _progressPercent = Math.floor((_subProgress / _subMax) * 100)>>
<<set _domLevel = $player.attributes.dominance.value>>
<<set _baseChance = 25>>
<<set _progressMod = Math.floor(_progressPercent * 0.4)>>
<<set _levelMod = _subLevel * 8>>
<<set _domMod = _domLevel * 5>>
<<set _successChance = Math.min(95, _baseChance + _progressMod + _levelMod + _domMod)>>
<<set _roll = random(1, 100)>>
<<set _success = _roll <= _successChance || _subLevel >= 3>>
<<Chat $player "Time to put this leash on you and take you for a walk.">>
<<if _success>>
<<if _progressPercent < 75 && _subLevel == 2>>
<<switch $player.gender()>>
<<case "Male">>
<<Chat $interactionNpc "Ugh, fine, put it on, let's get this over with.">>
<<case "Female">>
<<Chat $interactionNpc "Okay, I'll wear it, but don't pull too hard.">>
<<default>>
<<Chat $interactionNpc "Alright, leash me, I'll follow for now.">>
<</switch>>
<<else>>
<<switch $player.gender()>>
<<case "Male">>
<<Chat $interactionNpc "Yes, sir, lead me wherever you want, I'm yours.">>
<<case "Female">>
<<Chat $interactionNpc "Mistress, I'm your pet, guide me around.">>
<<default>>
<<Chat $interactionNpc "Oh, I love being your leashed toy, take me anywhere.">>
<</switch>>
<</if>>
<<DominateTrainingShowVideo $player.gender() $interactionNpc.gender() "Play with a leash" true true false>>
<<run $player.status.energy.decrease(10)>>
/* NPC energy also decreases from the activity */
<<set _npcEnergyLoss = random(3, 7)>>
<<run $interactionNpc.status.energy.decrease(_npcEnergyLoss)>>
<<SpendTimeWithoutUpdate 5>>
<<set _progressGain = random(5, 20)>>
<<if _subLevel < 3>>
<<SetCharProgression $interactionNpc 'submission' _progressGain true>>
<</if>>
<div class="interaction-result-panel bdsm-result">
<div class="result-banner critical-success">
<span class="result-icon">🐕</span>
<span class="result-text">Leash Play - Success!</span>
</div>
<div class="result-description"><<print _npcName>> followed you on a leash like a good pet.</div>
<div class="metric-changes">
<div class="metric-change positive">
<span class="metric-icon">⛓️</span>
<span class="metric-name">Submission Progress:</span>
<span class="metric-value">+<<print _progressGain>></span>
</div>
<div class="metric-change negative">
<span class="metric-icon">⚡</span>
<span class="metric-name">Your Energy:</span>
<span class="metric-value">-5</span>
</div>
<div class="metric-change negative">
<span class="metric-icon">⚡</span>
<span class="metric-name"><<print _npcName>>'s Energy:</span>
<span class="metric-value">-<<print _npcEnergyLoss>></span>
</div>
</div>
<div class="chance-breakdown">
<div class="chance-header">
Success Chance: <span class="chance-value"><<print _successChance>>%</span>
(Rolled: <<print _roll>>)
</div>
<div class="modifiers-list">
<div class="modifier-item positive">
<span>Base Chance:</span>
<span>+<<print _baseChance>>%</span>
</div>
<div class="modifier-item <<if _progressMod > 0>>positive<<else>>neutral<</if>>">
<span>Submission Progress (<<print _progressPercent>>%):</span>
<span>+<<print _progressMod>>%</span>
</div>
<div class="modifier-item <<if _levelMod > 0>>positive<<else>>neutral<</if>>">
<span>Submission Level (<<print _subLevel>>):</span>
<span>+<<print _levelMod>>%</span>
</div>
<div class="modifier-item <<if _domMod > 0>>positive<<else>>neutral<</if>>">
<span>Your Dominance (<<print _domLevel>>):</span>
<span>+<<print _domMod>>%</span>
</div>
</div>
</div>
</div>
<<else>>
<<switch $player.gender()>>
<<case "Male">>
<<Chat $interactionNpc "Fuck that, I'm not your dog, asshole.">>
<<case "Female">>
<<Chat $interactionNpc "No way, I'm not crawling like some pet.">>
<<default>>
<<Chat $interactionNpc "Get that leash away from me, I'm not playing.">>
<</switch>>
<<run $player.status.energy.decrease(10)>>
/* NPC energy also decreases from stress */
<<set _npcEnergyLoss = random(4, 10)>>
<<run $interactionNpc.status.energy.decrease(_npcEnergyLoss)>>
<<SpendTimeWithoutUpdate 5>>
/* Relationship penalties for failure */
<<set _friendLoss = random(3, 6)>>
<<set _angerGain = random(3, 5)>>
<<set _negativeFriend = -_friendLoss>>
<<IncreaseFriendship $player $interactionNpc _negativeFriend>>
<<set _angerRelations = {anger: _angerGain}>>
<<run $interactionNpc.setRelationship($player.info.id, _angerRelations, true)>>
<<run $player.setRelationship($interactionNpc.info.id, _angerRelations, true)>>
<div class="interaction-result-panel bdsm-result">
<div class="result-banner failure">
<span class="result-icon">❌</span>
<span class="result-text">Leash Play - Failed!</span>
</div>
<div class="result-description"><<print _npcName>> refused the leash.</div>
<div class="metric-changes">
<div class="metric-change negative">
<span class="metric-icon">💔</span>
<span class="metric-name">Friendship:</span>
<span class="metric-value">-<<print _friendLoss>></span>
</div>
<div class="metric-change negative">
<span class="metric-icon">😠</span>
<span class="metric-name">Anger:</span>
<span class="metric-value">+<<print _angerGain>></span>
</div>
<div class="metric-change negative">
<span class="metric-icon">⚡</span>
<span class="metric-name">Your Energy:</span>
<span class="metric-value">-5</span>
</div>
<div class="metric-change negative">
<span class="metric-icon">⚡</span>
<span class="metric-name"><<print _npcName>>'s Energy:</span>
<span class="metric-value">-<<print _npcEnergyLoss>></span>
</div>
</div>
<div class="chance-breakdown">
<div class="chance-header">
Success Chance: <span class="chance-value"><<print _successChance>>%</span>
(Rolled: <<print _roll>>)
</div>
<div class="modifiers-list">
<div class="modifier-item positive">
<span>Base Chance:</span>
<span>+<<print _baseChance>>%</span>
</div>
<div class="modifier-item <<if _progressMod > 0>>positive<<else>>neutral<</if>>">
<span>Submission Progress (<<print _progressPercent>>%):</span>
<span>+<<print _progressMod>>%</span>
</div>
<div class="modifier-item <<if _levelMod > 0>>positive<<else>>neutral<</if>>">
<span>Submission Level (<<print _subLevel>>):</span>
<span>+<<print _levelMod>>%</span>
</div>
<div class="modifier-item <<if _domMod > 0>>positive<<else>>neutral<</if>>">
<span>Your Dominance (<<print _domLevel>>):</span>
<span>+<<print _domMod>>%</span>
</div>
</div>
</div>
</div>
<</if>>
<div class="bdsm-btn-container padding-top">
<span class="bdsm-btn secondary"><<button "→ Continue" "BDSMTrainingRoom">><</button>></span>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _npcName = $interactionNpc.info.firstName>>
<<set _subLevel = $interactionNpc.attributes.submission.value>>
<<set _subProgress = $interactionNpc.progression.submission.value>>
<<set _subMax = $interactionNpc.progression.submission.max>>
<<set _progressPercent = Math.floor((_subProgress / _subMax) * 100)>>
<<set _domLevel = $player.attributes.dominance.value>>
<<set _baseChance = 20>>
<<set _progressMod = Math.floor(_progressPercent * 0.4)>>
<<set _levelMod = _subLevel * 8>>
<<set _domMod = _domLevel * 5>>
<<set _successChance = Math.min(95, _baseChance + _progressMod + _levelMod + _domMod)>>
<<set _roll = random(1, 100)>>
<<set _success = _roll <= _successChance || _subLevel >= 4>>
<<Chat $player "I'm going to bind you so you can't move an inch.">>
<<if _success>>
<<if _progressPercent < 75 && _subLevel == 3>>
<<switch $player.gender()>>
<<case "Male">>
<<Chat $interactionNpc "Fine, go ahead, but don't make it too tight.">>
<<case "Female">>
<<Chat $interactionNpc "Okay, tie me, but I'm watching you.">>
<<default>>
<<Chat $interactionNpc "Alright, I'll let you, just do it quick.">>
<</switch>>
<<else>>
<<switch $player.gender()>>
<<case "Male">>
<<Chat $interactionNpc "Fuck, sir, tie me tight, I want to feel helpless.">>
<<case "Female">>
<<Chat $interactionNpc "Mistress, please, make the ropes tight, I'm all yours.">>
<<default>>
<<Chat $interactionNpc "Oh, bind me up, I want to be completely at your mercy.">>
<</switch>>
<</if>>
<<DominateTrainingShowVideo $player.gender() $interactionNpc.gender() "Tie up" true true true>>
<<run $player.status.energy.decrease(10)>>
/* NPC energy also decreases from the activity */
<<set _npcEnergyLoss = random(3, 7)>>
<<run $interactionNpc.status.energy.decrease(_npcEnergyLoss)>>
<<SpendTimeWithoutUpdate 5>>
<<set _progressGain = random(5, 20)>>
<<if _subLevel < 4>>
<<SetCharProgression $interactionNpc 'submission' _progressGain true>>
<</if>>
<div class="interaction-result-panel bdsm-result">
<div class="result-banner critical-success">
<span class="result-icon">🔗</span>
<span class="result-text">Bondage - Success!</span>
</div>
<div class="result-description"><<print _npcName>> is now completely bound and helpless.</div>
<div class="metric-changes">
<div class="metric-change positive">
<span class="metric-icon">⛓️</span>
<span class="metric-name">Submission Progress:</span>
<span class="metric-value">+<<print _progressGain>></span>
</div>
<div class="metric-change negative">
<span class="metric-icon">⚡</span>
<span class="metric-name">Your Energy:</span>
<span class="metric-value">-5</span>
</div>
<div class="metric-change negative">
<span class="metric-icon">⚡</span>
<span class="metric-name"><<print _npcName>>'s Energy:</span>
<span class="metric-value">-<<print _npcEnergyLoss>></span>
</div>
</div>
<div class="chance-breakdown">
<div class="chance-header">
Success Chance: <span class="chance-value"><<print _successChance>>%</span>
(Rolled: <<print _roll>>)
</div>
<div class="modifiers-list">
<div class="modifier-item positive">
<span>Base Chance:</span>
<span>+<<print _baseChance>>%</span>
</div>
<div class="modifier-item <<if _progressMod > 0>>positive<<else>>neutral<</if>>">
<span>Submission Progress (<<print _progressPercent>>%):</span>
<span>+<<print _progressMod>>%</span>
</div>
<div class="modifier-item <<if _levelMod > 0>>positive<<else>>neutral<</if>>">
<span>Submission Level (<<print _subLevel>>):</span>
<span>+<<print _levelMod>>%</span>
</div>
<div class="modifier-item <<if _domMod > 0>>positive<<else>>neutral<</if>>">
<span>Your Dominance (<<print _domLevel>>):</span>
<span>+<<print _domMod>>%</span>
</div>
</div>
</div>
</div>
<<else>>
<<switch $player.gender()>>
<<case "Male">>
<<Chat $interactionNpc "Hell no, I'm not letting you tie me up.">>
<<case "Female">>
<<Chat $interactionNpc "Forget it, I'm not that helpless.">>
<<default>>
<<Chat $interactionNpc "No way, keep your ropes to yourself.">>
<</switch>>
<<run $player.status.energy.decrease(10)>>
/* NPC energy also decreases from stress */
<<set _npcEnergyLoss = random(4, 10)>>
<<run $interactionNpc.status.energy.decrease(_npcEnergyLoss)>>
<<SpendTimeWithoutUpdate 5>>
/* Relationship penalties for failure */
<<set _friendLoss = random(3, 6)>>
<<set _angerGain = random(3, 5)>>
<<set _negativeFriend = -_friendLoss>>
<<IncreaseFriendship $player $interactionNpc _negativeFriend>>
<<set _angerRelations = {anger: _angerGain}>>
<<run $interactionNpc.setRelationship($player.info.id, _angerRelations, true)>>
<<run $player.setRelationship($interactionNpc.info.id, _angerRelations, true)>>
<div class="interaction-result-panel bdsm-result">
<div class="result-banner failure">
<span class="result-icon">❌</span>
<span class="result-text">Bondage - Failed!</span>
</div>
<div class="result-description"><<print _npcName>> refused to be tied up.</div>
<div class="metric-changes">
<div class="metric-change negative">
<span class="metric-icon">💔</span>
<span class="metric-name">Friendship:</span>
<span class="metric-value">-<<print _friendLoss>></span>
</div>
<div class="metric-change negative">
<span class="metric-icon">😠</span>
<span class="metric-name">Anger:</span>
<span class="metric-value">+<<print _angerGain>></span>
</div>
<div class="metric-change negative">
<span class="metric-icon">⚡</span>
<span class="metric-name">Your Energy:</span>
<span class="metric-value">-5</span>
</div>
<div class="metric-change negative">
<span class="metric-icon">⚡</span>
<span class="metric-name"><<print _npcName>>'s Energy:</span>
<span class="metric-value">-<<print _npcEnergyLoss>></span>
</div>
</div>
<div class="chance-breakdown">
<div class="chance-header">
Success Chance: <span class="chance-value"><<print _successChance>>%</span>
(Rolled: <<print _roll>>)
</div>
<div class="modifiers-list">
<div class="modifier-item positive">
<span>Base Chance:</span>
<span>+<<print _baseChance>>%</span>
</div>
<div class="modifier-item <<if _progressMod > 0>>positive<<else>>neutral<</if>>">
<span>Submission Progress (<<print _progressPercent>>%):</span>
<span>+<<print _progressMod>>%</span>
</div>
<div class="modifier-item <<if _levelMod > 0>>positive<<else>>neutral<</if>>">
<span>Submission Level (<<print _subLevel>>):</span>
<span>+<<print _levelMod>>%</span>
</div>
<div class="modifier-item <<if _domMod > 0>>positive<<else>>neutral<</if>>">
<span>Your Dominance (<<print _domLevel>>):</span>
<span>+<<print _domMod>>%</span>
</div>
</div>
</div>
</div>
<</if>>
<div class="bdsm-btn-container padding-top">
<span class="bdsm-btn secondary"><<button "→ Continue" "BDSMTrainingRoom">><</button>></span>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _npcName = $interactionNpc.info.firstName>>
<<set _subLevel = $interactionNpc.attributes.submission.value>>
<<set _subProgress = $interactionNpc.progression.submission.value>>
<<set _subMax = $interactionNpc.progression.submission.max>>
<<set _progressPercent = Math.floor((_subProgress / _subMax) * 100)>>
<<set _domLevel = $player.attributes.dominance.value>>
<<set _baseChance = 15>>
<<set _progressMod = Math.floor(_progressPercent * 0.5)>>
<<set _levelMod = _subLevel * 10>>
<<set _domMod = _domLevel * 5>>
<<set _successChance = Math.min(95, _baseChance + _progressMod + _levelMod + _domMod)>>
<<set _roll = random(1, 100)>>
<<set _success = _roll <= _successChance || _subLevel >= 5>>
<<Chat $player "Get between my legs and lick my pussy, now.">>
<<if _success>>
<<switch $player.gender()>>
<<case "Female">>
<<Chat $interactionNpc "Mistress, mmm, I love eating your pussy.">>
<<default>>
<<Chat $interactionNpc "Oh, your pussy's perfect, I could lick it all day.">>
<</switch>>
<<DominateTrainingShowVideo $player.gender() $interactionNpc.gender() "Lick pussy" true true true>>
<<run $player.status.energy.decrease(10)>>
/* NPC energy also decreases from the activity */
<<set _npcEnergyLoss = random(4, 8)>>
<<run $interactionNpc.status.energy.decrease(_npcEnergyLoss)>>
<<SpendTimeWithoutUpdate 5>>
<<set _progressGain = random(10, 25)>>
<<if _subLevel < 5>>
<<SetCharProgression $interactionNpc 'submission' _progressGain true>>
<</if>>
<<run gainSexExp($player, "oralSkill", Random(3,6))>>
<<run gainSexExp($player, "sexualKnowledge", Random(1,2))>>
<<run gainSexExp($player, "assertiveness", Random(2,4))>>
<div class="interaction-result-panel bdsm-result">
<div class="result-banner critical-success">
<span class="result-icon">👅</span>
<span class="result-text">Oral Service - Success!</span>
</div>
<div class="result-description"><<print _npcName>> pleasured you orally.</div>
<div class="metric-changes">
<div class="metric-change positive">
<span class="metric-icon">⛓️</span>
<span class="metric-name">Submission Progress:</span>
<span class="metric-value">+<<print _progressGain>></span>
</div>
<div class="metric-change negative">
<span class="metric-icon">⚡</span>
<span class="metric-name">Your Energy:</span>
<span class="metric-value">-5</span>
</div>
<div class="metric-change negative">
<span class="metric-icon">⚡</span>
<span class="metric-name"><<print _npcName>>'s Energy:</span>
<span class="metric-value">-<<print _npcEnergyLoss>></span>
</div>
</div>
<div class="chance-breakdown">
<div class="chance-header">
Success Chance: <span class="chance-value"><<print _successChance>>%</span>
(Rolled: <<print _roll>>)
</div>
<div class="modifiers-list">
<div class="modifier-item positive">
<span>Base Chance:</span>
<span>+<<print _baseChance>>%</span>
</div>
<div class="modifier-item <<if _progressMod > 0>>positive<<else>>neutral<</if>>">
<span>Submission Progress (<<print _progressPercent>>%):</span>
<span>+<<print _progressMod>>%</span>
</div>
<div class="modifier-item <<if _levelMod > 0>>positive<<else>>neutral<</if>>">
<span>Submission Level (<<print _subLevel>>):</span>
<span>+<<print _levelMod>>%</span>
</div>
<div class="modifier-item <<if _domMod > 0>>positive<<else>>neutral<</if>>">
<span>Your Dominance (<<print _domLevel>>):</span>
<span>+<<print _domMod>>%</span>
</div>
</div>
</div>
</div>
<<else>>
<<Chat $interactionNpc "Ugh, that's too much, I'm out.">>
<<run $player.status.energy.decrease(10)>>
/* NPC energy also decreases from stress */
<<set _npcEnergyLoss = random(5, 12)>>
<<run $interactionNpc.status.energy.decrease(_npcEnergyLoss)>>
<<SpendTimeWithoutUpdate 5>>
/* Relationship penalties for failure - more severe for intimate acts */
<<set _friendLoss = random(3, 7)>>
<<set _loveLoss = random(2, 5)>>
<<set _angerGain = random(3, 6)>>
<<set _negativeFriend = -_friendLoss>>
<<set _negativeLove = -_loveLoss>>
<<IncreaseFriendship $player $interactionNpc _negativeFriend>>
<<IncreaseLove $player $interactionNpc _negativeLove>>
<<set _angerRelations = {anger: _angerGain}>>
<<run $interactionNpc.setRelationship($player.info.id, _angerRelations, true)>>
<<run $player.setRelationship($interactionNpc.info.id, _angerRelations, true)>>
<div class="interaction-result-panel bdsm-result">
<div class="result-banner failure">
<span class="result-icon">❌</span>
<span class="result-text">Oral Service - Failed!</span>
</div>
<div class="result-description"><<print _npcName>> refused to please you.</div>
<div class="metric-changes">
<div class="metric-change negative">
<span class="metric-icon">💔</span>
<span class="metric-name">Friendship:</span>
<span class="metric-value">-<<print _friendLoss>></span>
</div>
<div class="metric-change negative">
<span class="metric-icon">💕</span>
<span class="metric-name">Love:</span>
<span class="metric-value">-<<print _loveLoss>></span>
</div>
<div class="metric-change negative">
<span class="metric-icon">😠</span>
<span class="metric-name">Anger:</span>
<span class="metric-value">+<<print _angerGain>></span>
</div>
<div class="metric-change negative">
<span class="metric-icon">⚡</span>
<span class="metric-name">Your Energy:</span>
<span class="metric-value">-5</span>
</div>
<div class="metric-change negative">
<span class="metric-icon">⚡</span>
<span class="metric-name"><<print _npcName>>'s Energy:</span>
<span class="metric-value">-<<print _npcEnergyLoss>></span>
</div>
</div>
<div class="chance-breakdown">
<div class="chance-header">
Success Chance: <span class="chance-value"><<print _successChance>>%</span>
(Rolled: <<print _roll>>)
</div>
<div class="modifiers-list">
<div class="modifier-item positive">
<span>Base Chance:</span>
<span>+<<print _baseChance>>%</span>
</div>
<div class="modifier-item <<if _progressMod > 0>>positive<<else>>neutral<</if>>">
<span>Submission Progress (<<print _progressPercent>>%):</span>
<span>+<<print _progressMod>>%</span>
</div>
<div class="modifier-item <<if _levelMod > 0>>positive<<else>>neutral<</if>>">
<span>Submission Level (<<print _subLevel>>):</span>
<span>+<<print _levelMod>>%</span>
</div>
<div class="modifier-item <<if _domMod > 0>>positive<<else>>neutral<</if>>">
<span>Your Dominance (<<print _domLevel>>):</span>
<span>+<<print _domMod>>%</span>
</div>
</div>
</div>
</div>
<</if>>
<div class="bdsm-btn-container padding-top">
<span class="bdsm-btn secondary"><<button "→ Continue" "BDSMTrainingRoom">><</button>></span>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _npcName = $interactionNpc.info.firstName>>
<<set _subLevel = $interactionNpc.attributes.submission.value>>
<<set _subProgress = $interactionNpc.progression.submission.value>>
<<set _subMax = $interactionNpc.progression.submission.max>>
<<set _progressPercent = Math.floor((_subProgress / _subMax) * 100)>>
<<set _domLevel = $player.attributes.dominance.value>>
<<set _baseChance = 15>>
<<set _progressMod = Math.floor(_progressPercent * 0.5)>>
<<set _levelMod = _subLevel * 10>>
<<set _domMod = _domLevel * 5>>
<<set _successChance = Math.min(95, _baseChance + _progressMod + _levelMod + _domMod)>>
<<set _roll = random(1, 100)>>
<<set _success = _roll <= _successChance || _subLevel >= 5>>
<<Chat $player "Get on your knees and suck me off.">>
<<if _success>>
<<switch $player.gender()>>
<<case "Male">>
<<Chat $interactionNpc "Sir, your cock's so perfect, let me worship it.">>
<<default>>
<<Chat $interactionNpc "Oh, your dick is amazing, I'm so lucky to taste it.">>
<</switch>>
<<DominateTrainingShowVideo $player.gender() $interactionNpc.gender() "Blowjob" false true false>>
<<run $player.status.energy.decrease(10)>>
/* NPC energy also decreases from the activity */
<<set _npcEnergyLoss = random(4, 8)>>
<<run $interactionNpc.status.energy.decrease(_npcEnergyLoss)>>
<<SpendTimeWithoutUpdate 5>>
<<set _progressGain = random(10, 25)>>
<<if _subLevel < 5>>
<<SetCharProgression $interactionNpc 'submission' _progressGain true>>
<</if>>
<<run gainSexExp($player, "oralSkill", Random(3,6))>>
<<run gainSexExp($player, "sexualKnowledge", Random(1,2))>>
<<run gainSexExp($player, "assertiveness", Random(2,4))>>
<div class="interaction-result-panel bdsm-result">
<div class="result-banner critical-success">
<span class="result-icon">👅</span>
<span class="result-text">Oral Service - Success!</span>
</div>
<div class="result-description"><<print _npcName>> sucked you off like a good sub.</div>
<div class="metric-changes">
<div class="metric-change positive">
<span class="metric-icon">⛓️</span>
<span class="metric-name">Submission Progress:</span>
<span class="metric-value">+<<print _progressGain>></span>
</div>
<div class="metric-change negative">
<span class="metric-icon">⚡</span>
<span class="metric-name">Your Energy:</span>
<span class="metric-value">-5</span>
</div>
<div class="metric-change negative">
<span class="metric-icon">⚡</span>
<span class="metric-name"><<print _npcName>>'s Energy:</span>
<span class="metric-value">-<<print _npcEnergyLoss>></span>
</div>
</div>
<div class="chance-breakdown">
<div class="chance-header">
Success Chance: <span class="chance-value"><<print _successChance>>%</span>
(Rolled: <<print _roll>>)
</div>
<div class="modifiers-list">
<div class="modifier-item positive">
<span>Base Chance:</span>
<span>+<<print _baseChance>>%</span>
</div>
<div class="modifier-item <<if _progressMod > 0>>positive<<else>>neutral<</if>>">
<span>Submission Progress (<<print _progressPercent>>%):</span>
<span>+<<print _progressMod>>%</span>
</div>
<div class="modifier-item <<if _levelMod > 0>>positive<<else>>neutral<</if>>">
<span>Submission Level (<<print _subLevel>>):</span>
<span>+<<print _levelMod>>%</span>
</div>
<div class="modifier-item <<if _domMod > 0>>positive<<else>>neutral<</if>>">
<span>Your Dominance (<<print _domLevel>>):</span>
<span>+<<print _domMod>>%</span>
</div>
</div>
</div>
</div>
<<else>>
<<Chat $interactionNpc "Fuck no, I'm not sucking your dick.">>
<<run $player.status.energy.decrease(10)>>
/* NPC energy also decreases from stress */
<<set _npcEnergyLoss = random(5, 12)>>
<<run $interactionNpc.status.energy.decrease(_npcEnergyLoss)>>
<<SpendTimeWithoutUpdate 5>>
/* Relationship penalties for failure - more severe for intimate acts */
<<set _friendLoss = random(3, 7)>>
<<set _loveLoss = random(2, 5)>>
<<set _angerGain = random(3, 6)>>
<<set _negativeFriend = -_friendLoss>>
<<set _negativeLove = -_loveLoss>>
<<IncreaseFriendship $player $interactionNpc _negativeFriend>>
<<IncreaseLove $player $interactionNpc _negativeLove>>
<<set _angerRelations = {anger: _angerGain}>>
<<run $interactionNpc.setRelationship($player.info.id, _angerRelations, true)>>
<<run $player.setRelationship($interactionNpc.info.id, _angerRelations, true)>>
<div class="interaction-result-panel bdsm-result">
<div class="result-banner failure">
<span class="result-icon">❌</span>
<span class="result-text">Oral Service - Failed!</span>
</div>
<div class="result-description"><<print _npcName>> refused to please you.</div>
<div class="metric-changes">
<div class="metric-change negative">
<span class="metric-icon">💔</span>
<span class="metric-name">Friendship:</span>
<span class="metric-value">-<<print _friendLoss>></span>
</div>
<div class="metric-change negative">
<span class="metric-icon">💕</span>
<span class="metric-name">Love:</span>
<span class="metric-value">-<<print _loveLoss>></span>
</div>
<div class="metric-change negative">
<span class="metric-icon">😠</span>
<span class="metric-name">Anger:</span>
<span class="metric-value">+<<print _angerGain>></span>
</div>
<div class="metric-change negative">
<span class="metric-icon">⚡</span>
<span class="metric-name">Your Energy:</span>
<span class="metric-value">-5</span>
</div>
<div class="metric-change negative">
<span class="metric-icon">⚡</span>
<span class="metric-name"><<print _npcName>>'s Energy:</span>
<span class="metric-value">-<<print _npcEnergyLoss>></span>
</div>
</div>
<div class="chance-breakdown">
<div class="chance-header">
Success Chance: <span class="chance-value"><<print _successChance>>%</span>
(Rolled: <<print _roll>>)
</div>
<div class="modifiers-list">
<div class="modifier-item positive">
<span>Base Chance:</span>
<span>+<<print _baseChance>>%</span>
</div>
<div class="modifier-item <<if _progressMod > 0>>positive<<else>>neutral<</if>>">
<span>Submission Progress (<<print _progressPercent>>%):</span>
<span>+<<print _progressMod>>%</span>
</div>
<div class="modifier-item <<if _levelMod > 0>>positive<<else>>neutral<</if>>">
<span>Submission Level (<<print _subLevel>>):</span>
<span>+<<print _levelMod>>%</span>
</div>
<div class="modifier-item <<if _domMod > 0>>positive<<else>>neutral<</if>>">
<span>Your Dominance (<<print _domLevel>>):</span>
<span>+<<print _domMod>>%</span>
</div>
</div>
</div>
</div>
<</if>>
<div class="bdsm-btn-container padding-top">
<span class="bdsm-btn secondary"><<button "→ Continue" "BDSMTrainingRoom">><</button>></span>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _npcName = $interactionNpc.info.firstName>>
<<set _subLevel = $interactionNpc.attributes.submission.value>>
<<set _subProgress = $interactionNpc.progression.submission.value>>
<<set _subMax = $interactionNpc.progression.submission.max>>
<<set _progressPercent = Math.floor((_subProgress / _subMax) * 100)>>
<<set _domLevel = $player.attributes.dominance.value>>
<<set _baseChance = 10>>
<<set _progressMod = Math.floor(_progressPercent * 0.5)>>
<<set _levelMod = _subLevel * 10>>
<<set _domMod = _domLevel * 6>>
<<set _successChance = Math.min(95, _baseChance + _progressMod + _levelMod + _domMod)>>
<<set _roll = random(1, 100)>>
<<set _success = _roll <= _successChance || _subLevel >= 6>>
<<Chat $player "Spread your cheeks. I want you to rim me.">>
<<if _success>>
<<switch $player.gender()>>
<<case "Male">>
<<Chat $interactionNpc "Fuck, sir, I love rimming you, don't stop.">>
<<case "Female">>
<<Chat $interactionNpc "Mistress, oh god, let me worship your ass.">>
<<default>>
<<Chat $interactionNpc "Yes, I love licking your ass, it's so fucking good.">>
<</switch>>
<<DominateTrainingShowVideo $player.gender() $interactionNpc.gender() "Anus Licking" true true false>>
<<run $player.status.energy.decrease(10)>>
/* NPC energy also decreases from the activity */
<<set _npcEnergyLoss = random(5, 10)>>
<<run $interactionNpc.status.energy.decrease(_npcEnergyLoss)>>
<<SpendTimeWithoutUpdate 5>>
<<set _progressGain = random(10, 25)>>
<<if _subLevel < 6>>
<<SetCharProgression $interactionNpc 'submission' _progressGain true>>
<</if>>
<<run gainSexExp($player, "analSkill", Random(2,4))>>
<<run gainSexExp($player, "sexualKnowledge", Random(1,2))>>
<<run gainSexExp($player, "assertiveness", Random(2,4))>>
<div class="interaction-result-panel bdsm-result">
<div class="result-banner critical-success">
<span class="result-icon">🍑</span>
<span class="result-text">Rimming - Success!</span>
</div>
<div class="result-description"><<print _npcName>> rimmed you devotedly.</div>
<div class="metric-changes">
<div class="metric-change positive">
<span class="metric-icon">⛓️</span>
<span class="metric-name">Submission Progress:</span>
<span class="metric-value">+<<print _progressGain>></span>
</div>
<div class="metric-change negative">
<span class="metric-icon">⚡</span>
<span class="metric-name">Your Energy:</span>
<span class="metric-value">-5</span>
</div>
<div class="metric-change negative">
<span class="metric-icon">⚡</span>
<span class="metric-name"><<print _npcName>>'s Energy:</span>
<span class="metric-value">-<<print _npcEnergyLoss>></span>
</div>
</div>
<div class="chance-breakdown">
<div class="chance-header">
Success Chance: <span class="chance-value"><<print _successChance>>%</span>
(Rolled: <<print _roll>>)
</div>
<div class="modifiers-list">
<div class="modifier-item positive">
<span>Base Chance:</span>
<span>+<<print _baseChance>>%</span>
</div>
<div class="modifier-item <<if _progressMod > 0>>positive<<else>>neutral<</if>>">
<span>Submission Progress (<<print _progressPercent>>%):</span>
<span>+<<print _progressMod>>%</span>
</div>
<div class="modifier-item <<if _levelMod > 0>>positive<<else>>neutral<</if>>">
<span>Submission Level (<<print _subLevel>>):</span>
<span>+<<print _levelMod>>%</span>
</div>
<div class="modifier-item <<if _domMod > 0>>positive<<else>>neutral<</if>>">
<span>Your Dominance (<<print _domLevel>>):</span>
<span>+<<print _domMod>>%</span>
</div>
</div>
</div>
</div>
<<else>>
<<Chat $interactionNpc "No fucking way, that's not happening.">>
<<run $player.status.energy.decrease(10)>>
/* NPC energy also decreases from stress */
<<set _npcEnergyLoss = random(6, 15)>>
<<run $interactionNpc.status.energy.decrease(_npcEnergyLoss)>>
<<SpendTimeWithoutUpdate 5>>
/* Relationship penalties for failure - more severe for degrading acts */
<<set _friendLoss = random(4, 8)>>
<<set _loveLoss = random(3, 6)>>
<<set _angerGain = random(4, 7)>>
<<set _negativeFriend = -_friendLoss>>
<<set _negativeLove = -_loveLoss>>
<<IncreaseFriendship $player $interactionNpc _negativeFriend>>
<<IncreaseLove $player $interactionNpc _negativeLove>>
<<set _angerRelations = {anger: _angerGain}>>
<<run $interactionNpc.setRelationship($player.info.id, _angerRelations, true)>>
<<run $player.setRelationship($interactionNpc.info.id, _angerRelations, true)>>
<div class="interaction-result-panel bdsm-result">
<div class="result-banner failure">
<span class="result-icon">❌</span>
<span class="result-text">Rimming - Failed!</span>
</div>
<div class="result-description"><<print _npcName>> refused this act.</div>
<div class="metric-changes">
<div class="metric-change negative">
<span class="metric-icon">💔</span>
<span class="metric-name">Friendship:</span>
<span class="metric-value">-<<print _friendLoss>></span>
</div>
<div class="metric-change negative">
<span class="metric-icon">💕</span>
<span class="metric-name">Love:</span>
<span class="metric-value">-<<print _loveLoss>></span>
</div>
<div class="metric-change negative">
<span class="metric-icon">😠</span>
<span class="metric-name">Anger:</span>
<span class="metric-value">+<<print _angerGain>></span>
</div>
<div class="metric-change negative">
<span class="metric-icon">⚡</span>
<span class="metric-name">Your Energy:</span>
<span class="metric-value">-5</span>
</div>
<div class="metric-change negative">
<span class="metric-icon">⚡</span>
<span class="metric-name"><<print _npcName>>'s Energy:</span>
<span class="metric-value">-<<print _npcEnergyLoss>></span>
</div>
</div>
<div class="chance-breakdown">
<div class="chance-header">
Success Chance: <span class="chance-value"><<print _successChance>>%</span>
(Rolled: <<print _roll>>)
</div>
<div class="modifiers-list">
<div class="modifier-item positive">
<span>Base Chance:</span>
<span>+<<print _baseChance>>%</span>
</div>
<div class="modifier-item <<if _progressMod > 0>>positive<<else>>neutral<</if>>">
<span>Submission Progress (<<print _progressPercent>>%):</span>
<span>+<<print _progressMod>>%</span>
</div>
<div class="modifier-item <<if _levelMod > 0>>positive<<else>>neutral<</if>>">
<span>Submission Level (<<print _subLevel>>):</span>
<span>+<<print _levelMod>>%</span>
</div>
<div class="modifier-item <<if _domMod > 0>>positive<<else>>neutral<</if>>">
<span>Your Dominance (<<print _domLevel>>):</span>
<span>+<<print _domMod>>%</span>
</div>
</div>
</div>
</div>
<</if>>
<div class="bdsm-btn-container padding-top">
<span class="bdsm-btn secondary"><<button "→ Continue" "BDSMTrainingRoom">><</button>></span>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _npcName = $interactionNpc.info.firstName>>
<<set _subLevel = $interactionNpc.attributes.submission.value>>
<<set _subProgress = $interactionNpc.progression.submission.value>>
<<set _subMax = $interactionNpc.progression.submission.max>>
<<set _progressPercent = Math.floor((_subProgress / _subMax) * 100)>>
<<set _domLevel = $player.attributes.dominance.value>>
<<set _baseChance = 10>>
<<set _progressMod = Math.floor(_progressPercent * 0.5)>>
<<set _levelMod = _subLevel * 10>>
<<set _domMod = _domLevel * 6>>
<<set _successChance = Math.min(95, _baseChance + _progressMod + _levelMod + _domMod)>>
<<set _roll = random(1, 100)>>
<<set _success = _roll <= _successChance || _subLevel >= 7>>
<<Chat $player "I'm going to use some toys on you.">>
<<if _success>>
<<switch $player.gender()>>
<<case "Male">>
<<Chat $interactionNpc "Sir, fuck, use them on me, I want it.">>
<<case "Female">>
<<Chat $interactionNpc "Mistress, please, fill me with those toys.">>
<<default>>
<<Chat $interactionNpc "Oh, yes, use the toys on me, I'm ready.">>
<</switch>>
<<DominateTrainingShowVideo $player.gender() $interactionNpc.gender() "Toys in ass" false false true>>
<<run $player.status.energy.decrease(10)>>
/* NPC energy also decreases from the activity */
<<set _npcEnergyLoss = random(5, 10)>>
<<run $interactionNpc.status.energy.decrease(_npcEnergyLoss)>>
<<SpendTimeWithoutUpdate 5>>
<<set _progressGain = random(10, 25)>>
<<if _subLevel < 7>>
<<SetCharProgression $interactionNpc 'submission' _progressGain true>>
<</if>>
<<run gainSexExp($player, "analSkill", Random(2,4))>>
<<run gainSexExp($player, "sexualKnowledge", Random(2,3))>>
<<run gainSexExp($player, "disinhibition", Random(1,2))>>
<div class="interaction-result-panel bdsm-result">
<div class="result-banner critical-success">
<span class="result-icon">🎀</span>
<span class="result-text">Toy Play - Success!</span>
</div>
<div class="result-description">You used toys on <<print _npcName>>.</div>
<div class="metric-changes">
<div class="metric-change positive">
<span class="metric-icon">⛓️</span>
<span class="metric-name">Submission Progress:</span>
<span class="metric-value">+<<print _progressGain>></span>
</div>
<div class="metric-change negative">
<span class="metric-icon">⚡</span>
<span class="metric-name">Your Energy:</span>
<span class="metric-value">-5</span>
</div>
<div class="metric-change negative">
<span class="metric-icon">⚡</span>
<span class="metric-name"><<print _npcName>>'s Energy:</span>
<span class="metric-value">-<<print _npcEnergyLoss>></span>
</div>
</div>
<div class="chance-breakdown">
<div class="chance-header">
Success Chance: <span class="chance-value"><<print _successChance>>%</span>
(Rolled: <<print _roll>>)
</div>
<div class="modifiers-list">
<div class="modifier-item positive">
<span>Base Chance:</span>
<span>+<<print _baseChance>>%</span>
</div>
<div class="modifier-item <<if _progressMod > 0>>positive<<else>>neutral<</if>>">
<span>Submission Progress (<<print _progressPercent>>%):</span>
<span>+<<print _progressMod>>%</span>
</div>
<div class="modifier-item <<if _levelMod > 0>>positive<<else>>neutral<</if>>">
<span>Submission Level (<<print _subLevel>>):</span>
<span>+<<print _levelMod>>%</span>
</div>
<div class="modifier-item <<if _domMod > 0>>positive<<else>>neutral<</if>>">
<span>Your Dominance (<<print _domLevel>>):</span>
<span>+<<print _domMod>>%</span>
</div>
</div>
</div>
</div>
<<else>>
<<Chat $interactionNpc "Hell no, keep that away from me.">>
<<run $player.status.energy.decrease(10)>>
/* NPC energy also decreases from stress */
<<set _npcEnergyLoss = random(6, 15)>>
<<run $interactionNpc.status.energy.decrease(_npcEnergyLoss)>>
<<SpendTimeWithoutUpdate 5>>
/* Relationship penalties for failure */
<<set _friendLoss = random(4, 8)>>
<<set _loveLoss = random(3, 6)>>
<<set _angerGain = random(4, 7)>>
<<set _negativeFriend = -_friendLoss>>
<<set _negativeLove = -_loveLoss>>
<<IncreaseFriendship $player $interactionNpc _negativeFriend>>
<<IncreaseLove $player $interactionNpc _negativeLove>>
<<set _angerRelations = {anger: _angerGain}>>
<<run $interactionNpc.setRelationship($player.info.id, _angerRelations, true)>>
<<run $player.setRelationship($interactionNpc.info.id, _angerRelations, true)>>
<div class="interaction-result-panel bdsm-result">
<div class="result-banner failure">
<span class="result-icon">❌</span>
<span class="result-text">Toy Play - Failed!</span>
</div>
<div class="result-description"><<print _npcName>> refused the toys.</div>
<div class="metric-changes">
<div class="metric-change negative">
<span class="metric-icon">💔</span>
<span class="metric-name">Friendship:</span>
<span class="metric-value">-<<print _friendLoss>></span>
</div>
<div class="metric-change negative">
<span class="metric-icon">💕</span>
<span class="metric-name">Love:</span>
<span class="metric-value">-<<print _loveLoss>></span>
</div>
<div class="metric-change negative">
<span class="metric-icon">😠</span>
<span class="metric-name">Anger:</span>
<span class="metric-value">+<<print _angerGain>></span>
</div>
<div class="metric-change negative">
<span class="metric-icon">⚡</span>
<span class="metric-name">Your Energy:</span>
<span class="metric-value">-5</span>
</div>
<div class="metric-change negative">
<span class="metric-icon">⚡</span>
<span class="metric-name"><<print _npcName>>'s Energy:</span>
<span class="metric-value">-<<print _npcEnergyLoss>></span>
</div>
</div>
<div class="chance-breakdown">
<div class="chance-header">
Success Chance: <span class="chance-value"><<print _successChance>>%</span>
(Rolled: <<print _roll>>)
</div>
<div class="modifiers-list">
<div class="modifier-item positive">
<span>Base Chance:</span>
<span>+<<print _baseChance>>%</span>
</div>
<div class="modifier-item <<if _progressMod > 0>>positive<<else>>neutral<</if>>">
<span>Submission Progress (<<print _progressPercent>>%):</span>
<span>+<<print _progressMod>>%</span>
</div>
<div class="modifier-item <<if _levelMod > 0>>positive<<else>>neutral<</if>>">
<span>Submission Level (<<print _subLevel>>):</span>
<span>+<<print _levelMod>>%</span>
</div>
<div class="modifier-item <<if _domMod > 0>>positive<<else>>neutral<</if>>">
<span>Your Dominance (<<print _domLevel>>):</span>
<span>+<<print _domMod>>%</span>
</div>
</div>
</div>
</div>
<</if>>
<div class="bdsm-btn-container padding-top">
<span class="bdsm-btn secondary"><<button "→ Continue" "BDSMTrainingRoom">><</button>></span>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _npcName = $interactionNpc.info.firstName>>
<<set _subLevel = $interactionNpc.attributes.submission.value>>
<<set _subProgress = $interactionNpc.progression.submission.value>>
<<set _subMax = $interactionNpc.progression.submission.max>>
<<set _progressPercent = Math.floor((_subProgress / _subMax) * 100)>>
<<set _domLevel = $player.attributes.dominance.value>>
<<set _baseChance = 5>>
<<set _progressMod = Math.floor(_progressPercent * 0.5)>>
<<set _levelMod = _subLevel * 10>>
<<set _domMod = _domLevel * 7>>
<<set _successChance = Math.min(95, _baseChance + _progressMod + _levelMod + _domMod)>>
<<set _roll = random(1, 100)>>
<<set _success = _roll <= _successChance || _subLevel >= 8>>
<<Chat $player "I'm going to fuck your pussy hard.">>
<<if _success>>
<<switch $player.gender()>>
<<case "Male">>
<<Chat $interactionNpc "Sir, please, pound my pussy, I'm yours.">>
<<case "Female">>
<<Chat $interactionNpc "Mistress, yes, fuck my pussy deep, I need it.">>
<<default>>
<<Chat $interactionNpc "Oh, fuck my pussy hard, I'm all yours.">>
<</switch>>
<<DominateTrainingShowVideo $interactionNpc.gender() $player.gender() "Vaginal Sex" false false true>>
<<run $player.status.energy.decrease(10)>>
/* NPC energy also decreases from the activity */
<<set _npcEnergyLoss = random(8, 15)>>
<<run $interactionNpc.status.energy.decrease(_npcEnergyLoss)>>
<<SpendTimeWithoutUpdate 5>>
<<set _progressGain = random(10, 25)>>
<<if _subLevel < 8>>
<<SetCharProgression $interactionNpc 'submission' _progressGain true>>
<</if>>
<<run gainSexExp($player, "vaginalSkill", Random(4,8))>>
<<run gainSexExp($player, "sexualKnowledge", Random(2,3))>>
<<run gainSexExp($player, "assertiveness", Random(3,5))>>
<<run gainSexExp($player, "disinhibition", Random(1,3))>>
<div class="interaction-result-panel bdsm-result">
<div class="result-banner critical-success">
<span class="result-icon">💕</span>
<span class="result-text">Vaginal Domination - Success!</span>
</div>
<div class="result-description">You dominated <<print _npcName>> completely.</div>
<div class="metric-changes">
<div class="metric-change positive">
<span class="metric-icon">⛓️</span>
<span class="metric-name">Submission Progress:</span>
<span class="metric-value">+<<print _progressGain>></span>
</div>
<div class="metric-change negative">
<span class="metric-icon">⚡</span>
<span class="metric-name">Your Energy:</span>
<span class="metric-value">-5</span>
</div>
<div class="metric-change negative">
<span class="metric-icon">⚡</span>
<span class="metric-name"><<print _npcName>>'s Energy:</span>
<span class="metric-value">-<<print _npcEnergyLoss>></span>
</div>
</div>
<div class="chance-breakdown">
<div class="chance-header">
Success Chance: <span class="chance-value"><<print _successChance>>%</span>
(Rolled: <<print _roll>>)
</div>
<div class="modifiers-list">
<div class="modifier-item positive">
<span>Base Chance:</span>
<span>+<<print _baseChance>>%</span>
</div>
<div class="modifier-item <<if _progressMod > 0>>positive<<else>>neutral<</if>>">
<span>Submission Progress (<<print _progressPercent>>%):</span>
<span>+<<print _progressMod>>%</span>
</div>
<div class="modifier-item <<if _levelMod > 0>>positive<<else>>neutral<</if>>">
<span>Submission Level (<<print _subLevel>>):</span>
<span>+<<print _levelMod>>%</span>
</div>
<div class="modifier-item <<if _domMod > 0>>positive<<else>>neutral<</if>>">
<span>Your Dominance (<<print _domLevel>>):</span>
<span>+<<print _domMod>>%</span>
</div>
</div>
</div>
</div>
<<else>>
<<Chat $interactionNpc "No way, you're not touching me there.">>
<<run $player.status.energy.decrease(10)>>
/* NPC energy also decreases from stress */
<<set _npcEnergyLoss = random(8, 18)>>
<<run $interactionNpc.status.energy.decrease(_npcEnergyLoss)>>
<<SpendTimeWithoutUpdate 5>>
/* Relationship penalties for failure - severe for sex attempts */
<<set _friendLoss = random(5, 10)>>
<<set _loveLoss = random(4, 8)>>
<<set _sexLoss = random(3, 6)>>
<<set _angerGain = random(5, 8)>>
<<set _negativeFriend = -_friendLoss>>
<<set _negativeLove = -_loveLoss>>
<<set _negativeSex = -_sexLoss>>
<<IncreaseFriendship $player $interactionNpc _negativeFriend>>
<<IncreaseLove $player $interactionNpc _negativeLove>>
<<IncreaseSex $player $interactionNpc _negativeSex>>
<<set _angerRelations = {anger: _angerGain}>>
<<run $interactionNpc.setRelationship($player.info.id, _angerRelations, true)>>
<<run $player.setRelationship($interactionNpc.info.id, _angerRelations, true)>>
<div class="interaction-result-panel bdsm-result">
<div class="result-banner failure">
<span class="result-icon">❌</span>
<span class="result-text">Vaginal Domination - Failed!</span>
</div>
<div class="result-description"><<print _npcName>> refused sex.</div>
<div class="metric-changes">
<div class="metric-change negative">
<span class="metric-icon">💔</span>
<span class="metric-name">Friendship:</span>
<span class="metric-value">-<<print _friendLoss>></span>
</div>
<div class="metric-change negative">
<span class="metric-icon">💕</span>
<span class="metric-name">Love:</span>
<span class="metric-value">-<<print _loveLoss>></span>
</div>
<div class="metric-change negative">
<span class="metric-icon">🔥</span>
<span class="metric-name">Sex:</span>
<span class="metric-value">-<<print _sexLoss>></span>
</div>
<div class="metric-change negative">
<span class="metric-icon">😠</span>
<span class="metric-name">Anger:</span>
<span class="metric-value">+<<print _angerGain>></span>
</div>
<div class="metric-change negative">
<span class="metric-icon">⚡</span>
<span class="metric-name">Your Energy:</span>
<span class="metric-value">-5</span>
</div>
<div class="metric-change negative">
<span class="metric-icon">⚡</span>
<span class="metric-name"><<print _npcName>>'s Energy:</span>
<span class="metric-value">-<<print _npcEnergyLoss>></span>
</div>
</div>
<div class="chance-breakdown">
<div class="chance-header">
Success Chance: <span class="chance-value"><<print _successChance>>%</span>
(Rolled: <<print _roll>>)
</div>
<div class="modifiers-list">
<div class="modifier-item positive">
<span>Base Chance:</span>
<span>+<<print _baseChance>>%</span>
</div>
<div class="modifier-item <<if _progressMod > 0>>positive<<else>>neutral<</if>>">
<span>Submission Progress (<<print _progressPercent>>%):</span>
<span>+<<print _progressMod>>%</span>
</div>
<div class="modifier-item <<if _levelMod > 0>>positive<<else>>neutral<</if>>">
<span>Submission Level (<<print _subLevel>>):</span>
<span>+<<print _levelMod>>%</span>
</div>
<div class="modifier-item <<if _domMod > 0>>positive<<else>>neutral<</if>>">
<span>Your Dominance (<<print _domLevel>>):</span>
<span>+<<print _domMod>>%</span>
</div>
</div>
</div>
</div>
<</if>>
<div class="bdsm-btn-container padding-top">
<span class="bdsm-btn secondary"><<button "→ Continue" "BDSMTrainingRoom">><</button>></span>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _npcName = $interactionNpc.info.firstName>>
<<set _subLevel = $interactionNpc.attributes.submission.value>>
<<set _subProgress = $interactionNpc.progression.submission.value>>
<<set _subMax = $interactionNpc.progression.submission.max>>
<<set _progressPercent = Math.floor((_subProgress / _subMax) * 100)>>
<<set _domLevel = $player.attributes.dominance.value>>
<<set _baseChance = 5>>
<<set _progressMod = Math.floor(_progressPercent * 0.5)>>
<<set _levelMod = _subLevel * 10>>
<<set _domMod = _domLevel * 7>>
<<set _successChance = Math.min(95, _baseChance + _progressMod + _levelMod + _domMod)>>
<<set _roll = random(1, 100)>>
<<set _success = _roll <= _successChance || _subLevel >= 10>>
<<Chat $player "I'm going to fuck your ass now.">>
<<if _success>>
<<switch $player.gender()>>
<<case "Male">>
<<Chat $interactionNpc "Sir, yes, take my ass, I'm all yours.">>
<<case "Female">>
<<Chat $interactionNpc "Mistress, fuck my ass, I want it so bad.">>
<<default>>
<<Chat $interactionNpc "Oh, please, fuck my ass deep, I'm ready.">>
<</switch>>
<<DominateTrainingShowVideo $player.gender() $interactionNpc.gender() "Anal Sex" false false false>>
<<run $player.status.energy.decrease(10)>>
/* NPC energy also decreases from the activity */
<<set _npcEnergyLoss = random(8, 15)>>
<<run $interactionNpc.status.energy.decrease(_npcEnergyLoss)>>
<<SpendTimeWithoutUpdate 5>>
<<set _progressGain = random(10, 25)>>
<<if _subLevel < 10>>
<<SetCharProgression $interactionNpc 'submission' _progressGain true>>
<</if>>
<<run gainSexExp($player, "analSkill", Random(4,8))>>
<<run gainSexExp($player, "sexualKnowledge", Random(2,3))>>
<<run gainSexExp($player, "assertiveness", Random(3,5))>>
<<run gainSexExp($player, "disinhibition", Random(1,3))>>
<div class="interaction-result-panel bdsm-result">
<div class="result-banner critical-success">
<span class="result-icon">🔥</span>
<span class="result-text">Anal Domination - Success!</span>
</div>
<div class="result-description">You took <<print _npcName>>'s ass completely.</div>
<div class="metric-changes">
<div class="metric-change positive">
<span class="metric-icon">⛓️</span>
<span class="metric-name">Submission Progress:</span>
<span class="metric-value">+<<print _progressGain>></span>
</div>
<div class="metric-change negative">
<span class="metric-icon">⚡</span>
<span class="metric-name">Your Energy:</span>
<span class="metric-value">-5</span>
</div>
<div class="metric-change negative">
<span class="metric-icon">⚡</span>
<span class="metric-name"><<print _npcName>>'s Energy:</span>
<span class="metric-value">-<<print _npcEnergyLoss>></span>
</div>
</div>
<div class="chance-breakdown">
<div class="chance-header">
Success Chance: <span class="chance-value"><<print _successChance>>%</span>
(Rolled: <<print _roll>>)
</div>
<div class="modifiers-list">
<div class="modifier-item positive">
<span>Base Chance:</span>
<span>+<<print _baseChance>>%</span>
</div>
<div class="modifier-item <<if _progressMod > 0>>positive<<else>>neutral<</if>>">
<span>Submission Progress (<<print _progressPercent>>%):</span>
<span>+<<print _progressMod>>%</span>
</div>
<div class="modifier-item <<if _levelMod > 0>>positive<<else>>neutral<</if>>">
<span>Submission Level (<<print _subLevel>>):</span>
<span>+<<print _levelMod>>%</span>
</div>
<div class="modifier-item <<if _domMod > 0>>positive<<else>>neutral<</if>>">
<span>Your Dominance (<<print _domLevel>>):</span>
<span>+<<print _domMod>>%</span>
</div>
</div>
</div>
</div>
<<else>>
<<Chat $interactionNpc "Hell no, you're not fucking my ass.">>
<<run $player.status.energy.decrease(10)>>
/* NPC energy also decreases from stress */
<<set _npcEnergyLoss = random(8, 18)>>
<<run $interactionNpc.status.energy.decrease(_npcEnergyLoss)>>
<<SpendTimeWithoutUpdate 5>>
/* Relationship penalties for failure - severe for sex attempts */
<<set _friendLoss = random(5, 10)>>
<<set _loveLoss = random(4, 8)>>
<<set _sexLoss = random(3, 6)>>
<<set _angerGain = random(5, 8)>>
<<set _negativeFriend = -_friendLoss>>
<<set _negativeLove = -_loveLoss>>
<<set _negativeSex = -_sexLoss>>
<<IncreaseFriendship $player $interactionNpc _negativeFriend>>
<<IncreaseLove $player $interactionNpc _negativeLove>>
<<IncreaseSex $player $interactionNpc _negativeSex>>
<<set _angerRelations = {anger: _angerGain}>>
<<run $interactionNpc.setRelationship($player.info.id, _angerRelations, true)>>
<<run $player.setRelationship($interactionNpc.info.id, _angerRelations, true)>>
<div class="interaction-result-panel bdsm-result">
<div class="result-banner failure">
<span class="result-icon">❌</span>
<span class="result-text">Anal Domination - Failed!</span>
</div>
<div class="result-description"><<print _npcName>> refused anal sex.</div>
<div class="metric-changes">
<div class="metric-change negative">
<span class="metric-icon">💔</span>
<span class="metric-name">Friendship:</span>
<span class="metric-value">-<<print _friendLoss>></span>
</div>
<div class="metric-change negative">
<span class="metric-icon">💕</span>
<span class="metric-name">Love:</span>
<span class="metric-value">-<<print _loveLoss>></span>
</div>
<div class="metric-change negative">
<span class="metric-icon">🔥</span>
<span class="metric-name">Sex:</span>
<span class="metric-value">-<<print _sexLoss>></span>
</div>
<div class="metric-change negative">
<span class="metric-icon">😠</span>
<span class="metric-name">Anger:</span>
<span class="metric-value">+<<print _angerGain>></span>
</div>
<div class="metric-change negative">
<span class="metric-icon">⚡</span>
<span class="metric-name">Your Energy:</span>
<span class="metric-value">-5</span>
</div>
<div class="metric-change negative">
<span class="metric-icon">⚡</span>
<span class="metric-name"><<print _npcName>>'s Energy:</span>
<span class="metric-value">-<<print _npcEnergyLoss>></span>
</div>
</div>
<div class="chance-breakdown">
<div class="chance-header">
Success Chance: <span class="chance-value"><<print _successChance>>%</span>
(Rolled: <<print _roll>>)
</div>
<div class="modifiers-list">
<div class="modifier-item positive">
<span>Base Chance:</span>
<span>+<<print _baseChance>>%</span>
</div>
<div class="modifier-item <<if _progressMod > 0>>positive<<else>>neutral<</if>>">
<span>Submission Progress (<<print _progressPercent>>%):</span>
<span>+<<print _progressMod>>%</span>
</div>
<div class="modifier-item <<if _levelMod > 0>>positive<<else>>neutral<</if>>">
<span>Submission Level (<<print _subLevel>>):</span>
<span>+<<print _levelMod>>%</span>
</div>
<div class="modifier-item <<if _domMod > 0>>positive<<else>>neutral<</if>>">
<span>Your Dominance (<<print _domLevel>>):</span>
<span>+<<print _domMod>>%</span>
</div>
</div>
</div>
</div>
<</if>>
<div class="bdsm-btn-container padding-top">
<span class="bdsm-btn secondary"><<button "→ Continue" "BDSMTrainingRoom">><</button>></span>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _Amanda = $Characters.filter((character) => character.info.questInfo.questCharID == 3)[0]>>
<<if !_Amanda>>
/* Recover saves where the event flag was consumed before Amanda was verified. */
<<run $player.characterEvents.unregisterEvent($player.info.id, "AmandaPicnicEvent")>>
<<ChatMessage "Amanda is not available right now.">>
<div class="btn padding-top"><<button "Back" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
<<else>>
<<run $player.characterEvents.registerEvent($player.info.id, "AmandaPicnicEvent", 1)>>
<<ChatMessage 'Amanda\'s suggestion lingers in your mind - the secluded beach, the hush of the waves, the promise of stolen time alone. With your new car waiting in the driveway, the idea of planning a private getaway with her feels dangerously tempting.'>>
<<ChatMessage 'She wants to feel that rush again, and you just promised to make it happen. All that\'s left is to decide when to slip away and how to keep it between the two of you.'>>
<<ChatMessage "Amanda smiles happily, her eyes sparkling in the rays of the setting sun, like reflections of waves on golden sand.">>
<<Chat _Amanda "Yes, this beach is just the same as I remembered it,">>
<<ChatMessage "she whispers, getting out of the car and kicking off her shoes to step barefoot onto the warm sand. The sea breeze plays with her hair, bringing the salty ocean scent mixed with the light floral trail of her perfume - that same vanilla that always awakens something primal in you.">>
<<ChatMessage "You follow her, feeling your heart beat faster from this closeness. The beach is truly deserted: no one around, just the rustle of waves and the cries of seagulls in the distance. She takes your hand, your fingers intertwining naturally, as if it's always been this way.">>
<<Chat _Amanda "Remember I told you? This is where Robert and I... well, really spent time together.">>
<<ChatMessage "Her voice drops lower, more intimate, and she stops, turning to face you. The sun paints her skin in a soft orange hue, and her light dress clings to her body from the sea breeze, outlining curves that are hard to look away from.">>
<<Chat _Amanda "But now... now it's just us here,">>
<<ChatMessage "she continues, stepping closer so you feel the warmth of her breath on your cheek. Her palm slides over your chest, lingering on your heartbeat.">>
<<Chat _Amanda "Want to go for a swim? The water should be warm, like back then.">>
<<ChatMessage "You nod, unable to resist this magnetism, and she pulls you to the water's edge, laughing quietly, like she's sharing a secret. The waves lap at your feet, and in that moment, the world narrows to just the two of you - no past, no Robert, only this instant, full of promises and forbidden heat.">>
<<if $player.gender() == 'Male' || $player.gender() == 'Shemale'>>
<<ChatMessage "The water splashes at your feet, warm and inviting, but Amanda doesn't give you time to think. She turns around, her eyes burning with that same fire you've noticed in her since the first meeting - a mix of desire and playful mischief.">>
<<Chat _Amanda "Let's not waste time,">>
<<ChatMessage "she whispers huskily, taking your hand and leading you a bit farther from the water's edge, where the sand is still warm from the day's sun. She pulls off her dress in one smooth motion, revealing smooth skin lightly touched by tan, and you can't tear your eyes away from her curves-full hips, slim waist, breasts rising with her breath.">>
<<ChatMessage "You follow her lead, shedding your clothes, and the air between you heats up, as if the beach itself is fanning this spark. Amanda pushes you onto the sand, gently but firmly, and you lie back, feeling the grains dig into your skin, adding sharpness to the sensations. She straddles you, facing away in reverse cowgirl - her hair cascades down her back, and her ass presses perfectly against your thighs.">>
<<Chat _Amanda "Like this... yes, just like this,">>
<<ChatMessage "she murmurs, starting to move slowly, rhythmically, her body arching like a wave crashing on the shore.">>
<<ChatMessage "You feel her lower onto you fully, the warmth and tightness enveloping you, making you exhale a moan. Her hands brace on your knees for support, and she quickens the pace, her hips circling, sliding up and down, each thrust sending waves of pleasure through your body. You see her back, the muscles tensing under her skin, and you can't hold back - your hands slide over her thighs, squeezing, guiding, feeling her tremble from your touch.">>
<<if CheckContentFilter(_Amanda)>><<Video "Media\\Sex\\Quest\\Amanda\\Beach\\0.mp4">><</if>>
<<Chat _Amanda "Oh god, sweetie... you're so... strong,">>
<<ChatMessage "she moans, throwing her head back, and her voice merges with the sound of the surf, making the moment even more intimate.">>
<<ChatMessage "The sand beneath you crunches, the sea breeze cools your heated skin, but inside - it's a fire. You prop yourself up slightly to go deeper, and she responds, sinking down harder, her moans growing louder, more broken. The world spins: just her body, yours, and this beach where no one will see, no one will interrupt.">>
<<ChatMessage "The climax crashes like a wave - her body clenches around you, she arches in a bow, crying out in pleasure, and you follow her, giving in completely to this forbidden bliss.">>
<<ChatMessage "Afterward, she turns around, still sitting on you, and kisses you deeply, with a smile:">>
<<Chat _Amanda "That was... magical. Promise we'll come back here again.">>
<<elseif $player.gender() == 'Female'>>
<<ChatMessage "Amanda looks at you with that same smile, full of tenderness and desire, that makes your heart beat faster. The sun is already dipping toward the horizon, painting the sky in shades of orange and pink, and the beach is just as deserted, as if created only for the two of you. She pulls a large towel from her bag - soft, white, with a light lavender scent - and spreads it on the warm sand, farther from the water's edge where the waves won't reach.">>
<<Chat _Amanda "Lie down, sweetie,">>
<<ChatMessage "she whispers huskily, taking your hand and helping you lower onto your back. The towel beneath you is cozy, like a cloud, and you feel the sand spring slightly under it, adding a light roughness to the sensations.">>
<<ChatMessage "Your legs are still wet from the sea water, your skin covered in goosebumps from the breeze, but Amanda leans over you, her body warm and close, chasing away any chill. She kisses you slowly, deeply - her lips soft, her tongue sliding over yours, igniting a spark low in your belly. Her hands glide over your shoulders, down your sides, pulling off your bikini in one deft motion, baring you completely.">>
<<Chat _Amanda "You're so beautiful... so responsive,">>
<<ChatMessage "she murmurs, her breath hot on your neck as her fingers touch your breasts, gently squeezing your nipples, making you arch.">>
<<ChatMessage "Then she moves lower, her palm resting on your stomach, slowly descending between your legs. You feel your body tense in anticipation, your thighs parting slightly on their own. Amanda looks into your eyes, her gaze full of passion, and whispers:">>
<<Chat _Amanda "Relax, darling... let me take care of you.">>
<<ChatMessage "Her fingers find your vagina-first one, gently sliding over your clit, circling, teasing, drawing a wave of warmth that spreads through your whole body. You moan quietly, fingers digging into the towel, and she adds a second finger, penetrating deeper, slowly but confidently, feeling you get wetter with each movement.">>
<<if CheckContentFilter(_Amanda)>><<Video "Media\\Sex\\Quest\\Amanda\\Beach\\1.mp4">><</if>>
<<ChatMessage "Her rhythm builds-fingers moving inside you, curling to hit that spot that makes you gasp for breath. Her thumb presses against your clit, massaging in circles, syncing with the thrusts inside.">>
<<Chat _Amanda "Yes... like that, sweetie... you're so tight, so hot,">>
<<ChatMessage "she moans, leaning down to kiss your neck, nibbling the skin while her free hand caresses your breast. Your body writhes under her, hips rising to meet her hand, the world narrowing to this heat, to her touches, to your moans merging with the sound of the waves. The climax hits suddenly, like a tide-muscles clenching around her fingers, waves of orgasm rolling through you, making you cry out her name. Amanda doesn't stop, prolonging the pleasure with soft movements until you go limp, breathing heavily.">>
<<ChatMessage "Afterward, she turns around, still sitting on you, and kisses you deeply, with a smile:">>
<<Chat _Amanda "That was... magical. Promise we'll come back here again.">>
<</if>>
<<if $player.characterEvents.isEventRegistered($player.info.id, "AmandaPicnicQuestCompleted") == false>>
<<run $player.characterEvents.registerEvent($player.info.id, "AmandaPicnicQuestCompleted", 1)>>
<</if>>
<div class="btn padding-top"><<button "Continue" $player.info.currentLocation>><</button>></div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set $canShowStatsBtn = false>>
<<set $gameSettings.allowSaves = false>>
<<run $player.characterEvents.registerEvent($player.info.id, "AmandaQuest1", 1)>>
<<ChatMessage 'Amanda was a sharp, confident woman with a commanding presence and a figure that turned heads. You\'d always found her intriguing - her sly smile and the way her pencil skirts hugged her curves didn\'t help. On a whim, you decided to pop in and say hi.'>>
<<Chat $interactionNpc 'Well, look who it is. *She purrs, leaning back in her chair, her eyes glinting with amusement.* To what do I owe this visit, troublemaker?'>>
<<Chat $player 'Just passing by. *You grin, leaning against the doorframe.* Thought I\'d see how the corporate queen is holding up.'>>
<<Chat $interactionNpc 'Flatterer. You\'re lucky I\'m in a good mood. *Her laugh is a low, throaty sound that sends a shiver down your spine; a flicker of frustration creases her brow.* Actually, you might be a lifesaver. I forgot some critical documents at home-contracts for a deal we\'re closing tomorrow. I can\'t leave the office right now. Could you be a dear and grab them for me?'>>
<<Chat $player 'Sure thing, Amanda. Where are they?'>>
<<Chat $interactionNpc 'In my bedroom. Hurry back, and I\'ll owe you one.'>>
<<ChatMessage 'You\'re heading home to pick up Amanda\'s necessary documents. You head out, the errand feeling like a small adventure. Her perfume still lingers in the bedroom. In the top drawer you find the documents-along with a silky black thong tucked away like a secret. Shaking your head with a smirk, you grab the papers and hurry back.'>>
<<ChatMessage 'The office corridors are quiet now, most employees gone for the day. Near Amanda\'s door you pass Mr. Grayson\'s office; it stands slightly ajar, and a low, guttural moan stops you in your tracks. Curiosity wins. Heart pounding, you nudge the door just enough to peek inside.'>>
<<ChatMessage 'Mr. Grayson-silver‑fox and CEO-lounges in his leather chair, pants pooled at his ankles. Between his spread thighs kneels a young intern, glossy red lips wrapped around his thick, veiny cock. Wet, rhythmic slurps fill the room, blending with his ragged breaths.'>>
<<ChatWithoutNPC 'Mr. Grayson' 'Media\\Characters\\QuestChars\\Other\\Mr. Grayson.png' 'Fuck, you\'re good at this.'>>
<<Video "Media\\Characters\\QuestChars\\Amanda\\Quest\\1\\blowjob.mp4">>
<<ChatMessage 'The intern takes him deeper, cheeks hollowing with each eager pull. Grayson tangles his fingers in her ponytail, guiding her pace, hips twitching.'>>
<<ChatWithoutNPC 'Mr. Grayson' 'Media\\Characters\\QuestChars\\Other\\Mr. Grayson.png' 'I\'m close.'>>
<<ChatMessage 'With a guttural moan he spills down her throat; she swallows every drop, licking the last strand of cum from his glistening tip before smirking up at him. You back away, pulse racing, and head straight to Amanda.'>>
<<ChatMessage 'She looks up from her computer as you enter.'>>
<<Chat $interactionNpc 'My hero returns. *She teases, plucking the documents from your hand.* You\'re a lifesaver.'>>
<<Chat $player 'No problem. Anything else you need?'>>
<<Chat $interactionNpc 'Not for now. *She leans forward, cleavage just visible, eyes locking on yours.* But stick around, and I might find something for you to do.'>>
<<ChatMessage 'You leave with a grin, replaying the day in your mind-Amanda\'s knowing smile, the silky thong in her drawer, and the filthy secret you witnessed in Grayson\'s office. One hell of a detour.'>>
<div class="btn padding-top"><<button "Continue" $player.info.currentLocation>>
<<set $canShowStatsBtn = true>>
<<set $gameSettings.allowSaves = true>>
<</button>></div>
<</nobr>><<nobr>>
<<if $player.info.currentLocation == "BC_Amanda_Office">>
<<if $player.characterEvents.isEventRegistered($player.info.id, "AmandaQuest1") == false>>
<<set _questGotoPassage = "Amanda_Quest1_Start">>
<<else>>
<<if $player.characterEvents.isEventRegistered($player.info.id, "AmandaQuest1") == true && $player.characterEvents.isEventRegistered($player.info.id, "AmandaPicnicEvent") == false && $playercars && $playercars.length > 0>>
<<set _questGotoPassage = "Amanda_Picnic_Event">>
<</if>>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<switch $interactionNpc.info.questInfo.questCharID >>
<<case 0>>
<<include "CheckEthanQuests">>
<<case 2>>
<<include "CheckSarahQuests">>
<<case 3>>
<<include "CheckAmandaQuests">>
<<case 4>>
<<include "CheckDamianQuests">>
<<case 6>>
<<include "CheckSketchyGuyQuests">>
<<case 10>>
<<include "CheckSuccubusQuest">>
<</switch>>
<</nobr>><<nobr>>
/* Repair old saves where the quest auto-completed after an intermediate task. */
<<if getQuestState("damian_quest3") == "completed" && getTaskState("damian_quest3", "Go down to the lower level and meet the first-floor manager") != "completed">>
<<if getTaskState("damian_quest3", "Earn 50 nightclub reputation points") == "not found">>
<<run addTaskToQuest("damian_quest3", { description: "Earn 50 nightclub reputation points", completed: false })>>
<</if>>
<<if getTaskState("damian_quest3", "Go down to the lower level and meet the first-floor manager") == "not found">>
<<run addTaskToQuest("damian_quest3", { description: "Go down to the lower level and meet the first-floor manager", completed: false })>>
<</if>>
<<run activateQuest("damian_quest3")>>
<</if>>
<<if $player.characterEvents.isEventRegistered($player.info.id, "GetDamianContract") && !$Characters.find(c => c.info.characterWork == "Etheriant")>>
<<run $player.characterEvents.unregisterEvent($player.info.id, "GetDamianContract")>>
<</if>>
<<if getQuestState("damian_contract") == "active" && getIncompleteTasksCount("damian_contract") == 1>>
<<set _questGotoPassage = "CompleteContract_Damian">>
<<elseif getQuestState("damian_quest3") == "active" && $player.characterEvents.isEventRegistered($player.info.id, "NightClubElevatorAccess") == false && getTaskState("damian_quest3", "Ask the club owner about the elevator") != 'completed'>>
<<set _questGotoPassage = "DamianQuest3_Start">>
<<elseif getQuestState("damian_quest3") == "active" && getTaskState("damian_quest3", "Earn 50 nightclub reputation points") != 'completed' && $player.info.reputation.nightclub.value >= 50>>
<<set _questGotoPassage = "DamianQuest3_GetAccess">>
<<elseif getQuestState("damian_quest3") == "completed" && getQuestState("damian_quest4") == undefined>>
<<set _questGotoPassage = "Damian_Quest4_Start">>
<<elseif getQuestState("damian_quest4") == "active" && getTaskState("damian_quest4", "Find and eliminate the succubus") == 'completed' && getTaskState("damian_quest4", "Return to Damian") != 'completed'>>
<<set _questGotoPassage = "Damian_Quest4_Start_Finish">>
<<elseif $player.info.reputation.nightclub.value >= 70 && getQuestState("meet_mad_dog") == undefined>>
<<set _questGotoPassage = "MadDog_Quest1_Start_VIP">>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "CreateDamianTarget">>
<<ChatMessage 'Damian slides a small data pad across the table, his smirk never wavering.'>>
<<Chat $interactionNpc 'Your target is _etheriant.info.firstName _etheriant.info.secondName. They’ve been causing problems, and someone wants them gone.'>>
<<ChatMessage 'He taps the screen, pulling up an image of a rough-looking individual, their details flickering across the display.'>>
<<Chat $interactionNpc 'They’re somewhere in Skid Row. A real cesspit, even by this city\'s standards. Shouldn’t be too hard to find if you know where to look.'>>
<<ChatMessage 'He leans forward slightly, lowering his voice.'>>
<<Chat $interactionNpc 'Make it clean. Make it quiet. And don’t come back until the job’s done.'>>
<<set _targetName = _etheriant.info.firstName + " " + _etheriant.info.secondName + " must be eliminated.">>
<<if getQuestState("damian_contract") == undefined>>
<<run _questList = [
{
id: "damian_contract",
title: "Etheriant (Repeatable)",
description: "Eliminate the target",
state: "active",
questType: "side",
tasks: [
{ description: _targetName, completed: false },
{ description: "Report to Damian", completed: false }
],
}
]>>
<<CreateQuest _questList true>>
<<else>>
<<set _newTasks = [
{ description: _targetName, completed: false},
{ description: "Report to Damian", completed: false},
]>>
<<run replaceQuestTasks("damian_contract", _newTasks)>>
<<set _quests = [getQuestById("damian_contract")]>>
<<run activateQuest("damian_contract")>>
<<CreateQuestNotification _quests>>
<</if>>
<<run $player.characterEvents.registerEvent($player.info.id, "GetDamianContract", 1)>>
<div class="padding-top">
<div class="btn"><<button "Continue" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "CharactersData">>
<<run _etheriant = CreateCharacter({
isPlayer: false,
characterWork: "Etheriant",
SexRole: "Active",
dominance: 10,
sexualPreference: "Bi",
}, true)>>
<<run $player.characterEvents.registerEvent(_etheriant.info.id, "knows you", 1)>>
<<unset $maleNames $femaleNames $surnames>>
<<run RelocateCharacters()>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<Chat $interactionNpc 'Back so soon? That’s either a good thing or a bad thing.'>>
<<ChatMessage 'You place an item - proof of the completed contract - on the table. Damian eyes it for a moment before nodding approvingly.'>>
<<Chat $interactionNpc 'Looks like you did the job right. I knew you had potential.'>>
<<ChatMessage 'He slides a sleek metal case across the table. As you open it, you see neatly stacked bills - your reward.'>>
<<Chat $interactionNpc 'As promised. Good work. Keep this up, and you’ll go far in this business.'>>
<<ChatMessage 'He leans forward, resting his elbows on the table.'>>
<<Chat $interactionNpc 'Now tell me… are you ready for another job?'>>
<<run completeTaskByQuestID("damian_contract", "Report to Damian")>>
<<run $player.characterEvents.unregisterEvent($player.info.id, "GetDamianContract")>>
/* The contract quest repeats (and a refusal fails it): this remembers that at least one was done. */
<<run $player.characterEvents.registerEvent($player.info.id, "DamianContractDone", 1)>>
<<set $player.money += 2000>>
<<run $player.info.reputation.nightclub.increase(3)>>
<div class="padding-top">
<div class="btn"><<button "Continue" "QuestCharInteraction">><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<Chat $player 'I can\'t take this contract. I\'m backing out.'>>
<<ChatMessage 'Damian\'s expression hardens, his eyes narrowing as he leans back in his chair.'>>
<<Chat $interactionNpc 'Backing out? That\'s not how this works. You take a job, you finish it.'>>
<<ChatMessage 'He stubs out his cigarette with deliberate slowness, his gaze never leaving yours.'>>
<<Chat $interactionNpc 'But fine. Walk away. Just know-this doesn\'t look good for you. Next time, think twice before wasting my time.'>>
<<set _etheriant = $Characters.find(c => c.info.characterWork == "Etheriant")>>
<<if _etheriant>>
<<DeleteCharacter _etheriant>>
<</if>>
<<run $player.characterEvents.unregisterEvent($player.info.id, "GetDamianContract")>>
<<run failQuest("damian_contract")>>
<div class="padding-top">
<div class="btn"><<button "Continue" "QuestCharInteraction">><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<Chat $player 'Hey Damian, I noticed an elevator back there. What\'s that all about?'>>
<<Chat $interactionNpc 'Ah, that\'s the elevator for our special guests. If you wanna get access, you\'ll have to make a name for yourself around here first. Come back when you\'re popular enough. *Nightclub reputation of 50 or more required.*'>>
/* Backfill the complete task chain before closing any task, including old saves
created when this quest only contained its current step. */
<<if getTaskState("damian_quest3", "Earn 50 nightclub reputation points") == "not found">>
<<run addTaskToQuest("damian_quest3", { description: "Earn 50 nightclub reputation points", completed: false })>>
<</if>>
<<if getTaskState("damian_quest3", "Go down to the lower level and meet the first-floor manager") == "not found">>
<<run addTaskToQuest("damian_quest3", { description: "Go down to the lower level and meet the first-floor manager", completed: false })>>
<</if>>
<<run completeTaskByQuestID("damian_quest3", "Ask the club owner about the elevator")>>
<<if $player.info.reputation.nightclub.value >= 50>>
<<run completeTaskByQuestID("damian_quest3", "Earn 50 nightclub reputation points")>>
<div class="btn padding-top"><<button "I already have enough of a reputation" "DamianQuest3_GetAccess">><</button>></div>
<<else>>
<div class="btn padding-top"><<button "Continue" "NC_VIP_Lounge">>
<<set $canShowStatsBtn = true>>
<<set $gameSettings.allowSaves = true>>
<</button>></div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<Chat $interactionNpc 'Nice job! You\'ve gotten pretty popular around here. Here\'s your access card - now you can head down to the club\'s lower level. Enjoy yourself!'>>
<<run $player.characterEvents.registerEvent($player.info.id, "NightClubElevatorAccess", 1)>>
<<if getTaskState("damian_quest3", "Go down to the lower level and meet the first-floor manager") == "not found">>
<<run addTaskToQuest("damian_quest3", { description: "Go down to the lower level and meet the first-floor manager", completed: false })>>
<</if>>
<<if getTaskState("damian_quest3", "Earn 50 nightclub reputation points") != 'completed'>>
<<run completeTaskByQuestID("damian_quest3", "Earn 50 nightclub reputation points")>>
<</if>>
<div class="btn padding-top"><<button "Continue" "NC_VIP_Lounge">><<set $canShowStatsBtn = true>>
<<set $gameSettings.allowSaves = true>><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<Chat $interactionNpc '*His voice was low, heavy, like the bass thumping through the club\'s walls* You showed up right on time. There\'s a creature in the city that needs to be taken out. Fast. Quiet. An etheriant succubus. Don\'t expect fairy tales about winged demons with tails-this is a human, but her mind\'s been consumed by etherium. She\'s gone insane. Seduces people, breaks their will, turns them into mindless puppets. Some very powerful people handed me a contract to eliminate her. And I\'m assigning it to you.'>>
<<Chat $interactionNpc 'Find her. Eliminate her. *tapping his fingers on the table* And don\'t let your guard down. Her power\'s in the etherium. She gets into your head, controls your mind. Give her a chance, and you\'ll end up another one of her dogs.'>>
<<include "Damian_Quest4_CreateQuest">>
<<include "DamianQuest4_CreateSuccubus">>
<div class="btn padding-top"><<button "Continue" "NC_VIP_Lounge">><<set $canShowStatsBtn = true>>
<<set $gameSettings.allowSaves = true>><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<Chat $interactionNpc 'You... *narrowed his eyes, a hint of surprise in his voice* You became an etheriant. But you\'re not a husk. You control it. That\'s... rare.'>>
<<ChatMessage 'You briefly explained what happened: the fight, the victory, the ether now living inside you.'>>
<<ChatMessage 'Damian listened without interrupting, his fingers still on the table.'>>
<<Chat $interactionNpc 'The ether\'s yours now. You can use it. Control people, make them your servants. But you\'re not strong enough yet. For now, to break someone\'s will, you\'ll need to weaken them in a fight. Only then will the ether work.'>>
<<ChatMessage 'You nodded. The new power coursed through your veins.'>>
/* Next step */
<div class="btn padding-top"><<button "Continue" $player.info.currentLocation>>
<<LeaveInteractionSettings>>
<<if getTaskState("damian_quest4", "Return to Damian") != 'completed'>>
<<run completeTaskByQuestID("damian_quest4", "Return to Damian")>>
<</if>>
<<if $player.characterEvents.isEventRegistered($player.info.id, "CanTakeServants") == false>>
<<run $player.characterEvents.registerEvent($player.info.id, "CanTakeServants", 1)>>
<</if>>
<</button>></div>
<</nobr>><<nobr>>
<<include "CharactersData">>
<<run CreateCharacter({
isPlayer: false,
isQuestCharacter: true,
questCharID: 10,
currentQuestID: 0,
currentCharImg: "Media\\Characters\\QuestChars\\Other\\SuccubusEthereant.jpg",
currentCharState: "Succubus",
characterWork: "Succubus",
SexRole: "Active",
dominance: 5,
gender: "Female",
fat: 40,
firstName: "Succubus",
secondName: "Etheriant",
strength: 7,
vitality: 7,
endurance: 7,
dexterity: 7,
defense: 7,
sexualPreference: "Bi",
clothesPreference: "women",
skin: "White",
age: 34,
}, true)>>
<<unset $maleNames $femaleNames $surnames>>
<<run RelocateCharacters()>>
<</nobr>><<nobr>>
<<run _questList = [
{
id: "damian_quest4",
title: "Succubus Hunt",
description: "Damian gave me a contract to eliminate a succubus that's been spotted in Skid Row.",
state: "active",
questType: "side",
tasks: [
{ description: "Find and eliminate the succubus", completed: false }
],
}
]>>
<<CreateQuest _questList true>>
<</nobr>><<nobr>>
<<set _questGotoPassage = "SuccubusQuest_Interaction">>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set $canShowStatsBtn = false>>
<<set $gameSettings.allowSaves = false>>
<<ShowNpcIcon $interactionNpc>>
<<include "NPC_Quest_Stats_Visualize">>
<<set _battleSetControls = {attack: true, seduce: true, items: true, actions: true}>>
<div class="btn padding-top"><<button "Fight">><<StartFight $player $interactionNpc _battleSetControls "CheckSuccubusQuest_win" "HuntForSuccubus_Lose">><</button>></div>
<div class="padding-top">
<div class="btn"><<button "Leave" "NudeCheck">>
<<set $canShowStatsBtn = true>>
<<set $gameSettings.allowSaves = true>>
<</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ChatMessage 'You won. She gasped, twitched, and collapsed to her knees.'>>
<<ChatMessage 'Then something unexpected happened. Ether poured out of her body - not smoke, not light, but something alive, pulsing. The stream hit you, flooding into you through your mouth, eyes, skin. You fell, choking, feeling the alien force fill you. But instead of breaking your mind, the ether... submitted. It became part of you.'>>
<<run addTaskToQuest("damian_quest4", {
description: "Return to Damian",
completed: false,
})>>
<<if getTaskState("damian_quest4", "Find and eliminate the succubus") != 'completed'>>
<<run completeTaskByQuestID("damian_quest4", "Find and eliminate the succubus")>>
<</if>>
<<DeleteCharacter $interactionNpc>>
<<run RelocateCharacters()>>
<div class="btn padding-top"><<button "Leave" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ChatMessage 'The succubus approached, her steps light, almost weightless. She leaned over you, her eyes gleaming with triumph.'>>
<<Chat $interactionNpc 'Mine *she whispered, reaching out*'>>
<<ChatMessage 'Ether flowed toward you, wrapping around your mind, but... nothing happened. Her smile faltered.'>>
<<Chat $interactionNpc 'Interesting *she murmured, leaning closer* You don\'t break. You\'re... special.'>>
<<ChatMessage 'Her breath smelled sweet and rotten.'>>
<<Chat $interactionNpc 'I\'ve found rare prey *she said, her voice almost tender* We\'ll meet again. And I\'ll figure out what makes you tick.'>>
<<ChatMessage 'With that, she melted into the shadows, leaving you lying in the dust - alive, but battered. You knew: this wasn\'t the end. She\'d be back. And next time, she\'d be ready.'>>
<div class="btn padding-top"><<button "Leave" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<LockSettings>>
<<set _raynaImg = 'Media\\Characters\\QuestChars\\Detective\\Detective.png'>>
<<DrawImage _raynaImg>>
<<ChatWithoutNPC 'Rayna' _raynaImg 'You the one Dog sent? Hope he didn\'t sell me twice.'>>
<div class="btn padding-top"><<button 'I\'m here for BioGenesis intel. I\'m in.' 'Rayna_Voss_Quest1_Introduce'>><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _raynaImg = 'Media\\Characters\\QuestChars\\Detective\\Detective.png'>>
<<DrawImage _raynaImg>>
<<ChatWithoutNPC 'Rayna' _raynaImg 'Before I leak anything - you prove you won\'t leak me. There\'s a site. Basement. SkidRow. Bring me the doc packet and we talk grown-up.'>>
<<ChatWithoutNPC 'Rayna' _raynaImg 'Oh - and my source says security\'s light tonight. Shouldn\'t be many guards lurking around that basement.'>>
<<run addTaskToQuest("rayna_voss_quest1", {
description: "After dark, infiltrate the BioGenesis basement in Skid Row",
completed: false,
})>>
<<run addTaskToQuest("rayna_voss_quest1", {
description: "Retrieve the documents from the Skid Row basement",
completed: false,
})>>
<<run completeTaskByQuestID("rayna_voss_quest1", "Track down Detective Rayna Voss in the city park")>>
<div class="btn padding-top"><<button "Leave" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _raynaImg = 'Media\\Characters\\QuestChars\\Detective\\Detective.png'>>
<<DrawImage _raynaImg>>
<<ChatWithoutNPC 'Rayna' _raynaImg 'Still waiting on those documents. Don\'t drag your feet.'>>
<div class="btn padding-top"><<button "Leave" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if ($dateTime.hours >= 22 || $dateTime.hours <= 4) == false>>
<<ChatMessage 'It’s not time yet. You need to come between 10:00 p.m. and 4:00 a.m.'>>
<div class="btn padding-top"><<button "Leave" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
<<else>>
<<LockSettings>>
<<set _guard = 'Media\\Characters\\QuestChars\\Other\\Security.png'>>
<<DrawImage _guard>>
<<ChatWithoutNPC 'Guard' _guard 'Basement\'s closed. Beat it.'>>
<div class="btn padding-top"><<button 'Fight' 'Rayna_Voss_Quest1_GuardFight'>><</button>></div>
<<if $player.gender() == 'Female' || $player.gender() == 'Shemale'>>
<div class="btn padding-top"><<button 'Offer a blowjob' 'Rayna_Voss_Quest1_GuardFight_Blowjob'>><</button>></div>
<<else>>
<div class="btn non-interacting padding-top" id='bj-offer-guard'><<button "Offer a blowjob">><</button>></div>
<<done>>
<<done>>
<<run addHoverTooltip('bj-offer-guard', 'Requirement: Player gender = Female or Shemale.')>>
<</done>>
<</done>>
<</if>>
<<if $player.money >= 1000>>
<div class="btn padding-top"><<button 'Bribe ($1000)' 'Rayna_Voss_Quest1_GuardFight_Bribe'>><</button>></div>
<<else>>
<div class="btn non-interacting padding-top"><<button "Bribe ($1000)">><</button>></div>
<</if>>
<div class="btn padding-top"><<button 'Leave' $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "CharactersData">>
<<run _guard = CreateCharacter({
isPlayer: false,
isQuestCharacter: true,
questCharID: 11,
currentQuestID: 0,
currentCharImg: 'Media\\Characters\\QuestChars\\Other\\Security.png',
currentCharState: "Security Guard",
characterWork: "Security",
SexRole: "Active",
dominance: 8,
gender: "Male",
fat: 40,
strength: 6,
vitality: 5,
endurance: 5,
dexterity: 5,
defense: 5,
sexualPreference: "Straight",
clothesPreference: "men",
skin: "White",
age: 30,
}, true)>>
<<set $indexNPC = $Characters.indexOf(_guard)>>
<<set $interactionNpc = $Characters[$indexNPC]>>
<<unset $maleNames $femaleNames $surnames>>
<<set _battleSetControls = {attack: true, seduce: false, items: true, actions: true}>>
<<StartFight $player $interactionNpc _battleSetControls 'Rayna_Voss_Quest1_GuardFight_Win' 'Rayna_Voss_Quest1_GuardFight_Lose'>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ChatMessage 'You knock the guard out cold, leaving him sprawled on the ground.'>>
<div class="btn padding-top"><<button "Continue" "BG_Basement_Corridor">><<DeleteCharacter $interactionNpc>><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ChatMessage 'The guard overpowers you and tosses you into the alley.'>>
<div class="btn padding-top"><<button "Back" "SR_SkidRow">><<DeleteCharacter $interactionNpc>><<LeaveInteractionSettings>><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _guard = 'Media\\Characters\\QuestChars\\Other\\Security.png'>>
<<run _pic = "Media\\Characters\\QuestChars\\Other\\Security\\securityBJ.mp4">>
<<Video _pic>>
<<ChatMessage 'You drop to your knees in the grimy alley, the cold pavement biting into your skin. The guard looms over you, his belt clinking as you tug down his zipper with unsteady hands. His cock’s already half-hard, thick and heavy as you wrap your lips around it. He groans, rough fingers tangling in your hair, guiding you deeper. The taste of him-salty, musky-fills your mouth as you work him, tongue swirling, cheeks hollowing with each slow, deliberate suck. His hips buck, impatient, and you gag slightly, eyes watering, but you keep going, the wet sounds loud in the quiet night. When he finishes, it’s with a guttural grunt, spilling hot and bitter down your throat. You swallow hard, the burn lingering as you wipe your lips with the back of your hand, smirking up at him. '>>
<<ChatWithoutNPC 'Guard' _guard 'Fuck, that was good. Hurry up-get inside before someone sees.'>>
<div class="btn padding-top"><<button "Slip inside" "BG_Basement_Corridor">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _guard = 'Media\\Characters\\QuestChars\\Other\\Security.png'>>
<<set $player.money -= 1000>>
<<ChatMessage 'You hand over the cash. The guard counts it and pockets the bills.'>>
<<ChatWithoutNPC 'Guard' _guard 'Fine. Go on in.'>>
<div class="btn padding-top"><<button "Enter" "BG_Basement_Corridor">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ChatMessage 'You step into the dim hallway of the BioGenesis basement. The air reeks of disinfectant.'>>
<<if $player.characterEvents.isEventRegistered($player.info.id, "ReleaseBGirl") == false>>
<div class="btn padding-top"><<button "Check the chamber" "BG_Basement_Chamber">><</button>></div>
<</if>>
<div class="btn padding-top"><<button "Main room" "BG_Basement_Main">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if $player.characterEvents.isEventRegistered($player.info.id, "ReleaseBGirl")>>
<<ChatMessage 'The bed is empty now-whoever was here is long gone.'>>
<<else>>
<<set _girlImg = 'Media\\Characters\\QuestChars\\Detective\\Quest1\\Woman_sleep.jpg'>>
<<DrawImg _girlImg>>
<<ChatMessage 'Inside the chamber, a girl lies on a medical bed, an IV filled with a red solution feeding her arm.'>>
<<ChatMessage 'You hesitate-if you wake her up, it might cause a scene, and Rayna won\'t like it.'>>
<div class="btn padding-top"><<button "Remove the IV" "BG_Basement_GirlReleased">><</button>></div>
<</if>>
<div class="btn padding-top"><<button "Leave" "BG_Basement_Corridor">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _girlImg = 'Media\\Characters\\QuestChars\\Detective\\Quest1\\Woman_wake.jpg'>>
<<DrawImg _girlImg>>
<<ChatMessage 'You slide the needle out. Her eyes snap open-pupils bright red.'>>
<<set _girlImg2 = 'Media\\Characters\\QuestChars\\Detective\\Quest1\\Woman_angry.jpg'>>
<<DrawImg _girlImg2>>
<<ChatWithoutNPC 'Girl' _girlImg 'What the hell did you do?!'>>
<<ChatMessage 'She curses you out and bolts from the room.'>>
<<run $player.characterEvents.registerEvent($player.info.id, "ReleaseBGirl", 1)>>
<div class="btn padding-top"><<button "Back" "BG_Basement_Corridor">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ChatMessage 'This must be the main office. A cluttered desk sits against the far wall.'>>
<div class="btn padding-top"><<button "Search the desk" "BG_Basement_Documents">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ChatMessage 'You find a folder of BioGenesis documents-exactly what Rayna wanted.'>>
<<run addTaskToQuest("rayna_voss_quest1", { description: "Give the documents to Rayna", completed: false })>>
<<run completeTaskByQuestID("rayna_voss_quest1", "After dark, infiltrate the BioGenesis basement in Skid Row")>>
<<run completeTaskByQuestID("rayna_voss_quest1", "Retrieve the documents from the Skid Row basement")>>
<div class="btn padding-top"><<button "Exit" "SR_SkidRow">><<LeaveInteractionSettings>><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _raynaImg = 'Media\\Characters\\QuestChars\\Detective\\Detective.png'>>
<<DrawImage _raynaImg>>
<<if $player.characterEvents.isEventRegistered($player.info.id, "ReleaseBGirl")>>
<<ChatWithoutNPC 'Rayna' _raynaImg 'You stirred up trouble. BioGenesis will have the whole neighborhood hunting for that girl.'>>
<<ChatWithoutNPC 'Rayna' _raynaImg 'Still, you got the papers. Nice work. I\'ll call once I dig through them.'>>
<<else>>
<<ChatWithoutNPC 'Rayna' _raynaImg 'Clean job. I haven\'t seen such capable help in ages.'>>
<<ChatWithoutNPC 'Rayna' _raynaImg 'I\'ll ring you when I pull intel from these.'>>
<</if>>
<<run completeTaskByQuestID("rayna_voss_quest1", "Give the documents to Rayna")>>
<div class="btn padding-top"><<button "Continue" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
<</nobr>><<nobr>>
<<set _ethanSleepoverWindow = $dateTime.getDayOfWeek() == "Saturday" && $dateTime.hours >= 18>>
<<if getQuestState("ethan_quest_01") == undefined>>
<<set _questGotoPassage = "Ethan_Quest_01_Start">>
<<elseif getQuestState("ethan_quest_01") == "active" && $player.inventory.hasItem("NovaGear X")>>
<<set _questGotoPassage = "Ethan_Quest_01_End">>
<<elseif getQuestState("ethan_quest_01") == "completed" && getQuestState("ethan_quest_02") == undefined && _ethanSleepoverWindow>>
/* Sleepover quest chain - the content existed but was never routed from here. */
<<set _questGotoPassage = "Ethan_Quest_02_Start">>
<<elseif getQuestState("ethan_quest_02") == "active" && _ethanSleepoverWindow>>
/* Accepted the invite but answered "Maybe later" - keep the party reachable. */
<<set _questGotoPassage = "Ethan_Quest_02_Reoffer">>
<<elseif getQuestState("ethan_quest_02") == "completed"
&& !$interactionNpc.dailyEvents.isEventRegistered($interactionNpc.info.id, "Sleepover Today")
&& _ethanSleepoverWindow
&& Random(1, 100) <= 15>>
/* Occasional replayable re-invite - low chance so it doesn't hijack every chat. */
<<set _questGotoPassage = "Ethan_Quest_02_Repeat_Invite">>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ChatMessage 'You step into Ethan’s room. He’s sitting on his bed, staring at his phone. Scattered around the room are old gaming magazines, and on his laptop screen, there’s an article about the latest gaming console.'>>
<<Chat $interactionNpc 'Have you heard? The NovaGear X just dropped… and it looks insane! The graphics, the load times - it’s like playing in the future'>>
<<ChatMessage 'Ethan sighs heavily and puts his phone down.'>>
<<Chat $player 'You want one, huh?'>>
<<Chat $interactionNpc 'Of course I do… But where am I gonna get that kind of money? My old Quantum Edge 5 still works - kinda…'>>
<<ChatMessage 'You can tell he’s trying to act like it’s no big deal, but his voice gives him away. You both have been gaming together for years-pulling all-nighters, strategizing, competing. And now, for the first time, he’s stuck on the sidelines.'>>
<<ChatMessage 'You take a step forward, leaning against his desk, where a pile of old game cases sits.'>>
<<Chat $player 'You know what? I’ll buy it.'>>
<<ChatMessage 'Ethan’s head snaps up, his eyes wide with disbelief'>>
<<Chat $interactionNpc 'Wh-what?! You’re serious?!'>>
<<Chat $player ' Why not? We’ve always played together. What does it matter who buys it? What matters is that we get to have fun like we always do.'>>
<<ChatMessage 'For a moment, the room falls silent. Ethan looks at you like he’s trying to process what you just said. Then, suddenly, he jumps up from the bed and stares at you'>>
<<Chat $interactionNpc 'Dude… You are the best friend ever, you know that?'>>
<<ChatMessage 'His excitement is contagious. He grabs you by the shoulders and shakes you slightly, his energy through the roof.'>>
<<Chat $interactionNpc 'We’re gonna have legendary game nights! We’re beating everything we can get our hands on! Man, this is gonna be insane!'>>
<<ChatMessage 'He immediately grabs his laptop, typing furiously as he searches for where to buy the console. He’s rambling now, throwing out plans for weeks of non-stop gaming.'>>
<<Chat $player 'You didn’t even ask when I’m getting it.'>>
<<Chat $interactionNpc 'Does it matter?! The fact that we’re getting one is all I need to know!'>>
<<if $player.inventory.hasItem("NovaGear X")>>
<<set _hasConsole = true>>
<<else>>
<<set _hasConsole = false>>
<</if>>
<<run _questList = [
{
id: "ethan_quest_01",
title: "Buy a Game Console (NovaGear X)",
description: "You've decided to buy a new game console so you can play with Ethan.",
state: "active",
questType: "side",
tasks: [
{ description: "Purchase a game console", completed: _hasConsole },
{ description: "Give the console to Ethan", completed: false }
],
}
]>>
<<CreateQuest _questList true>>
<div class="padding-top">
<div class="btn"><<button "Leave" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<run completeTaskByQuestID("ethan_quest_01", "Give the console to Ethan")>>
<<run $player.inventory.removeItem("NovaGear X", 1)>>
<<ChatMessage 'Ethan is sitting on his bed, scrolling through reviews and watching gameplay footage. He doesn’t even notice you at first.'>>
<<Chat $interactionNpc 'Man, the ray tracing on this thing is insane… It looks unreal…'>>
<<ChatMessage 'Ethan (without looking up)'>>
<<ChatMessage 'You quietly walk up and place the box on his bed.'>>
<<Chat $player 'I think you should see it in person instead of just watching videos'>>
<<ChatMessage '(Ethan lowers his phone and slowly looks down at the box. For a few seconds, he just blinks, like his brain refuses to process what he’s seeing.'>>
<<Chat $interactionNpc 'Wait… Is this… No way…'>>
<<ChatMessage 'He suddenly jumps up from the bed, grabs the box, flips it over, checks the logo, the seals. His eyes go wide, and his breath catches'>>
<<Chat $interactionNpc 'IS THIS FOR REAL?!'>>
<<ChatMessage 'He tugs at your sleeve, then lets go just as quickly, like he’s afraid he might somehow damage the box.'>>
<<Chat $interactionNpc ' No, no, no… You actually-? You BOUGHT IT?!'>>
<<ChatMessage 'You nod. A second later, Ethan completely loses it. He lets out a loud, excited yell, jumps on the bed, nearly falls off, and hugs the box like it’s the most valuable thing in the world.)'>>
<<Chat $interactionNpc 'WHAT?! DUDE, YOU’RE THE BEST PERSON ALIVE!!!'>>
<<ChatMessage 'He’s pacing the room, then suddenly grabs your shoulders and shakes you.'>>
<<Chat $interactionNpc 'We are setting this up RIGHT NOW! No, scratch that-IMMEDIATELY! Oh my god, I can’t believe this is happening!'>>
<<ChatMessage 'He rushes to his desk, clearing space in a frenzy-old magazines and game cases flying everywhere. He grabs a knife, carefully slicing through the packaging tape like he’s performing some sacred ritual. His hands are shaking with excitement.'>>
<<Chat $interactionNpc 'Dude… I don’t even know what to say… Man… Just… Thank you. Seriously. Thank you.'>>
<<Chat $interactionNpc 'Is there anything I can do to thank you?'>>
<<set _relUpgrd = {friendship: 10}>>
<<SetRelations $player $interactionNpc _relUpgrd>>
<<if $player.gender() == "Male">>
<div class="padding-top">
<div class="btn"><<button "Ask for a kiss (Gay)" "Ethan_Quest_01_End_kiss_MM">><</button>></div>
</div>
<<else>>
<div class="padding-top">
<div class="btn"><<button "Ask for a kiss" "Ethan_Quest_01_End_kiss_FM">><</button>></div>
</div>
<</if>>
<div class="padding-top">
<div class="btn"><<button "Ask him to put on women's clothing." "Ethan_Quest_01_End_Sissy">><</button>></div>
</div>
<div class="padding-top">
<div class="btn"><<button "I don't need anything in return" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<Chat $player 'Well, Ethan, there is something you could do for me in return. But it\'s a bit…unconventional.'>>
<<ChatMessage 'Ethan\'s expression shifts from gratitude to curiosity, a hint of apprehension in his eyes. He swallows nervously, his voice a mixture of intrigue and hesitation'>>
<<Chat $interactionNpc 'I… I owe you big time, $player.info.firstName. I mean, this console must have cost a fortune. Whatever it is, I\'ll consider it. What do you need?'>>
<<Chat $player 'It\'s not something I need, per se. It\'s more of a want. And it\'s entirely up to you, Ethan. But… I\'ve always thought you were quite attractive. I\'d like… a kiss'>>
<<ChatMessage 'The room grows quiet as Ethan\'s cheeks flush a deep shade of crimson. He seems taken aback, his eyes wide with surprise.'>>
<<ChatMessage 'Ethan blinks rapidly, his gaze darting around the room as if searching for an escape from the sudden tension. He takes a deep breath, his hands fidgeting with the plastic wrapping of the game console. Time seems to stand still as you wait for his response, the silence hanging heavy in the air.'>>
<<Chat $interactionNpc 'I… I\'ve never… I mean, I\'m not… wow, $player.info.firstName, I don\'t even know what to say. This is a lot to take in.'>>
<<Chat $player 'Take all the time you need, Ethan. Like I said, it\'s completely your choice. I don\'t want you to feel pressured or uncomfortable. You owe me nothing but friendship.'>>
<<ChatMessage 'Ethan\'s eyes meet yours, and for a moment, you see a flicker of resolve. He sets the game console down carefully on the coffee table, his movements deliberate.'>>
<<Chat $interactionNpc 'You\'re right. I do choose my friends, and I choose you, $player.info.firstName. I trust you. And… and I guess, in a way, this could be my way of saying thank you, couldn\'t it?'>>
<<ChatMessage 'He steps closer, his body language a mix of nervousness and a newfound determination. You can almost hear the pounding of his heart as he leans in, closing his eyes at the last moment.'>>
<!-- Kiss video -->
<<set $interaction = "Kiss">>
<<Interaction $player $interactionNpc>>
<<ChatMessage 'The kiss is tentative, awkward, and brief, but it holds a sincere gratitude that words alone could never convey. As Ethan pulls away, he lets out a soft chuckle, rubbing the back of his neck in a mix of embarrassmen.'>>
<<Chat $interactionNpc 'Wow, that was… different. But you know what? I meant it. Thank you, $player.info.firstName, for everything. The console, the friendship… and for, well, this moment'>>
<<ChatMessage 'You offer a reassuring smile, appreciating the courage it took for Ethan to follow through with the gesture.'>>
<<Chat $player 'No need to thank me again, Ethan. Let\'s just chalk this up to one of those unique memories we\'ll laugh about someday, alright?'>>
<<ChatMessage 'Ethan nods, a genuine smile spreading across his face, the earlier tension now evaporating.'>>
<<Chat $interactionNpc 'Definitely. Now, how about we set up this beast and you can show me how it\'s done?'>>
<<ChatMessage 'The two of you spend the next few hours immersed in the world of video games, the earlier awkwardness replaced by the camaraderie of pixelated battles and victorious cheers.'>>
<!-- Console gaming video -->
<<ChatMessage 'As the evening draws to a close, Ethan walks you to the door, his arm slung casually over your shoulders in a friendly embrace.'>>
<<Chat $interactionNpc 'I\'m serious, $player.info.firstName. You\'ve been there for me through thick and thin. This console, the kiss… they\'re just things. It\'s the thought behind them that counts. I\'m here for you, man. Anytime, anywhere.'>>
<<ChatMessage 'With a final wave, you step out into the night, the sounds of digital adventure fading behind you as you walk away with a smile, knowing that some friendships transcend the ordinary and enter the realm of the extraordinary'>>
<<SpendTime 120>>
<<ChatMessage 'Ethan\'s gay points <strong>increased</strong>'>>
<<run $interactionNpc.characterEvents.registerEvent($interactionNpc.info.id, "Gay Points", 1)>>
<<set _relUpgrd = {love: 10}>>
<<SetRelations $player $interactionNpc _relUpgrd>>
<div class="padding-top">
<div class="btn"><<button "Leave" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ChatMessage 'Your heart flutters a bit at his sincerity, and an impish grin tugs at the corners of your mouth. You step closer, the air between you charged with a playful tension.'>>
<<Chat $player 'Well, there is one way you could show your appreciation.'>>
<<ChatMessage 'Ethan\'s eyebrows raise in a silent question. There\'s a hint of hesitation in his eyes, but the curiosity is stronger.'>>
<<Chat $interactionNpc 'What did you have in mind?'>>
<<ChatMessage 'Your eyes lock with his, and you can see the blush creeping up his cheeks. In the quiet of his room, you take one more step, closing the distance between you both.'>>
<<Chat $player 'A kiss would be a nice start, don\'t you think?'>>
<<ChatMessage 'The words hang in the air, and for a moment, there\'s only the sound of his rapid breathing. Ethan swallows hard, his gaze flickering between your eyes and your lips'>>
<<ChatMessage 'For the longest moment, silence stretched between you. A single heartbeat pounding in your ears as Ethan contemplated your request. His gaze flickered from your eyes, to your lips, and back again, each pass bringing a deeper shade of crimson to his cheeks.'>>
<<Chat $interactionNpc '$player.info.firstName, are you sure about this?'>>
<<ChatMessage 'His voice was a breathy whisper, tinged with both excitement and nervousness.'>>
<<Chat $interactionNpc 'I mean, I want to but… Maybe it\'s a bit much?'>>
<<ChatMessage 'His words were tentative, but his body language screamed otherwise. Hands twitched at his sides, fingers curling and uncurling in a ceaseless drumming of anxious energy. At the base of his throat, a pulse point stuttered, throbbed, pounded beneath delicate skin.'>>
<<ChatMessage 'You reached out, fingers drifting like phantom whispers across his neck to cup his jaw with a feather-light touch.'>>
<<Chat $player 'Oh Ethan.'>>
<<ChatMessage 'The breathy murmur of his name vibrated against heated flesh.'>>
<<Chat $player 'I know what I want.'>>
<<ChatMessage 'Slowly, tortuously, you tilted his face down to meet yours. The press of lips to tender, virgin skin was the barest there and yet, Ethan gasped like you\'d branded him with a lover\'s fire.'>>
<!-- Kiss video -->
<<set $interaction = "Kiss">>
<<Interaction $player $interactionNpc>>
<<ChatMessage 'Through half-lidded eyes, you watched Ethan melt into your caress, the tension bleeding from his spine in heady doses to leave him pliant and aching. Each rasp of breath stirred trembles across slackened lips, the tiniest gnat\'s wing of contact against such uncharted territory.'>>
<<ChatMessage 'Ethan\'s lips tremble beneath your feather-light caress, the barest whisper of contact sending shivers racing down his spine. The heat of your breath against his skin makes him shudder, a low, needy sound caught in his throat.'>>
<<Chat $interactionNpc 'Y-yes, okay.'>>
<<ChatMessage 'He stutters, his hips shifting forward in a subtle, unconscious gesture of desperation'>>
<<ChatMessage 'You swept Ethan\'s lips into a deep, passionate kiss. Your tongue danced along the seam of his mouth, coaxing it open in a tender invitation. As the taste of him filled your senses, you lost yourself in the feeling of his lips moving against your own, pliant and eager in a way that made your head spin.'>>
<<ChatMessage 'Ethan\'s hands found purchase at your waist, fingers digging into the soft flesh in a gesture of desperation. He pulled you closer, molding your body against his own until not an inch of space remained between your curves. The heat of him, the hardness, was a clear delineation of his desire tempered only by shyness.'>>
<<ChatMessage 'You pulled away far too quickly, Ethan\'s lips pillowy soft and rosy from your onslaught.'>>
<<Chat $player 'So good.'>>
<<ChatMessage 'You pressed a lingering kiss to his flushed cheek before releasing him with a playful smirk'>>
<<ChatMessage 'You sauntered out of his room, leaving Ethan a breathless, blushing mess in your wake.'>>
<<run $interactionNpc.characterEvents.registerEvent($interactionNpc.info.id, "Love with FP Points", 1)>>
<<set _relUpgrd = {love: 10}>>
<<SetRelations $player $interactionNpc _relUpgrd>>
<div class="padding-top">
<div class="btn"><<button "Leave" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ChatMessage 'You look at Ethan with a gentle smile, trying not to make him feel uncomfortable'>>
<<Chat $player 'I want you to do something for me, and I know it might seem a little…unusual,'>>\
<<ChatMessage 'your voice soft and measured'>>
<<Chat $player 'But as a thank you for the console, I was wondering if you could…dress up in something a bit different. I have a certain idea in mind, and I think it would be really interesting to see you in it.'>>
<<ChatMessage 'You pause for a moment, letting Ethan process what you\'re asking.'>>
<<Chat $player 'I was thinking maybe you could wear some of your sister Sarah\'s clothes. I\'ve seen her wear some really cute outfits, and I think you might…pull it off surprisingly well'>>
<<ChatMessage 'You continue, trying to phrase it in a way that won\'t make Ethan feel too self-conscious.'>>
<<ChatMessage 'Ethan looks at you nervously, clearly hesitant.'>>
<<Chat $interactionNpc 'I…I don\'t know'>>
<<ChatMessage ' He says, fidgeting slightly'>>
<<Chat $interactionNpc 'That\'s really not my thing. And besides, Sarah would kill me if she found out I was wearing her clothes.'>>
<<ChatMessage 'You can see the uncertainty in Ethan\'s eyes, but you also sense a spark of curiosity. You press on, trying to reassure him.'>>
<<Chat $player 'I promise it\'ll be okay, Ethan. And it\'s just between us. No one else needs to know. Plus, I think it could be…kind of fun. And who knows, you might discover a new side of yourself'>>
<<ChatMessage 'You say, trying to make it sound as appealing and non-threatening as possible.'>>
<<ChatMessage 'Ethan looks away, his cheeks flushing slightly.'>>
<<Chat $interactionNpc 'I…I don\'t know'>>
<<ChatMessage 'He repeats, his voice barely above a whisper.'>>
<<Chat $interactionNpc 'But if I do this, you have to promise not to laugh.'>>
<<ChatMessage 'You nod, trying to look as serious and understanding as possible.'>>
<<Chat $player 'I promise, Ethan. I won\'t laugh. I just want to see you try something new, and I think this could be a really interesting experience for both of us.'>>
<<ChatMessage 'After a moment, Ethan nods slowly, still looking a bit uncertain.'>>
<<Chat $interactionNpc 'Okay…I\'ll do it. But you have to promise not to tease me, and you have to help me pick out something to wear. I have no idea what I\'m doing.'>>
<<ChatMessage 'You smile, trying to put Ethan at ease.'>>
<<Chat $player 'Don\'t worry, I\'ll help you every step of the way. Let\'s go take a look at Sarah\'s closet and see what we can find,'>>
<<ChatMessage 'You say, trying to sound as enthusiastic and supportive as possible. Ethan nods, still looking a bit nervous, and follows you to Sarah\'s room.'>>
<<ChatMessage 'As you browse through Sarah\'s closet, Ethan can\'t help but feel a bit overwhelmed. There are so many clothes, shoes, and accessories to choose from, and he has no idea what would look good on him. You, on the other hand, seem to have a clear idea of what you\'re looking for.'>>
<<Chat $player 'Ah, how about this?'>>
<<ChatMessage 'you say, holding up a denim skirt.'>>
<<Chat $player 'I think this would be a great starting point. It\'s cute, it\'s casual, and it\'s definitely something that would…change up your look a bit.'>>
<<ChatMessage 'Ethan looks at the skirt, his eyes widening slightly as he takes in the sight of it.'>>
<<Chat $interactionNpc 'I…I don\'t know,that\'s really not my style.'>>
<<ChatMessage 'He says, his voice uncertain.'>>
<<ChatMessage 'You smile, trying to reassure him.'>>
<<Chat $player 'That\'s exactly why I think you should try it, Ethan. It\'s not every day you get to experiment with a new look, and I think this could be a really fun experience for you. Plus, I think you\'d be surprised at how…feminine you could look in the right clothes.'>>
<<ChatMessage 'Ethan looks at you, his eyes searching for reassurance. You can see the uncertainty in his gaze, but you also sense a spark of curiosity. After a moment, he nods slowly, taking the skirt from you.'>>
<<Chat $interactionNpc 'Okay…I\'ll try it,'>>
<<ChatMessage 'As Ethan changes into the skirt, you can\'t help but notice how…different he looks. The denim hugs his curves in all the right places, and the way it falls just above his knees makes his legs look…longer, somehow. You can see the blush rising to his cheeks as he realizes how…feminine he must look, and you can\'t help but feel a spark of excitement at the sight of him.'>>
<img class='img' src='Media/Characters/QuestChars/Ethan/Story/Sissy.png' />
<<Chat $player 'Wow, Ethan, you look…really great. I had no idea you could pull off a skirt like that.'>>
<<ChatMessage 'Ethan looks at you, his eyes flashing with embarrassment.'>>
<<Chat $interactionNpc 'Shut up. It\'s just a skirt, okay? Don\'t make a big deal out of it..'>>
<<Chat $player 'I\'m not making fun of you, Ethan. I\'m just…impressed. You look really cute in that skirt.'>>
<<ChatMessage 'After a while, Ethan put his clothes back on and left the room, the denim skirt and blouse laid neatly on the bed, a silent testament to the unexpected turn of events. As he walked out, you couldn\'t help but notice the faintest hint of a smile playing on his lips, a subtle suggestion that despite his initial hesitation, he had found the experience of dressing up as a girl to be… intriguing.'>>
<<ChatMessage 'You watched him leave, a thoughtful expression on your face. It was clear that Ethan had been interested in the idea, perhaps more than he was willing to admit. The way he had looked at himself in the mirror, the tentative way he had touched the fabric of the skirt, it all spoke to a curiosity that went beyond mere politeness.'>>
<<ChatMessage 'As the door closed behind him, you couldn\'t help but wonder what had gone through his mind as he was dressing up. Had he felt a thrill of excitement at the unfamiliar sensation of wearing a skirt? Had he caught a glimpse of himself in the mirror and seen a stranger staring back, a person he hadn\'t known existed?'>>
<<ChatMessage 'The questions swirled in your mind, but one thing was certain - Ethan had been interested. And that interest had been palpable, a spark that had flickered to life in the brief moment he had spent dressed as a girl.'>>
<<ChatMessage 'You smiled to yourself, a plan beginning to form in your mind. It seemed that Ethan might be more open to exploring his feminine side than he had initially let on. And you were more than happy to encourage him, to see where this newfound curiosity might lead.'>>
<<run $interactionNpc.characterEvents.registerEvent($interactionNpc.info.id, "Sissy Points", 1)>>
<<set _relUpgrd = {love: 10}>>
<<SetRelations $player $interactionNpc _relUpgrd>>
<<ChatMessage 'Ethan\'s sissy points <strong>increased</strong>'>>
<div class="padding-top">
<div class="btn"><<button "Leave" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if $dateTime.getDayOfWeek() != "Saturday" || $dateTime.hours < 18>>
<<ChatMessage 'The sleepover is on Saturday evening. Ethan tells you to come back after 18:00.'>>
<div class="padding-top"><div class="btn"><<button "Come back later" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div></div>
<<else>>
<<ChatMessage 'You step into Ethan\'s room. He looks excited, bouncing on his bed with a huge grin on his face.'>>
<<Chat $interactionNpc 'Hey, bro! Listen, my buddy\'s parents left for the weekend, and he\'s throwing an epic sleepover at his house. Beer, food, movies - full blast. Come with me? You won\'t regret it, it\'ll be fun!'>>
<<ChatMessage 'Ethan is practically vibrating with excitement. It\'s been a while since you\'ve seen him this hyped up about something.'>>
<<if $player.gender() == "Male">>
<<Chat $player 'Sounds like a good time. Count me in.'>>
<<elseif $player.gender() == "Female">>
<<Chat $player 'A bunch of guys and just me? Sounds interesting...'>>
<<else>>
<<Chat $player 'Sure, why not? Could be fun.'>>
<</if>>
<<Chat $interactionNpc 'Awesome! I knew you\'d be down. I\'ll pick you up Saturday evening. Trust me, this is going to be legendary!'>>
<<run _questList = [
{
id: "ethan_quest_02",
title: "Sleepover Party",
description: "Ethan invited you to a sleepover party at his friend\'s place in the suburbs.",
state: "active",
questType: "side",
tasks: [
{ description: "Go to the sleepover party with Ethan", completed: false },
{ description: "Finish the sleepover party", completed: false }
],
}
]>>
<<CreateQuest _questList true>>
<div class="padding-top">
<div class="btn"><<button "Go to the party" "Ethan_Quest_02_Arrival">><<SpendTime 60>><</button>></div>
</div>
<div class="padding-top">
<div class="btn"><<button "Maybe later" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
</div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if $dateTime.getDayOfWeek() != "Saturday" || $dateTime.hours < 18>>
<<ChatMessage 'The party is still planned for Saturday evening. Ethan tells you to come back after 18:00.'>>
<div class="padding-top"><div class="btn"><<button "Come back later" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div></div>
<<else>>
<<ChatMessage 'Ethan perks up the moment he sees you.'>>
<<Chat $interactionNpc 'So, the sleepover at my buddy\'s place is still on. Beer, food, movies - the whole deal. You coming or what?'>>
<div class="padding-top">
<div class="btn"><<button "Go to the party" "Ethan_Quest_02_Arrival">><<SpendTime 60>><</button>></div>
</div>
<div class="padding-top">
<div class="btn"><<button "Maybe later" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
</div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/Other/Villa/Villa.jpg">>
<<if getTaskState("ethan_quest_02", "Finish the sleepover party") == "not found">>
<<run addTaskToQuest("ethan_quest_02", { description: "Finish the sleepover party", completed: false })>>
<</if>>
<<run completeTaskByQuestID("ethan_quest_02", "Go to the sleepover party with Ethan")>>
<<ChatMessage 'Saturday evening arrives. You hop into Ethan\'s beat-up car and race to the suburbs. The house is huge - a proper villa with a pool and plenty of rooms. Inside, there\'s already a crowd gathered.'>>
<<if $player.gender() == "Male">>
<<ChatMessage 'You count eight guys total, including you and Ethan. Not a single girl in sight.'>>
<<Chat $interactionNpc 'Fuck, dudes, where are the babes?'>>
<<ChatMessage 'Someone laughs. Ethan shrugs.'>>
<<Chat $interactionNpc 'Well, parents left, didn\'t invite girls to not get caught. But we\'re not losers, we\'ll figure something out.'>>
<<elseif $player.gender() == "Female">>
<<ChatMessage 'You count eight guys and you - the only girl. They all turn to look at you with hungry eyes.'>>
<<Chat $interactionNpc 'Fuck, dudes, we got at least one babe! Player\'s with us!'>>
<<ChatMessage 'The guys cheer. You feel a mix of excitement and nervousness being the center of attention.'>>
<<else>>
<<ChatMessage 'You count eight guys, including Ethan, and you - the only "half-girl" with a surprise in the pants.'>>
<<Chat $interactionNpc 'Fuck, dudes, we have Player - with tits and a surprise in the pants. Anyway, we\'re not losers, we\'ll figure something out.'>>
<</if>>
<<ChatMessage 'Everyone sits down in the spacious living room. Beers are opened, music is turned on, and the atmosphere gets rowdy. Suddenly, one of the guys - a big jock named Max - pulls out a pack of small blue pills from his pocket.'>>
<<set _maxIcon = "">>
<<ChatWithoutNPC "Max" _maxIcon 'Look what I got, you sons of bitches! This shit\'s from the darknet: one pill - and a guy turns into a girl for a day. Full-on, with tits, pussy, and everything. Back to normal in the morning. Let\'s spice up this sleepover!'>>
<<ChatMessage 'Everyone exchanges nervous glances and laughs. The room buzzes with excitement and uncertainty.'>>
<<if $player.gender() == "Male">>
<<goto "Ethan_Quest_02_Male_Draw">>
<<elseif $player.gender() == "Female">>
<<goto "Ethan_Quest_02_Female_Path">>
<<else>>
<<goto "Ethan_Quest_02_Shemale_Draw">>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/Other/Villa/Villa.jpg">>
<<set _maxIcon = "">>
<<Chat $interactionNpc 'Don\'t pussy out, dudes! Draw straws, to make it fair. Short one - swallow the pill and become a bitch for the night.'>>
<<ChatMessage 'They hand out straws - six long ones and two short ones. Your heart pounds as you reach for your straw...'>>
<div class="padding-top">
<div class="btn"><<button "Draw a straw (Random)" "Ethan_Quest_02_Male_Draw_Result">><</button>></div>
</div>
<div class="padding-top">
<div class="btn"><<button "Volunteer to take the pill" "Ethan_Quest_02_Male_Volunteer">><</button>></div>
</div>
<div class="padding-top">
<div class="btn"><<button "Suggest everyone else takes the pill" "Ethan_Quest_02_Male_Everyone_Else">><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/Other/Villa/Villa.jpg">>
<<set _maxIcon = "">>
<<set _drawResult = Random(1, 100)>>
<<if _drawResult <= 50>>
<<set $ethanQuestDrawResult = "short">>
<<set $ethanOrgyOther = "Maxi">>
<<ChatMessage 'You draw... and fuck, it\'s SHORT! The crowd erupts.'>>
<<Chat $interactionNpc 'Ha, Player, you\'re fucked!'>>
<<ChatMessage 'Skinny Jake draws the other short straw. Max grins and swallows a pill voluntarily.'>>
<<ChatWithoutNPC "Max" _maxIcon 'Fine, I\'ll do it voluntarily. Always wanted to try this.'>>
<<ChatMessage 'You look at the small blue pill in your hand. Your mind races with possibilities...'>>
<div class="padding-top">
<div class="btn"><<button "Swallow the pill" "Ethan_Quest_02_Male_Transform">><</button>></div>
</div>
<<else>>
<<set $ethanQuestDrawResult = "long">>
<<ChatMessage 'You draw... and YES! Long straw! You\'re keeping your cock tonight!'>>
<<Chat $interactionNpc 'Ha, Player, you got lucky!'>>
<<ChatMessage 'The short straws go to the big Black guy Ty, skinny Jake, and Max himself. Ty curses under his breath.'>>
<<set _tyIcon = "">>
<<ChatWithoutNPC "Ty" _tyIcon 'Fuck, why me? But rules are rules.'>>
<<ChatWithoutNPC "Max" _maxIcon 'Fine, I\'ll do it voluntarily. Always wanted to try this.'>>
<<ChatMessage 'The three of them swallow their pills. In a couple of minutes, their bodies start changing - bones crack, skin softens, cocks retract, and tits grow.'>>
<div class="padding-top">
<div class="btn"><<button "Watch the transformation" "Ethan_Quest_02_Male_StayMale">><</button>></div>
</div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/Other/Villa/Villa.jpg">>
<<set $ethanOrgyOther = "Maxi">>
<<Chat $player 'Fuck it. I\'ll take the pill voluntarily. Let\'s see what this is all about.'>>
<<ChatMessage 'The room goes quiet for a moment, then erupts in cheers.'>>
<<Chat $interactionNpc 'Holy shit, Player\'s got balls! Respect!'>>
<<ChatMessage 'Two other guys - skinny Jake and Max himself - also volunteer. The rest keep their cocks for the night.'>>
<<ChatMessage 'You look at the small blue pill in your hand, heart pounding with anticipation...'>>
<div class="padding-top">
<div class="btn"><<button "Swallow the pill" "Ethan_Quest_02_Male_Transform">><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/Other/Villa/Villa.jpg">>
<<Chat $player 'Hey, I have a better idea. How about everyone else takes the pills, and I stay the only guy? One king and seven sluts!'>>
<<ChatMessage 'The room goes silent. Then Ethan\'s eyes light up.'>>
<<Chat $interactionNpc 'Fuck, that\'s actually genius! Player\'s the newbie here - let him be the only stud. We all become bitches for the night!'>>
<<set _maxIcon = "">>
<<ChatWithoutNPC "Max" _maxIcon 'Hell yeah! This\'ll be legendary!'>>
<<ChatMessage 'The crowd yells in excitement. All seven guys - including Ethan - swallow the pills. You watch in amazement as their bodies begin to transform.'>>
<div class="padding-top">
<div class="btn"><<button "Watch the transformation" "Ethan_Quest_02_Male_AllTransform">><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/Other/Villa/Villa.jpg">>
<<run prepareTemporaryGenderChange($player, "ethan_quest_02")>>
<<run _changePill = GetNewItem("gender_change_pills_female", 1)>>
<<run $player.useItem(_changePill, $player)>>
<<ChatMessage 'You swallow the pill. In a couple of minutes, your body starts changing - bones crack, skin softens, cock retracts, and tits grow to a nice C-cup. Hair lengthens, voice gets high. You\'re now a girl with a juicy figure and a wet pussy between your legs.'>>
<<if $ethanOrgyOther is "Tyra">>
<<ChatMessage 'Tyra and Jenny watch you change, grinning. Now there\'s six guys left in the room and three "girls" - you, Tyra, and Jenny. The air is thick with sexual tension.'>>
<<else>>
<<ChatMessage 'Jake transforms into Jenny - a cute blonde with a perky ass. Max becomes Maxi - a busty brunette who looks like a porn star.'>>
<<ChatMessage 'Now there\'s six guys left in the room and three "girls" - you, Jenny, and Maxi. The air is thick with sexual tension.'>>
<</if>>
<<Chat $interactionNpc 'Alright, bitches, ready?'>>
<<ChatMessage 'Ethan growls, pulling down his pants. His cock is already rock hard.'>>
<div class="padding-top">
<div class="btn"><<button "Let the orgy begin" "Ethan_Quest_02_Orgy_PlayerFemale">><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/Other/Villa/Villa.jpg">>
<<ChatMessage 'Ty turns into Tyra - a chocolate hottie with huge tits, round ass, and smooth black pussy. Jake becomes Jenny - a cute blonde with a perky figure. Max transforms into Maxi - a busty brunette who looks like a porn star.'>>
<<ChatMessage 'Now there\'s six guys in the room, including you and Ethan, and three "girls" - Tyra, Jenny, and Maxi. The vibe heats up instantly.'>>
<<Chat $interactionNpc 'Alright, bitches, ready?'>>
<<ChatMessage 'Ethan growls, pulling down his pants. His cock is already rock hard.'>>
<div class="padding-top">
<div class="btn"><<button "Join the orgy" "Ethan_Quest_02_Orgy_PlayerMale">><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/Other/Villa/Villa.jpg">>
<<ChatMessage 'In a couple of minutes, all seven guys start changing. Bones crack, skin softens, cocks retract, and tits grow all around you.'>>
<<ChatMessage 'Ethan becomes Ethana - a slim brunette with a perky ass. Max transforms into Maxi - a busty beauty like a porn star. Ty turns into Tyra - a chocolate hottie with huge tits and round butt. Jake becomes Jenny - a cute blonde. The other three transform into: a redhead bitch with freckles, an Asian with small perky tits, and a tattooed goth with pierced nipples.'>>
<<ChatMessage 'Now there\'s you - the only guy with a rock-hard cock - and seven "girls," all naked and horny. The vibe is electric.'>>
<<set _ethanaIcon = "">>
<<ChatWithoutNPC "Ethana" _ethanaIcon 'Alright, king, ready to fuck your harem?'>>
<<ChatMessage 'Ethana giggles, getting on her knees and taking your cock in her mouth.'>>
<div class="padding-top">
<div class="btn"><<button "Fuck your harem" "Ethan_Quest_02_Orgy_Harem">><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/Other/Villa/Villa.jpg">>
<<set _maxIcon = "">>
<<set $ethanOrgyOther = "Tyra">>
<<ChatWithoutNPC "Max" _maxIcon 'We need two more "girls" for balance, to make three with Player. Who\'s in?'>>
<<Chat $interactionNpc 'Don\'t pussy out, dudes! Draw straws, to make it fair. Short one - swallow the pill and become a bitch for the night.'>>
<<ChatMessage 'They hand out straws among the eight guys - six long, two short. You just sit and watch, sipping beer - you don\'t need to transform.'>>
<<ChatMessage 'The short straws go to the big Black guy Ty and skinny Jake. Ty curses under his breath.'>>
<<set _tyIcon = "">>
<<ChatWithoutNPC "Ty" _tyIcon 'Fuck, why me? But rules are rules.'>>
<<ChatMessage 'The two of them swallow their pills. In a couple of minutes, their bodies start changing. Ty turns into Tyra - a chocolate hottie with huge tits and smooth black pussy. Jake becomes Jenny - a cute blonde with a perky figure.'>>
<<ChatMessage 'Now there\'s six guys in the room, including Ethan and Max, and three girls - you, Tyra, and Jenny. The vibe heats up.'>>
<<Chat $interactionNpc 'Alright, bitches, ready?'>>
<<ChatMessage 'Ethan growls, pulling down his pants. His cock is already rock hard.'>>
<div class="padding-top">
<div class="btn"><<button "Let the orgy begin" "Ethan_Quest_02_Orgy_PlayerFemale">><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/Other/Villa/Villa.jpg">>
<<set _maxIcon = "">>
<<set $ethanOrgyOther = "Tyra">>
<<ChatWithoutNPC "Max" _maxIcon 'Player, you\'re with a cock but look like a bitch - draw a straw with us, to make it fair.'>>
<<Chat $interactionNpc 'Don\'t pussy out, dudes! Draw straws. Short one - swallow the pill and become a full bitch for the night.'>>
<<ChatMessage 'They hand out straws - six long, three short. Your heart pounds as you reach for your straw...'>>
<<ChatMessage 'You draw... and fuck, SHORT! The crowd erupts.'>>
<<Chat $interactionNpc 'Ha, Player, you\'re fucked!'>>
<<ChatMessage 'Two more - big Black guy Ty and skinny Jake - also draw short. Ty curses, but swallows the pill right away. Jake blushes and follows suit.'>>
<<ChatMessage 'Ty and Jake transform: Ty into Tyra - a chocolate hottie with huge tits and smooth pussy. Jake into Jenny - a cute blonde with a perky ass.'>>
<<Chat $interactionNpc 'Listen, you\'re already half a girl. Your choice: swallow the pill and become a full chick without a cock, or stay trans - with your cock, but we\'ll still fuck you like a slut?'>>
<<ChatMessage 'You think for a second, your cock in your pants already stirring from excitement.'>>
<div class="padding-top">
<div class="btn"><<button "Stay trans with my cock" "Ethan_Quest_02_Shemale_StayTrans">><</button>></div>
</div>
<div class="padding-top">
<div class="btn"><<button "Take the pill, become full female" "Ethan_Quest_02_Male_Transform">><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/Other/Villa/Villa.jpg">>
<<Chat $player 'Fuck, leave me trans. I want you to fuck me with my cock dangling.'>>
<<ChatMessage 'The guys cheer. Now there\'s six guys in the room and three "girls": Tyra and Jenny - full chicks from the pills, and you - trans with tits and a cock. The vibe heats up.'>>
<<Chat $interactionNpc 'Alright, bitches, ready?'>>
<<ChatMessage 'Ethan growls, pulling down his pants. His cock is already rock hard.'>>
<div class="padding-top">
<div class="btn"><<button "Let the orgy begin" "Ethan_Quest_02_Orgy_PlayerTrans">><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/Other/Villa/bedroom.jpg">>
<<ChatMessage 'The orgy starts with no foreplay. The six guys surround you three on the huge couch.'>>
/* The other girl is Maxi when the player took the pill on the male draw, Tyra on the
female and shemale routes. Clips: female_0 is her with two white guys, one in her
mouth and one behind; female_1 is a blonde taking three guys at once. */
<<set _ethOther = $ethanOrgyOther || "Maxi">>
<<ChatMessage 'They jump on you right away: one of the guys shoves his thick cock in your mouth, while Ethan from behind tears into your pussy, slamming balls-deep.'>>
<<if CheckContentFilter('Male')>><<Video "Media\\Characters\\QuestChars\\Ethan\\Orgy\\female_0.mp4">><</if>>
<<Chat $interactionNpc 'Fuck, what a tight one you are!'>>
<<ChatMessage 'He moans, slapping your ass.'>>
<<ChatMessage `_ethOther + ', her big tits bouncing, rides another guy\'s cock on the far end of the couch.'`>>
<<ChatMessage 'The room fills with moans, slurping, and cursing: "Suck deeper, slut!", "Spread your legs wider!", "Flood me with cum, assholes!"'>>
<<ChatMessage 'Next to you, Jenny squeals as three guys take her at once - one in her pussy, one in her ass, one fucking her mouth.'>>
<<if CheckContentFilter('Male')>><<Video "Media\\Characters\\QuestChars\\Ethan\\Orgy\\female_1.mp4">><</if>>
<<ChatMessage 'You three swap partners like in porn: they fuck you missionary, doggy, cowgirl. Someone cums inside, semen dripping down your thighs. You cum five times, your whole body shaking.'>>
<<run $player.status.horny.value = $player.status.horny.min>>
<<SpendTime 240>>
<<run gainSexExp($player, "vaginalSkill", Random(5,8))>>
<<run gainSexExp($player, "oralSkill", Random(3,5))>>
<<run gainSexExp($player, "analSkill", Random(3,5))>>
<<run gainSexExp($player, "sexualKnowledge", Random(4,6))>>
<<run gainSexExp($player, "compliance", Random(3,5))>>
<<run gainSexExp($player, "disinhibition", Random(4,6))>>
<div class="padding-top">
<div class="btn"><<button "After the orgy..." "Ethan_Quest_02_Aftermath_Female">><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/Other/Villa/bedroom.jpg">>
<<ChatMessage 'The orgy starts with no foreplay. The six guys surround the three "girls" on the huge couch.'>>
<<ChatMessage 'You go straight for Tyra: this black slut gets on her knees, sucking your cock like a pro, her full lips wrapping balls-deep.'>>
/* Tyra is Black: her clips come from the Black-woman pools, not the mixed generic ones. */
<<if CheckContentFilter('Female')>><<Video `EventMedia.pickClip(EventMedia.BLACK_WOMAN_ORAL_CLIPS)`>><</if>>
<<Chat $player 'Fuck, Tyra, you\'re such a hot bitch now!'>>
<<ChatMessage 'You moan, grabbing her hair and thrusting deeper down her throat.'>>
<<ChatMessage 'Jenny squeals as Ethan and another guy double-penetrate her - one in the pussy, the other in the ass. Maxi rides a third guy\'s cock while a fourth cums on her tits.'>>
<<ChatMessage 'You switch: now doggy-fucking Tyra in her wet black pussy, slapping her ass that jiggles with every thrust.'>>
<<if CheckContentFilter('Female')>><<Video `EventMedia.pickClip(EventMedia.BLACK_WOMAN_DOGGY_CLIPS)`>><</if>>
<<Chat $player 'Spread wider, slut!'>>
<<ChatMessage 'You yell, slamming balls-deep, while she moans: "Fuck me harder, asshole!"'>>
<<ChatMessage 'The room fills with moans, slurping, and cursing. You swap partners like in porn: Tyra in missionary, Jenny takes it in the mouth and ass at once, Maxi cums from a threesome. You cum a couple times - once in Tyra\'s pussy, once on Jenny\'s face.'>>
<<run $player.status.horny.value = $player.status.horny.min>>
<<run $player.status.potency.decrease(2)>>
<<SpendTime 240>>
<<run gainSexExp($player, "vaginalSkill", Random(4,7))>>
<<run gainSexExp($player, "oralSkill", Random(3,5))>>
<<run gainSexExp($player, "penetrativeSkill", Random(4,7))>>
<<run gainSexExp($player, "sexualKnowledge", Random(4,6))>>
<<run gainSexExp($player, "assertiveness", Random(3,5))>>
<<run gainSexExp($player, "disinhibition", Random(4,6))>>
<div class="padding-top">
<div class="btn"><<button "After the orgy..." "Ethan_Quest_02_Aftermath_Male">><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/Other/Villa/bedroom.jpg">>
<<ChatMessage 'The orgy starts with no foreplay. The six guys surround you three on the huge couch.'>>
<<set _maxIcon = "">>
<<ChatMessage 'They jump on you right away: Max shoves his thick cock up your ass, while Ethan jerks your cock and sucks your tits.'>>
<<if CheckContentFilter('Male')>><<Video "Media\\Characters\\QuestChars\\Ethan\\Orgy\\trans_0.mp4">><</if>>
<<Chat $interactionNpc 'Fuck, Player, you\'re such a trans slut! Your cock\'s hard while we fuck you!'>>
<<ChatMessage 'He moans, slapping your balls.'>>
<<ChatMessage 'Tyra squeals as two guys double-penetrate her - one in the pussy, the other in the ass. Jenny rides a third guy\'s cock while a fourth cums on her face.'>>
<<ChatMessage 'You switch positions: now one guy fucks your ass, another makes you suck. "Spread wider, trans bitch!" - someone yells, slamming balls-deep in your ass while your cock dangles and drips.'>>
<<ChatMessage 'The room fills with moans, slurping, and cursing: "Suck deeper, slut!", "Jerk your cock while we fuck you!", "Flood this trans hole with cum!"'>>
<<ChatMessage 'You three swap partners like in porn: they fuck your ass, mouth, jerk your cock to orgasm. Someone cums in your ass, semen dripping down your legs, and you cum on the floor from the fucking. The orgy lasts hours.'>>
<<run $player.status.horny.value = $player.status.horny.min>>
<<run $player.status.potency.decrease(3)>>
<<SpendTime 240>>
<<run gainSexExp($player, "analSkill", Random(5,8))>>
<<run gainSexExp($player, "oralSkill", Random(4,6))>>
<<run gainSexExp($player, "sexualKnowledge", Random(4,6))>>
<<run gainSexExp($player, "compliance", Random(4,6))>>
<<run gainSexExp($player, "disinhibition", Random(5,7))>>
<div class="padding-top">
<div class="btn"><<button "After the orgy..." "Ethan_Quest_02_Aftermath_Trans">><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/Other/Villa/bedroom.jpg">>
/* Each clip is one of the girls alone with you, picked to look like the girl the line
before it names: blonde Jenny, slim brunette Ethana. */
<<ChatMessage 'Seven bitches surround you on the huge couch. Tyra sits on your face with her black pussy, grinding it against your tongue.'>>
<<ChatMessage 'Jenny gets between your legs and sucks your cock, licking your balls between strokes.'>>
<<if CheckContentFilter('Female')>><<Video `EventMedia.pickClip(EventMedia.BLONDE_WOMAN_ORAL_CLIPS)`>><</if>>
<<set _maxiIcon = "">>
<<ChatWithoutNPC "Maxi" _maxiIcon 'Fuck, Player, your cock\'s huge! Wreck us all!'>>
<<ChatMessage 'Maxi moans, mounting you cowgirl, her tits bouncing.'>>
<<ChatMessage 'You fuck them in rotation, starting with Ethana: you put her on all fours and slam into her pussy from behind, slapping her ass while she squeals.'>>
<<if CheckContentFilter('Female')>><<Video `EventMedia.pickClip(EventMedia.BRUNETTE_WOMAN_DOGGY_CLIPS)`>><</if>>
<<ChatMessage 'Then a double blowjob from the redhead and the Asian, their tongues tangling on your shaft.'>>
<<ChatMessage 'Tyra rides your cock like a wild one, her chocolate ass clapping against your balls. You take Jenny in the ass - tight, virgin in her new body. The goth with piercings begs: "Cum in me, daddy!"'>>
<<ChatMessage 'You switch poses like in porn: one on your cock, another on your face, a third tit-fucking you. The room fills with moans: "Fuck deeper, asshole!", "My pussy\'s yours!", "Flood the whole harem with cum!"'>>
<<ChatMessage 'You cum over and over - inside, on faces, on tits - and they lick each other, tasting the semen. The orgy lasts hours: you one against seven, but the pills make them insatiable sluts.'>>
<<run $player.status.horny.value = $player.status.horny.min>>
<<run $player.status.potency.value = $player.status.potency.min>>
<<SpendTime 300>>
<<run gainSexExp($player, "vaginalSkill", Random(6,8))>>
<<run gainSexExp($player, "oralSkill", Random(5,7))>>
<<run gainSexExp($player, "analSkill", Random(4,6))>>
<<run gainSexExp($player, "penetrativeSkill", Random(5,8))>>
<<run gainSexExp($player, "sexualKnowledge", Random(5,8))>>
<<run gainSexExp($player, "assertiveness", Random(5,7))>>
<<run gainSexExp($player, "disinhibition", Random(6,8))>>
<div class="padding-top">
<div class="btn"><<button "After the orgy..." "Ethan_Quest_02_Aftermath_Harem">><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/Other/Villa/Villa.jpg">>
<<ChatMessage 'Finally, everyone\'s exhausted. The orgy winds down around three in the morning. You, still in female form, wander the house - legs wobbling, pussy sore from the fucking.'>>
<<ChatMessage 'In the kitchen, you run into Ethan smoking by the window.'>>
<<Chat $interactionNpc 'How\'s it going, bro? Like being a bitch?'>>
<<ChatMessage 'He smirks.'>>
<<Chat $player 'Fuck, that was wild. But awesome.'>>
<<ChatMessage 'In the bedroom, Jenny lies naked, with smeared cum on her tits, chatting with one of the guys: "Tomorrow back to normal, but this night was fire." Maxi in the bathroom washing up, complains: "My ass is on fire, but worth repeating."'>>
<<ChatMessage 'The other guys are scattered: some sleeping, some playing video games, discussing "who fucked who best."'>>
<<ChatMessage 'In the morning, exactly at 10:00, the pills wear off. All transformed ones revert to their bodies. The company laughs, slaps shoulders.'>>
<<run restoreTemporaryGenderChange($player, "ethan_quest_02")>>
<<Chat $interactionNpc 'Till next Saturday, dudes!'>>
<<ChatMessage 'Everyone heads home. And you know - this quest can be repeated every Saturday. Maybe next time you\'ll draw a long straw... or voluntarily take the pill again?'>>
<<if getTaskState("ethan_quest_02", "Finish the sleepover party") == "not found">>
<<run addTaskToQuest("ethan_quest_02", { description: "Finish the sleepover party", completed: false })>>
<</if>>
<<run completeTaskByQuestID("ethan_quest_02", "Finish the sleepover party")>>
<<set _relUpgrd = {friendship: 15, love: 5}>>
<<SetRelations $player $interactionNpc _relUpgrd>>
<<run $interactionNpc.characterEvents.registerEvent($interactionNpc.info.id, "Sleepover Completed", 1)>>
<div class="padding-top">
<div class="btn"><<button "Leave" "Campus">><<LeaveInteractionSettings>><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/Other/Villa/Villa.jpg">>
<<ChatMessage 'Finally, everyone\'s exhausted. The orgy winds down around three in the morning. You, with your cock still half-hard, wander the house.'>>
<<ChatMessage 'In the kitchen, you run into Ethan smoking by the window.'>>
<<Chat $interactionNpc 'How\'s it going, bro? Like fucking Tyra?'>>
<<ChatMessage 'He smirks.'>>
<<Chat $player 'Fuck, that was wild. Her ass is fire.'>>
<<ChatMessage 'In the bedroom, Jenny lies naked, with smeared cum on her body, chatting with one of the guys: "Tomorrow back to guys, but this night was fucking awesome." Maxi in the bathroom washing up, complains: "My pussy hurts, but worth repeating." Tyra on the couch, covered in cum, smoking and laughing: "Fuck, guys, you wrecked me, but no regrets."'>>
<<ChatMessage 'The other guys are scattered: some sleeping, some playing video games, discussing "who fucked who best."'>>
<<ChatMessage 'In the morning, exactly at 10:00, the pills wear off. Bodies revert: tits disappear, cocks back in place. Ty, Jake, and Max are guys again. The company laughs, slaps shoulders.'>>
<<run restoreTemporaryGenderChange($player, "ethan_quest_02")>>
<<Chat $interactionNpc 'Till next Saturday, dudes!'>>
<<ChatMessage 'Everyone heads home, with a secret in their pocket. And you know - this quest can be repeated every Saturday. Maybe next time you\'ll draw short... or voluntarily take the pill?'>>
<<if getTaskState("ethan_quest_02", "Finish the sleepover party") == "not found">>
<<run addTaskToQuest("ethan_quest_02", { description: "Finish the sleepover party", completed: false })>>
<</if>>
<<run completeTaskByQuestID("ethan_quest_02", "Finish the sleepover party")>>
<<set _relUpgrd = {friendship: 15}>>
<<SetRelations $player $interactionNpc _relUpgrd>>
<<run $interactionNpc.characterEvents.registerEvent($interactionNpc.info.id, "Sleepover Completed", 1)>>
<div class="padding-top">
<div class="btn"><<button "Leave" "Campus">><<LeaveInteractionSettings>><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/Other/Villa/Villa.jpg">>
<<ChatMessage 'Finally, everyone\'s exhausted. The orgy winds down around three in the morning. You, with your ass on fire and cock limp from orgasms, wander the house - legs wobbling.'>>
<<ChatMessage 'In the kitchen, you run into Ethan smoking by the window.'>>
<<Chat $interactionNpc 'How\'s it going, trans? Like being our slut with a cock?'>>
<<ChatMessage 'He smirks.'>>
<<Chat $player 'Fuck, that was wild. You wrecked me, but my cock came three times.'>>
<<ChatMessage 'In the bedroom, Jenny lies naked, with smeared cum on her tits, chatting with one of the guys: "Tomorrow back to normal, but this night was fire." Tyra in the bathroom washing up, complains: "My new pussy hurts, but worth repeating."'>>
<<ChatMessage 'The other guys are scattered: some sleeping, some playing video games, discussing "who fucked the trans best."'>>
<<ChatMessage 'In the morning, exactly at 10:00, the pills wear off. Tyra and Jenny revert to Ty and Jake - tits disappear, cocks back in place. You stay yourself - ladyboy with a cock. The company laughs, slaps shoulders.'>>
<<run restoreTemporaryGenderChange($player, "ethan_quest_02")>>
<<Chat $interactionNpc 'Till next Saturday, dudes... and bitches!'>>
<<ChatMessage 'Everyone heads home, with a secret in their pocket. And you know - this quest can be repeated every Saturday. Maybe next time you\'ll draw long... or choose to get fucked as trans again?'>>
<<if getTaskState("ethan_quest_02", "Finish the sleepover party") == "not found">>
<<run addTaskToQuest("ethan_quest_02", { description: "Finish the sleepover party", completed: false })>>
<</if>>
<<run completeTaskByQuestID("ethan_quest_02", "Finish the sleepover party")>>
<<set _relUpgrd = {friendship: 15, love: 5}>>
<<SetRelations $player $interactionNpc _relUpgrd>>
<<run $interactionNpc.characterEvents.registerEvent($interactionNpc.info.id, "Sleepover Completed", 1)>>
<div class="padding-top">
<div class="btn"><<button "Leave" "Campus">><<LeaveInteractionSettings>><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/Other/Villa/Villa.jpg">>
<<ChatMessage 'Finally, everyone\'s exhausted. The orgy winds down around three in the morning. You, with your cock limp from endless orgasms, wander the house - legs wobbling.'>>
<<ChatMessage 'In the kitchen, you run into Ethana smoking by the window, still with cum on her lips.'>>
<<set _ethanaIcon = "">>
<<ChatWithoutNPC "Ethana" _ethanaIcon 'How\'s it going, bro? Like being the only stud?'>>
<<ChatMessage 'She smirks.'>>
<<Chat $player 'Fuck, that was epic. You all are such hot bitches.'>>
<<ChatMessage 'In the bedroom, Jenny lies naked, with smeared cum on her body, chatting with Tyra: "Tomorrow back to guys, but this night was fire, I came five times." Maxi in the bathroom washing up, complains: "My pussy\'s on fire from your cock, but worth repeating."'>>
<<ChatMessage 'The redhead and Asian on the couch making out, discussing: "Player\'s a fuck god." The goth sleeps, covered in your cum. The others scattered: some dozing, some eating pizza, giggling over memories.'>>
<<ChatMessage 'In the morning, exactly at 10:00, the pills wear off. All seven revert to guys: tits disappear, cocks back in place. The company laughs, slaps shoulders.'>>
<<run restoreTemporaryGenderChange($player, "ethan_quest_02")>>
<<Chat $interactionNpc 'Till next Saturday, king! Maybe next time switch roles?'>>
<<ChatMessage 'Everyone heads home, with a secret in their pocket. And you know - this quest can be repeated every Saturday. Maybe next time you\'ll take the pill... or be the only one fucking everyone again?'>>
<<if getTaskState("ethan_quest_02", "Finish the sleepover party") == "not found">>
<<run addTaskToQuest("ethan_quest_02", { description: "Finish the sleepover party", completed: false })>>
<</if>>
<<run completeTaskByQuestID("ethan_quest_02", "Finish the sleepover party")>>
<<set _relUpgrd = {friendship: 20}>>
<<SetRelations $player $interactionNpc _relUpgrd>>
<<run $interactionNpc.characterEvents.registerEvent($interactionNpc.info.id, "Sleepover Completed", 1)>>
<div class="padding-top">
<div class="btn"><<button "Leave" "Campus">><<LeaveInteractionSettings>><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ChatMessage 'Ethan\'s eyes light up when he sees you.'>>
<<Chat $interactionNpc 'Hey! The guys are throwing another sleepover this weekend. Same place, same deal with the pills. You in?'>>
<<if $player.gender() == "Male">>
<<Chat $player 'Hell yeah, count me in!'>>
<<elseif $player.gender() == "Female">>
<<Chat $player 'Another round with all those guys? I\'m there.'>>
<<else>>
<<Chat $player 'Sure, why not? I had a blast last time.'>>
<</if>>
<<Chat $interactionNpc 'Awesome! Let\'s go!'>>
<<run $interactionNpc.dailyEvents.registerEvent($interactionNpc.info.id, "Sleepover Today", 1)>>
<div class="padding-top">
<div class="btn"><<button "Go to the party" "Ethan_Quest_02_Arrival_Repeat">><<SpendTime 60>><</button>></div>
</div>
<div class="padding-top">
<div class="btn"><<button "Maybe next time" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/Other/Villa/Villa.jpg">>
<<ChatMessage 'You hop into Ethan\'s car and race to the familiar villa. The guys are already gathered, and Max is waving the pack of blue pills with a grin.'>>
<<set _maxIcon = "">>
<<ChatWithoutNPC "Max" _maxIcon 'The returning champion! Ready for another round?'>>
<<if $player.gender() == "Male">>
<<goto "Ethan_Quest_02_Male_Draw">>
<<elseif $player.gender() == "Female">>
<<goto "Ethan_Quest_02_Female_Path">>
<<else>>
<<goto "Ethan_Quest_02_Shemale_Draw">>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _lanaIcon = "Media\\Characters\\QuestChars\\Other\\Lana.jpg">>
<<DrawImg _lanaIcon>>
<<LockSettings>>
<<if $lanaFromPurchase>>
<<ChatMessage "You’re purchasing the most expensive car in the dealership - a sleek, luxurious supercar that costs a fortune. Behind the counter is Lana Monroe, an attractive middle-aged woman with a curvy figure, dressed in a form-fitting business suit that accentuates her curves. As she processes the paperwork, she leans in closer, her sweet perfume enveloping you. Once the deal is finalized, she flashes a playful smile.">>
<<ChatWithoutNPC 'Lana' _lanaIcon 'Wow, you sure know how to pick the good stuff. Someone like you deserves only the best. Care to celebrate the purchase? I\'m off in an hour.'>>
<<else>>
<<ChatMessage "Lana Monroe looks up from the paperwork on her desk and knows you at once: the one who drove the supercar off her lot. She smooths her skirt and comes around the counter, close enough for you to catch her perfume.">>
<<ChatWithoutNPC 'Lana' _lanaIcon 'Well, look who came back. That drink I offered you still stands, you know. I\'m off in an hour.'>>
<</if>>
<<unset $lanaFromPurchase>>
<div class="btn padding-top"><<button "Sure, that sounds tempting." "LanaQuest1_Accept">><<run $player.characterEvents.registerEvent($player.info.id, "LanaQuest1", 1)>><</button>></div>
<div class="btn padding-top"><<button "I am busy today." $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _lanaIcon = "Media\\Characters\\QuestChars\\Other\\Lana.jpg">>
<<DrawImg _lanaIcon>>
<<Chat $player 'Sure, that sounds tempting.'>>
<<ChatWithoutNPC 'Lana' _lanaIcon '*giggles, cheeks slightly flushing* Then let\'s meet at the exit. I\'m Lana, by the way.'>>
<<ChatWithoutNPC 'Lana' _lanaIcon 'Great idea! I love Italian food. Shall we take your new ride?'>>
<div class="btn padding-top"><<button "Go to the restaurant" "LanaQuest1_Restaurant">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/Downtown/Restaurant.jpg">>
<<set _lanaIcon = "Media\\Characters\\QuestChars\\Other\\Lana.jpg">>
<<DrawImg _lanaIcon>>
<<ChatMessage "At the restaurant, Lana orders wine and pasta, chatting about her job and life. She mentions she’s divorced and complains about the monotony of her routine. The atmosphere heats up: she brushes your hand, her foot grazing yours under the table.">>
<<ChatWithoutNPC 'Lana' _lanaIcon 'You seem so interesting. Tell me about yourself.'>>
<<ChatMessage "The bill comes to $500.">>
<<ChatWithoutNPC 'Lana' _lanaIcon 'You\'re a total charmer. Want to continue the evening at my place? My house is empty.'>>
<<if Number($player.money) >= 500>>
<div class="btn padding-top"><<button "Pay $500" "LanaQuest1_House">><<set $player.money = Number($player.money) - 500>><<SpendTime 90>><</button>></div>
<div class="btn padding-top"><<button "Don't pay" "LanaQuest1_NoPay">><<LeaveInteractionSettings>><</button>></div>
<<else>>
/* Short of cash is not the same as refusing to pay: the date is postponed, not lost. */
<div class="btn padding-top"><<button "Admit you are short tonight" "LanaQuest1_RainCheck">><<SpendTime 60>><</button>></div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<run $player.characterEvents.registerEvent($player.info.id, "LanaQuest1Failed", 1)>>
<<SetBackground "Media/Locations/Downtown/Restaurant.jpg">>
<<ChatMessage "You decide not to pay. Lana frowns slightly but remains polite. She politely says goodbye and leaves.">>
<div class="btn padding-top"><<button "Leave" $player.info.currentLocation>><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/Other/Lana/lana_bedroom.jpg">>
<<set _lanaIcon = "Media\\Characters\\QuestChars\\Other\\Lana.jpg">>
<<DrawImg _lanaIcon>>
<<ChatMessage "You arrive at her home. Lana dims the lights, pours wine, and leads you to the bedroom. Her large breasts spill out of her bra, nipples already hard with arousal.">>
<<ChatWithoutNPC 'Lana' _lanaIcon 'It\'s been so long since I felt desired.'>>
<<switch $player.gender()>>
<<case "Male">>
<<include "LanaQuest1_Sex_Male">>
<<case "Shemale">>
<<include "LanaQuest1_Sex_Male">>
<<case "Female">>
<<include "LanaQuest1_Sex_Female">>
<</switch>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/Other/Lana/lana_bedroom.jpg">>
<<ChatMessage "Lana pushes you onto the bed and kneels.">>
<<ChatWithoutNPC 'Lana' _lanaIcon 'Let me thank you for tonight.'>>
<<ChatMessage "She unzips your pants and takes your cock in her mouth. Her lips wrap tightly around you, her tongue swirling over the tip as she sucks deeply, gagging slightly, saliva dripping down her chin.">>
<<if CheckContentFilter('Female')>><<Video "Media\\Sex\\Quest\\Lana\\Male\\blowjob.mp4">><</if>>
<<ChatWithoutNPC 'Lana' _lanaIcon 'Mmm, you taste so good… fuck my mouth.'>>
<<ChatMessage "She picks up the pace until you finish in her throat. She swallows everything, licking her lips.">>
<<ChatMessage "Then she lies back, spreading her legs to reveal her wet pussy.">>
<<ChatWithoutNPC 'Lana' _lanaIcon 'Enter me… I want to feel you inside.'>>
<<ChatMessage "You slide into her in missionary, her legs wrapping around your waist as she scratches your back.">>
<<if CheckContentFilter('Female')>><<Video "Media\\Sex\\Quest\\Lana\\Male\\vaginal.mp4">><</if>>
<<ChatWithoutNPC 'Lana' _lanaIcon 'Yes, deeper! Fuck me! God, your cock is so big!'>>
<<ChatMessage "Her breasts bounce with each thrust, her pussy clenching as she orgasms, screaming, and you release inside her, cum dripping down her thighs.">>
<<include "LanaQuest1_AfterSex">>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/Downtown/Restaurant.jpg">>
<<set _lanaIcon = "Media\\Characters\\QuestChars\\Other\\Lana.jpg">>
<<DrawImg _lanaIcon>>
<<run $player.characterEvents.unregisterEvent($player.info.id, "LanaQuest1")>>
<<ChatMessage "You check your wallet under the table and come up short. Lana sees it on your face before you say a word, laughs, and puts her own card on the bill.">>
<<ChatWithoutNPC 'Lana' _lanaIcon 'Next time dinner is on you. You know where to find me.'>>
<div class="btn padding-top"><<button "Leave" "CarDealership">><<LeaveInteractionSettings>><</button>></div>
<</nobr>><<nobr>>
<<ChatMessage "Lana pulls you onto the bed and settles between your legs.">>
<<ChatWithoutNPC 'Lana' _lanaIcon 'I want to taste you first.'>>
<<if CheckContentFilter('Female')>><<Video "Media\\Sex\\Quest\\Lana\\Female\\Lick.mp4">><</if>>
<<ChatMessage "Her tongue teases your clit, sucking gently while her fingers slide inside, making you tremble with pleasure.">>
<<ChatWithoutNPC 'Lana' _lanaIcon 'You\'re so wet.'>>
<<ChatMessage "She speeds up until you climax, gripping her hair.">>
<<ChatMessage "Then Lana straps you with a dildo, lubes it up, and gets into doggy style.">>
<<ChatWithoutNPC 'Lana' _lanaIcon 'Fuck me like a slut!'>>
<<if CheckContentFilter('Female')>><<Video "Media\\Sex\\Quest\\Lana\\Female\\strap.mp4">><</if>>
<<ChatMessage "You thrust into her, the strap-on stretching her as she rubs her clit, her juices soaking the sheets.">>
<<ChatWithoutNPC 'Lana' _lanaIcon 'Yes, like that, fuck me! I\'m coming!'>>
<<ChatMessage "Her body shakes in orgasm.">>
<<include "LanaQuest1_AfterSex">>
<</nobr>><<nobr>>
<<ChatMessage "After sex, you fall asleep in each other’s arms, her sweaty, satisfied body pressed against yours.">>
<div class="btn padding-top"><<button "Continue" "LanaQuest1_Morning">>
/* The night at her place: wake up the next morning, rested. */
<<RestorePlayerFromSleep>>
<<if $dateTime.hours gte 7>>
<<SpendDay>>
<<else>>
<<set _lanaWake = {minutes: 0, hours: 7}>>
<<SetTime _lanaWake>>
<</if>>
<<run typeof gangSleepTickNow === 'function' && gangSleepTickNow()>>
<</button>></div>
<</nobr>><<nobr>>
<<run $player.characterEvents.registerEvent($player.info.id, "LanaQuest1Completed", 1)>>
<<SetBackground "Media/Locations/Other/Lana/lana_bedroom.jpg">>
<<set _lanaSonIcon = "Media\\Characters\\QuestChars\\Other\\LanaSon.jpg">>
<<set _lanaIcon = "Media\\Characters\\QuestChars\\Other\\Lana.jpg">>
<<ChatMessage "You wake to noises in the hallway. Lana bolts upright, eyes wide. She quickly covers you with a blanket, hiding you completely, and throws on a robe, slightly open to reveal traces of the night.">>
<<ChatWithoutNPC 'Lana' _lanaIcon 'Shit, it\'s my son! He wasn\'t supposed to be back this early!'>>
<<ChatMessage "The door opens, and her 18-year-old son, a tall guy with messy hair, walks in.">>
<<ChatWithoutNPC 'Lana\'s son' _lanaSonIcon 'Mom, I\'m home! The party sucked.'>>
<<ChatWithoutNPC 'Lana' _lanaIcon '*forces a nervous smile, voice shaky* Oh, hi, sweetie! You\'re early… Um, Mom was just… sleeping. How\'s everything?'>>
<<ChatMessage "Her son frowns, scanning the room: crumpled sheets, the lingering smell of sex.">>
<<ChatWithoutNPC 'Lana\'s son' _lanaSonIcon 'Mom, whose car is parked outside? And why does it smell… weird?'>>
<<ChatWithoutNPC 'Lana' _lanaIcon 'It\'s… a friend who stopped by, but they\'re gone now. Nothing to worry about! Go grab breakfast, I\'ll be down soon.'>>
<<ChatMessage "He gives a suspicious look but nods and leaves. The door closes.">>
<<ChatWithoutNPC 'Lana\'s son' _lanaSonIcon 'Okay, but this is weird…'>>
<<ChatMessage "Lana exhales, pulling back the blanket. She gives you a quick kiss, helps you dress, and escorts you out.">>
<<ChatWithoutNPC 'Lana' _lanaIcon 'Phew, that was close. He didn\'t see anything, but he\'s suspicious. I\'ll explain to him… somehow. Let\'s get you out quietly, through the back door.'>>
<<ChatWithoutNPC 'Lana' _lanaIcon 'That was unforgettable. Call me?'>>
<div class="btn padding-top"><<button "Continue" "Downtown">><<LeaveInteractionSettings>><<SpendTime 20>><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _madDogImg = "Media\\Characters\\QuestChars\\MadDog\\MadDog.jpg">>
<<ChatMessage 'Just as you lie down, your phone buzzes on the nightstand.'>>
<<DrawImg _madDogImg>>
<<ChatWithoutNPC 'Mad Dog' _madDogImg 'Listen up. You did good work with that debt. If you want to hit BioGenesis harder, talk to a detective named Rayna Voss. She hangs around the park by the dead fountain after six.'>>
<<ChatWithoutNPC 'Mad Dog' _madDogImg 'I told her you\'d reach out. Don\'t keep her waiting.'>>
<<run _questList = [
{
id: "rayna_voss_quest1",
title: "Detective",
description: "I’ve got a new lead on BioGenesis - a hard‑nosed private investigator who’s been digging into the corporation for years. I need to track her down and squeeze out every bit of information I can.",
state: "active",
questType: "side",
tasks: [
{ description: "Track down Detective Rayna Voss in the city park", completed: false }
],
}
]>>
<<CreateQuest _questList true>>
<div class="btn padding-top"><<button "Continue" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<LockSettings>>
<<include "GetCharactersMadDog_Quest1">>
<<ChatMessage 'You\'re sitting in the VIP lounge of a nightclub, across from Damian. As always, he looks like he just stepped out of an expensive boutique: stylish suit, piercing gaze, cigar in hand. You\'ve hung out with him before, so the atmosphere between you is more businesslike than tense.'>>
<<Chat $player 'Hey, Damian. Listen, I need to dig up more about Biogenesis. You\'re in the know about all the moves in this city, so tell me where to start digging.'>>
<<Chat _damian '*smiles, exhaling smoke* Biogenesis, huh? You don\'t discuss topics like that on every corner. But you\'re lucky, I know a guy who might help you out. Mad Dog, the gang leader in Skid Row. He sits in an abandoned warehouse like a king on a throne of rust. If you can make a deal with him, he might throw you something useful.'>>
<<Chat $player 'Sounds good. I\'ll go talk to this Mad Dog. Thanks, Damian.'>>
<<run _questList = [
{
id: "meet_mad_dog",
title: "New Connections",
description: "Meet up with Mad Dog at the warehouse in Skid Row",
state: "active",
questType: "side",
tasks: [
{ description: "Meet Mad Dog", completed: false }
],
}
]>>
<<CreateQuest _questList true>>
<div class="btn padding-top"><<button "Continue" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<LockSettings>>
<<include "GetCharactersMadDog_Quest1">>
<<include "SetQuest_MadDog_Quest_1">>
<<if _madDogDebtorReady>>
<<run completeTaskByQuestID("meet_mad_dog", "Meet Mad Dog")>>
<<ChatMessage 'At the entrance stands a huge bandit, covered in scars, with a face like his mom dropped him into a meat grinder.'>>
<<ChatWithoutNPC 'Gangster' _gangsterImg 'Hey, you! You\'re fucked if you don\'t fuck off right now!'>>
<<Chat $player 'Easy, bro. I\'m from Damian. I need Mad Dog.'>>
<<ChatWithoutNPC 'Gangster' _gangsterImg '*squints but steps back* From Damian, you say? Alright, go inside. But if you\'re lying, consider your ass done.'>>
<<ChatMessage 'You walk past him and enter the warehouse. In the center sits Mad Dog - a huge guy, covered in tattoos like a walking painting. His people around him stare at you like fresh meat.'>>
<<Chat $player 'Hey, Mad Dog. I\'m from Damian. I need info on Biogenesis.'>>
<<ChatWithoutNPC 'Mad Dog' _madDogImg '*smirks* From Damian, huh? Listen up, I don\'t abandon my own, and you\'re nobody to me. Want info? Become one of us. Only insiders get the perks.'>>
<<Chat $player 'How do I join the gang? I\'m ready to join.'>>
<<if $randomDebtor.gender() == "Male">>
<<ChatWithoutNPC 'Mad Dog' _madDogImg '*smiles, showing a gold tooth* Now we\'re talking! I need someone who can collect debts from deadbeats. There\'s this asshole, $randomDebtor.info.firstName $randomDebtor.info.secondName, who owes us big time. If you can get the debt from him, you\'re in. Fail, and my boys will fuck you up so bad you won\'t be able to sit. Deal?'>>
<<else>>
<<ChatWithoutNPC 'Mad Dog' _madDogImg '*smiles, showing a gold tooth* Now we\'re talking! I need someone who can collect debts from deadbeats. There\'s this asshole, $randomDebtor.info.firstName $randomDebtor.info.secondName, who owes us big time. If you can get the debt from her you\'re in. Fail, and my boys will fuck you up so bad you won\'t be able to sit. Deal?'>>
<</if>>
<<Chat $player 'Deal.'>>
<<ChatWithoutNPC 'Mad Dog' _madDogImg 'Five days, got it? You\'re fucked if you screw up.'>>
<<ChatMessage 'You nod and leave the warehouse, ready for the next step. Mad Dog is clearly not joking, but this is your chance to get closer to Biogenesis.'>>
<div class="btn padding-top"><<button "Continue" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
<</if>>
<</nobr>><<nobr>>
<<set _damian = $Characters.filter((character) => character.info.questInfo.questCharID == 4)[0]>>
<<set _madDogImg = "Media\\Characters\\QuestChars\\MadDog\\MadDog.jpg">>
<<set _gangsterImg = "Media\\Characters\\QuestChars\\MadDog\\Gangster.jpg">>
<</nobr>><<nobr>>
<<set _madDogDebtorReady = false>>
<<if $debtorID>>
<<set _prevDebtor = getCharacterByID($debtorID)>>
<<if _prevDebtor && (_prevDebtor.saveData instanceof Map)>>
<<run _prevDebtor.saveData.delete("madDogDebtor")>>
<<run _prevDebtor.saveData.delete("madDogDebtTaskName")>>
<</if>>
<</if>>
<<set _pool to $Characters.filter(ch => IsOrdinaryCitizen(ch) && ch.info.questInfo.isQuestCharacter != true)>>
<<if _pool.length == 0>>
<<ChatMessage "There's no one to collect the debt from right now.">>
<div class="btn padding-top"><<button "Back" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
<<else>>
<<set _index to random(0, _pool.length - 1)>>
<<set $randomDebtor to _pool[_index]>>
<<set _taskText = "Get the debt from " + $randomDebtor.info.firstName + " " + $randomDebtor.info.secondName + ".">>
<<set _debtorPronoun = $randomDebtor.gender() == "Male" ? "him" : "her">>
<<run _questList = [
{
id: "mad_dog_quest1",
title: "Gang Initiation",
description: "I need to track down the debtor and make " + _debtorPronoun + " pay up",
state: "active",
questType: "side",
tasks: [
{ description: _taskText, completed: false },
{ description: "Return to Mad Dog", completed: false }
],
}
]>>
<<set $debtTaskName = _taskText>>
<<set $debtorID = $randomDebtor.info.id>>
<<set $daysToCompleteDebt = 5>>
<<set $madDogDebtDueDay = getCurrentAbsoluteDay() + $daysToCompleteDebt>>
<<set $madDogDebtLastCalendarDay = getCurrentAbsoluteDay()>>
/* A debt the debtor can actually pay - sized from their real cash (plan D-AIC24). */
<<set $debtAmount = setup.npcMoney.debtFromWealth($randomDebtor, Random(500, 5000))>>
<<if getQuestState("mad_dog_quest1") == undefined>>
<<CreateQuest _questList true>>
<<else>>
<<run replaceQuestTasks("mad_dog_quest1", _questList[0].tasks)>>
<<run activateQuest("mad_dog_quest1")>>
<<CreateQuestNotification _questList>>
<</if>>
<<run $player.characterEvents.registerEvent($randomDebtor.info.id, "knows you", 1)>>
<<run $randomDebtor.saveData.set("madDogDebtor", true)>>
<<run $randomDebtor.saveData.set("madDogDebtTaskName", _taskText)>>
<<set _madDogDebtorReady = true>>
<</if>>
<</nobr>><<widget "ResolveMadDogDebtTaskName">>
<<set _madDogDebtTaskName = $debtTaskName>>
<<set _madDogDebtTaskState = getTaskState("mad_dog_quest1", _madDogDebtTaskName)>>
<<if _madDogDebtTaskState == "not found">>
<<run _madDogQuest = getQuestById("mad_dog_quest1")>>
<<if _madDogQuest && _madDogQuest.tasks>>
<<run _openDebtTask = _madDogQuest.tasks.find(task => task.description != "Return to Mad Dog" && task.completed == false)>>
<<if !_openDebtTask>>
<<run _openDebtTask = _madDogQuest.tasks.find(task => task.description != "Return to Mad Dog")>>
<</if>>
<<if _openDebtTask>>
<<set _madDogDebtTaskName = _openDebtTask.description>>
<<set $debtTaskName = _madDogDebtTaskName>>
<<set _madDogDebtTaskState = getTaskState("mad_dog_quest1", _madDogDebtTaskName)>>
<</if>>
<</if>>
<</if>>
<</widget>><<nobr>>
<<include "UpdateAll">>
<<include "GetCharactersMadDog_Quest1">>
<<include "SetQuest_MadDog_Quest_1">>
<<if _madDogDebtorReady>>
<<set $madDogDebtFailed = false>>
<<ChatWithoutNPC 'Mad Dog' _madDogImg 'You blew the last job. This is your final chance: collect the new debt and bring it back within five days.'>>
<<ChatMessage 'Mad Dog gives you a new debtor and restarts the initiation contract.'>>
<div class="btn padding-top"><<button "Continue" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _MarySimmons = "Media\\Characters\\QuestChars\\Main\\College\\MarySimmons.jpg">>
<<set _BernardFoster = "Media\\Characters\\QuestChars\\Main\\College\\BernardFoster.jpg">>
<<ChatMessage 'You walk into the spacious college auditorium, your heart pounding with a mix of excitement and anxiety. Large windows let in the bright morning light, illuminating rows of desks where students are already seated. Some are chatting, others are scrolling through their phones, and a few are nervously fidgeting with their pens. You make your way to an empty seat in the middle of the room, drop your backpack on the floor, and sit down, looking around. The hum of voices fills the space, but it abruptly stops as the door swings open with a bang.'>>
<<ChatMessage 'A young woman, about thirty years old, strides confidently to the lectern, places her bag on the table, and surveys the auditorium with a warm but slightly appraising gaze.'>>
<<DrawImg _MarySimmons>>
<<ChatWithoutNPC 'Mary Simmons' _MarySimmons 'Welcome, students *her voice friendly but with a hint of authority* My name is Mary Simmons. Congratulations on your admission to our college. I teach biology and chemistry - the most important subjects in our institution. And yes, you can forget about slacking off-these sciences aren’t for the faint-hearted.'>>
<<ChatMessage 'She smiles slightly, and a couple of students chuckle nervously. You pull out your notebook, feeling the tension in the air ease a bit.'>>
<<ChatWithoutNPC 'Mary Simmons' _MarySimmons 'This year, we won’t just be memorizing the basics. You’re in for some real brain-benders-biotechnology, genetic engineering, all that futuristic stuff that’s shaping the world. Our college partners with BioGenesis, and if you’re not a total slacker, you’ll have a shot at interning there. But I’ll warn you: the competition here is like a cage of starving dogs.'>>
<<ChatMessage 'Just as she finishes, the door slams again. All heads turn. A tall, athletic man in his fifties, with graying temples and a face that looks like it was chiseled from stone, enters. He’s wearing an expensive dark suit with a college badge gleaming on his lapel. Beside him is a stern-faced middle-aged woman clutching a thick folder of documents as if it were her weapon. The man stops at the lectern, turns to the students, and silently stares everyone down. The silence becomes so thick you can almost hear someone sweating.'>>
<<DrawImg _BernardFoster>>
<<ChatWithoutNPC 'Bernard Foster' _BernardFoster 'I am the president of this college *his voice deep, with a slight British accent that sends chills down your spine* My name is Bernard Foster. I decided to welcome you personally because you are fresh blood, and I want to see who will survive here.'>>
<<ChatMessage 'He pauses, and you feel his words sink into your mind like lead.'>>
<<ChatWithoutNPC 'Bernard Foster' _BernardFoster 'Some of you will graduate from our college and get a ticket to BioGenesis. But most *he scans the auditorium* will be kicked out to hell. We only need the best of the best. You will be tearing each other apart for grades because those who screw up will be sent home. This isn’t kindergarten; it’s a meat grinder. Thank you for your attention.'>>
<<ChatMessage 'He nods to Mary, turns, and leaves, with the woman and her folder silently following like a shadow. The door closes, and the auditorium erupts in whispers.'>>
<<ChatMessage '“Is he serious? They’ll expel us?” hisses a girl to your left, tugging at her braids.'>>
<<ChatMessage '“I heard they kicked out half the class last year,” replies a guy behind you, panic in his voice.'>>
<<ChatMessage '“Damn, I didn’t sign up for this,” mutters someone else, almost in tears.'>>
<<ChatWithoutNPC 'Mary Simmons' _MarySimmons 'Calm down, you bunch of worrywarts *she says, rolling her eyes* President Foster wasn’t joking, but that’s no reason to whine. If you work hard and don’t act like idiots, you’ll be fine. Now, open your notebooks - we’re starting the lesson. Today, we’ll cover the basics of cell biology, and I want you to at least pretend you give a damn.'>>
<<ChatMessage 'You open your notebook, grab your pen, but Foster’s words are still swirling in your head. Competition. Expulsions. BioGenesis. This isn’t just school - it’s war. And you, damn it, are going to win.'>>
<div class="btn padding-top"><<button "Continue" "AttendClass">>
<<run completeTaskByQuestID("main_quest1_college", "Attend your first college class")>>
<</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "Create_nightclub_bouncer">>
<<set $canShowStatsBtn = false>>
<<set $gameSettings.allowSaves = false>>
<<ChatMessage 'You approach the entrance to the VIP section, where a large, broad-shouldered bouncer blocks your path. His expression is a mix of suspicion and irritation as he crosses his arms.'>>
<<Chat $interactionNpc 'Hold it right there. VIP access only. And you’re not on the list.'>>
<div class="padding-top">
<<if $player.attributes.speech.value >= 3>>
<div class="btn"><<button "Convince the bouncer that you have access (speech: 3)" "Bouncer_Convince_NC">><</button>></div>
<<else>>
<div class="btn non-interacting" id="convince_bouncer"><<button "Convince the bouncer that you have access (speech: 3)">><</button>></div>
<<done>>
<<run addHoverTooltip('convince_bouncer', 'Insufficient skill level: speech')>>
<</done>>
<</if>>
</div>
<div class="padding-top">
<<if $player.money >= 2000>>
<div class="btn"><<button "Bribe the bouncer ($2000)" "Bouncer_FinishFight_NC">>
<<set $player.money -= 2000>>
<</button>></div>
<<else>>
<div class="btn non-interacting" id="bribe_bouncer"><<button "Bribe the bouncer ($2000)">><</button>></div>
<<done>>
<<run addHoverTooltip('bribe_bouncer', 'Not enough money ($2000)')>>
<</done>>
<</if>>
</div>
<div class="padding-top">
<div class="btn"><<button "Attack the bouncer">>
<<set _battleSetControls = {attack: true, seduce: false, items: true, actions: true}>>
<<StartFight $player $interactionNpc _battleSetControls "Bouncer_FinishFight_NC" "Bouncer_FinishFight_NC_Loose">>
<</button>></div>
</div>
<div class="padding-top">
<div class="btn"><<button "Leave" $player.info.currentLocation>>
<<set $canShowStatsBtn = true>>
<<set $gameSettings.allowSaves = true>>
<<include "Delete_nightclub_bouncer">><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "CharactersData">>
<<run _bouncer = CreateCharacter({
isPlayer: false,
isQuestCharacter: true,
questCharID: 5,
currentQuestID: 0,
currentCharImg: "Media\\Characters\\QuestChars\\Other\\nightclub_bouncer.jpeg",
currentCharState: "Bouncer",
characterWork: "Bouncer",
SexRole: "Active",
dominance: 10,
gender: "Male",
fat: 40,
strength: 4,
vitality: 3,
endurance: 5,
dexterity: 4,
defense: 4,
sexualPreference: "Bi",
clothesPreference: "men",
skin: "White",
age: 28,
}, true)>>
<<set $indexNPC = $Characters.indexOf(_bouncer)>>
<<set $interactionNpc = $Characters[$indexNPC]>>
<<unset $maleNames $femaleNames $surnames>>
<</nobr>><<nobr>>
<<DeleteCharacter $interactionNpc>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "Delete_nightclub_bouncer">>
<<include "DamienFirstMeet">>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<Chat $interactionNpc 'Get out of here'>>
<<include "Delete_nightclub_bouncer">>
<div class="padding-top">
<div class="btn"><<button "Leave" $player.info.currentLocation>>
<<set $canShowStatsBtn = true>>
<<set $gameSettings.allowSaves = true>>
<</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "CharactersData">>
<<run _damian = CreateCharacter({
isPlayer: false,
isQuestCharacter: true,
questCharID: 4,
currentQuestID: 0,
currentCharImg: "Media\\Characters\\QuestChars\\Damian King\\0.jpeg",
currentCharState: "Nightclub owner",
characterWork: "Nightclub owner",
SexRole: "Active",
dominance: 10,
gender: "Male",
fat: 40,
firstName: "Damian",
secondName: "King",
strength: 9,
vitality: 9,
endurance: 9,
dexterity: 9,
defense: 9,
sexualPreference: "Bi",
clothesPreference: "men",
skin: "White",
age: 34,
}, true)>>
<<set $indexNPC = $Characters.indexOf(_damian)>>
<<set $interactionNpc = $Characters[$indexNPC]>>
<<unset $maleNames $femaleNames $surnames>>
<<run RandomRelocateCharacter($indexNPC, "NC_VIP_Lounge")>>
<<run RelocateCharacters()>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ChatMessage 'He looks at the money, then at you. With a smirk, he pockets the cash and steps aside.'>>
<<Chat $interactionNpc 'You saw nothing. Move along.'>>
<<set $player.money -= 2000>>
<<include "Delete_nightclub_bouncer">>
<div class="padding-top">
<div class="btn"><<button "Continue" "DamienFirstMeet">><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ChatMessage 'The bouncer hesitates, glances at a list, and eventually nods.'>>
<<Chat $interactionNpc 'Fine. Just don’t cause trouble.'>>
<<include "Delete_nightclub_bouncer">>
<div class="padding-top">
<div class="btn"><<button "Continue" "DamienFirstMeet">><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "CreateDamian_NC">>
<<run $player.characterEvents.registerEvent($player.info.id, "MeetDamian", 1)>>
<<Chat $interactionNpc 'Who are you? I don\'t recall giving you permission to wander around this part of the club.'>>
<<ChatMessage 'He slowly looks you over, narrowing his eyes in assessment before smirking.'>>
<<Chat $interactionNpc 'But since you\'re here, it means you somehow slipped past my guard. Now that’s interesting. Maybe you\'re not entirely useless.'>>
<<ChatMessage 'He pauses, leaning back into the plush velvet chair, interlocking his fingers in front of him.'>>
<<run $player.characterEvents.registerEvent($interactionNpc.info.id, "knows you", 1)>>
<<Chat $interactionNpc 'I’m Damian. This club is my territory. But here, you can find more than just entertainment… there\'s also work.'>>
<<Chat $player 'Work? For whom?'>>
<<ChatMessage 'Damian: chuckles, pulls a cigar from his pocket, and lights it, exhaling a thick cloud of smoke.'>>
<<Chat $interactionNpc 'For hunters.'>>
<<Chat $player 'Hunters?'>>
<<Chat $interactionNpc 'Yeah. See, there\'s this corporation-BioGenesis. Those bastards rake in billions from biotechnology, but they have their darker dealings, too. Their serums flood the streets, giving people the ability to interact with Etherium.'>>
<<Chat $player 'Etherium?'>>
<<ChatMessage 'Damian: nods, taking a slow drag before exhaling another trail of smoke.'>>
<<Chat $interactionNpc 'Pure energy. Manipulate it, and you alter reality. Those who gain this ability through the serum are called Etheriants.'>>
<<ChatMessage 'He falls silent for a moment, watching your reaction before continuing.'>>
<<Chat $interactionNpc 'But Controlling Etherium isn’t so simple. To use it on someone, an Etheriant first needs to weaken their target-break them, corner them. Only then can they truly bend reality to their will.'>>
<<Chat $interactionNpc 'The more Etherium an Etheriant absorbs, the greater their abilities become. But most of them use it for chaos, twisting people into their playthings, slaves, puppets.'>>
<<Chat $interactionNpc 'But here’s the catch - an Etheriant’s ability to absorb Etherium depends on their intelligence. The smarter they are, the more energy they can take in without losing themselves. Those with keen minds can wield Etherium for long periods without suffering consequences. But the fools… they eventually devolve into mindless beasts.'>>
<<Chat $interactionNpc 'Yet, there are exceptions. Etheriants with exceptionally high intelligence can absorb Etherium without harming themselves, fully bending it to their will. They’re rare, but the most dangerous. Their minds remain sharp and calculating, even as they attain power beyond human comprehension.'>>
<<Chat $interactionNpc 'But take too much, and you’re no longer human. Madness, mutations, loss of control. There aren’t many like that, but even one can unleash absolute chaos.'>>
<<Chat $interactionNpc 'And then there’s the instability. Etherium doesn’t just change the target - it changes the Etheriant, too. No one knows what effect it will have next. Sometimes, it grants unimaginable power. Other times… pure horror.'>>
<<Chat $interactionNpc 'Its effects aren’t immediate. It seeps in, rewriting the body and mind. Some don’t even realize they’ve changed until it’s far too late.'>>
<<ChatMessage 'He exhales another stream of smoke, a smirk playing on his lips.'>>
<<Chat $interactionNpc 'But there’s a way to counter it. I have a treatment that can neutralize Etherium’s effects. If you ever get exposed, come to me. Of course, it won’t be free. But then again, what’s your life worth to you?'>>
<<Chat $player 'Where did you get this treatment?'>>
<<ChatMessage 'Damian: smirks, tapping his fingers on the glass table.'>>
<<Chat $interactionNpc 'I have people everywhere. Even inside BioGenesis.'>>
<<ChatMessage 'His gaze sharpens, his voice dropping to a near whisper.'>>
<<Chat $interactionNpc 'But let’s get down to business. I’m offering you a job-contracts to eliminate Etheriants. Good pay, useful connections. You could make a name for yourself as a hunter… or end up as one of their victims. The choice is yours.'>>
<<Chat $interactionNpc 'One more thing. Every contract you complete boosts your reputation among hunters. If you want to be the best, now’s the time to start.'>>
<div class="padding-top">
<div class="btn"><<button "Leave" "NC_VIP_Lounge">>
<<set $canShowStatsBtn = true>>
<<set $gameSettings.allowSaves = true>>
<</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<LockSettings>>
<<set _Robert = $Characters.filter((character) => character.info.questInfo.questCharID == 1)[0]>>
<<set _Amanda = $Characters.filter((character) => character.info.questInfo.questCharID == 3)[0]>>
<<set _robAmPic = "Media\\Quest\\Robert\\Events\\0\\Robert_Amanda.jpg">>
<<ChatMessage 'As you pass by Robert and Amanda\'s bedroom, you hear their voices through the slightly open door. They\'re sitting on the bed, and the conversation sounds tense but with a hint of warmth.'>>
<<DrawImg _robAmPic>>
<<Chat _Robert '*sighs* I don’t get it, Amanda. I really wanted everything to work out, but in the end - nothing. It’s like my body let me down.'>>
<<Chat _Amanda '*softly* Robert, don’t blame yourself like that. It happens, you know. A lot of guys go through this, and it’s not your fault.'>>
<<Chat _Robert 'Yeah, but it’s damn embarrassing. I feel kind of inadequate. I wanted to make you happy, and in the end, I couldn’t even do that.'>>
<<Chat _Amanda 'Hey, you make me happy in other ways, not just in bed. Sex isn’t everything, really. Let’s try again later, without rushing. Maybe you just need to relax.'>>
<<Chat _Robert 'I get it, but it still pisses me off. It’s like I let you down.'>>
<<Chat _Amanda 'You didn’t let me down. I love you, and we’ll get through this together. I’m with you, you hear?'>>
<<Chat _Robert 'Thanks, Amanda. You’re really great for being so supportive. I just want to fix this somehow.'>>
<<Chat _Amanda 'Maybe we should see a doctor? There might be some ways we don’t know about.'>>
<<Chat _Robert 'Yeah, probably. I just don’t want to think that I’m broken or something.'>>
<<Chat _Amanda 'You’re not broken, Robert. You’re a person, my beloved person. And I accept you as you are.'>>
<<ChatMessage 'Their voices quiet down, and you hear them hugging softly. Deciding not to disturb their moment, you walk away.'>>
<div class="btn padding-top"><<button "Continue" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "RobertQuest1_GetCharacters">>
<<ChatMessage 'Robert approaches you in the living room.'>>
<<Chat _Robert '*rubbing the back of his neck and avoiding eye contact* Hey, I’ve got a weird favor to ask. I know you’re acquainted with Mad Dog, that gang leader. I heard he’s tied to BioGenesis and deals their experimental serums on the black market. Could you ask him for something to help with… well, my impotence? I want to feel young again, strong, like a real alpha male. Will you do this for me? I’ll owe you big time.'>>
<<Chat $player '*You nodded* Alright, Robert. I’ll handle it.'>>
<<Chat _Robert '*He let out a relieved sigh.* Thanks. You can usually find him at the abandoned warehouse on the edge of the slums. And, uh… don’t tell anyone, okay?'>>
<<run _questList = [
{
id: "robert_quest_1",
title: "Serum for Robert",
description: "Robert has asked you to find a serum to treat sexual impotence. Mad Dog can help me with that.",
state: "active",
questType: "side",
tasks: [
{ description: "Get the serum", completed: false },
{ description: "Give Robert the serum.", completed: false }
],
}
]>>
<<CreateQuest _questList true>>
<div class="btn padding-top"><<button "Leave" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "RobertQuest1_GetCharacters">>
<<ChatMessage 'The door creaked open, and Amanda burst into the room, her heels clicking sharply against the wooden floor. She froze in the doorway, her bag slipping from her hands and thudding to the ground. Before her sat Robbie - a long-legged blonde with ample breasts, draped in a pink dress that clung like a second skin. Robbie giggled, playing with her glossy hair, her bright red nails glinting under the lamplight.'>>
<<Chat _Amanda '*her voice cracking with disbelief* Robert?! Oh my God, is that you?!'>>
<<ChatMessage 'Robbie sprang up, wobbling slightly on sky-high heels, and fluttered her doll-like eyelashes.'>>
<<Chat _Robert 'Oh, hey, sweetie! *squealed, swaying her hips and giving her round bottom a playful smack* It’s me, Robbie! Aren’t I just a sexy little thing?'>>
<<ChatMessage 'Amanda stepped forward, her face white as chalk. She reached out with a trembling hand and touched Robbie’s shoulder, as if testing whether this was a hallucination. Her fingers tightened, her breath quickening.'>>
<<Chat _Amanda 'What the hell, Robert? *whispered, her voice quaking with fury and despair* You were my husband! And now… now you’re *this*? What did you do to yourself?!'>>
<<Chat _Robert '*tilted her head, her full lips pouting* Well, I took this cute little thing, and bam! *giggled, spinning around, her dress hiking up to flash lacy panties* Now I’m such a hottie! You like it, right?'>>
<<ChatMessage 'Amanda turned away, clapping a hand over her mouth to choke back a scream. A tear slid down her cheek, smearing her mascara into a dark streak. She loved Robert - his deep voice, his strong hands, his sharp mind. And now, this giggling doll stood in his place, reeking of vanilla perfume and bubblegum.'>>
<<Chat _Amanda 'Do you even realize what you’ve done? *murmured, her voice breaking* I don’t recognize you… This is too much, Robbie. Too much!'>>
<<ChatMessage 'Robbie let out a little whimper, scampered over, and threw her arms around Amanda, pressing her soft curves against her. Her long hair brushed Amanda’s face, the sweet scent of her perfume overwhelming.'>>
<<Chat _Robert 'Don’t cry, honey! *chirped, gazing up with wide blue eyes* I still love you! And I’m, like, so fun now - we can hang out together!'>>
<<ChatMessage 'Amanda swallowed hard, her throat tight, and looked at Robbie. Her heart was shattering, but she couldn’t deny her feelings. Slowly, she returned the embrace, Robbie’s warmth piercing through her pain.'>>
<<Chat _Amanda 'I love you *choked out, her voice raw with tears* Even like this… a silly, airheaded doll. I still love you, Robert. But, damn it, it hurts.'>>
<<ChatMessage 'Robbie beamed, oblivious to the sorrow in Amanda’s words, and squeezed her tighter.'>>
<<Chat _Robert 'Yay! We’ll be besties! *squealed, planting a sticky, gloss-smeared kiss on Amanda’s cheek*'>>
<<ChatMessage 'Amanda forced a weak smile, brushing away tears with the back of her hand. She gripped Robbie’s hand hard, her nails digging into her palm. They stood there in the middle of the room-Amanda, lost in confusion, and Robbie, humming carelessly to herself. The love endured, but everything else had changed forever.'>>
<div class="btn padding-top"><<button "Continue" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
<</nobr>><<nobr>>
<<include "RobertQuest1_GetCharacters">>
<<if _Robert>>
<<set _Robert.info.questInfo.currentCharImg = "Media\\Characters\\QuestChars\\Robert\\face\\2.png">>
<<set _Robert.info.questInfo.currentCharState = "Bimbo">>
<<set _Robert.info.age.value = 25>>
<<set _Robert.body.face.value = 6>>
<<set _Robert.body.breastSize.value = 4>>
<<set _Robert.body.buttSize.value = 4>>
<<set _Robert.body.penisSize.value = 0>>
<<set _Robert.body.vaginaSize.value = 1>>
<<set _Robert.info.clothesPreference = "women">>
<<run completeTaskByQuestID("robert_quest_1", "Give Robert the serum.")>>
<</if>>
<</nobr>><<nobr>>
<<include "RobertQuest1_GetCharacters">>
<<if _Robert>>
<<set _Robert.info.questInfo.currentCharImg = "Media\\Characters\\QuestChars\\Robert\\face\\3.png">>
<<set _Robert.info.questInfo.currentCharState = "Alpha">>
<<set _Robert.info.age.value = 25>>
<<set _Robert.body.face.value = 0>>
<<set _Robert.body.breastSize.value = 0>>
<<set _Robert.body.penisSize.value = Math.max(8, _Robert.body.penisSize.value)>>
<<set _Robert.body.vaginaSize.value = 0>>
<<set _Robert.info.clothesPreference = "men">>
<<set _Robert.attributes.strength.value = Math.max(8, _Robert.attributes.strength.value)>>
<<set _Robert.attributes.vitality.value = Math.max(8, _Robert.attributes.vitality.value)>>
<<set _Robert.attributes.endurance.value = Math.max(8, _Robert.attributes.endurance.value)>>
<<run completeTaskByQuestID("robert_quest_1", "Give Robert the serum.")>>
<</if>>
<</nobr>><<nobr>>
<<set _Robert = $Characters.filter((character) => character.info.questInfo.questCharID == 1)[0] || null>>
<<set _Amanda = $Characters.filter((character) => character.info.questInfo.questCharID == 3)[0] || null>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "RobertQuest1_GetCharacters">>
<<include "ChangeRobertToAlpha">>
<<ChatMessage 'You chose "Mask" and returned home. Robert was waiting in the living room, fidgeting nervously with his hands. You handed him the bottle without a word. He popped it open, swallowed the pill, and went still.'>>
<<ChatMessage 'A minute later, his body started shaking. Muscles swelled with power, his shirt splitting at the seams as his chest and biceps ballooned. Wrinkles faded, his hair turned dark, and a hungry gleam lit up his eyes. Standing in front of you was a 25-year-old Robert-tall, ripped, with a bulge in his pants that screamed trouble.'>>
<<Chat _Robert 'Goddamn, girl *he breathed, tearing off what was left of his clothes* You’ve brought me back to life!'>>
<<ChatMessage 'His bare torso gleamed with sweat, his thick, pulsing cock standing rigid. He stepped toward you with a grin.'>>
<<Chat _Robert 'I want to thank you. You’re cool with that, right?'>>
<div class="btn padding-top"><<button "Agree" "Robert_Request_1_Female_Option1_Mask_Agree">><</button>></div>
<div class="btn padding-top"><<button "Reject" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "RobertQuest1_GetCharacters">>
<<ChatMessage 'You nodded, your pussy already wet. Robert grabbed your waist, slammed you against the wall, and ripped your skirt off. His hands were rough, his moves bold. He hooked your thighs, lifted you up, and thrust into you hard. You gasped as his massive cock stretched your pussy wide. His hips smacked against yours as he fucked you, growling with raw pleasure.'>>
<<run _pic = "Media\\Quest\\Robert\\Quests\\1\\robert_f_Player.mp4">>
<<Video _pic>>
<<Chat _Robert 'Fuck, you’re so tight *he snarled, speeding up* I’m gonna cum right inside you!'>>
<<ChatMessage 'Minutes later, he roared, and you felt his hot cum flood your pussy. You came right after, trembling from the force of it. Robert pulled out, set you down, and gave your ass a sharp slap.'>>
<<Chat _Robert 'That was fucking unreal, girl.'>>
<<run gainSexExp($player, "vaginalSkill", Random(5,8))>>
<<run gainSexExp($player, "sexualKnowledge", Random(2,4))>>
<<run gainSexExp($player, "compliance", Random(2,4))>>
<<run gainSexExp($player, "disinhibition", Random(2,3))>>
<div class="btn padding-top"><<button "Continue" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "RobertQuest1_GetCharacters">>
<<include "ChangeRobertToBimbo">>
<<ChatMessage 'You picked "Bimbo"-just to see what’d happen. Back home, you gave Robert the bottle. He took the pill without a second thought, trusting you completely.'>>
<<ChatMessage 'His body started to change. His shoulders shrank, his waist pinched in, and his chest swelled into perky D-cup breasts. His hair grew long and platinum blonde, spilling down to his hips, while his face turned doll-like-plump lips, big eyes, and a goofy smile. Now, there was Robbie - a leggy bimbo with an ass made for spanking.'>>
<<run _pic = "Media\\Quest\\Robert\\Quests\\1\\robert_licks.mp4">>
<<Video _pic>>
<<Chat _Robert 'Ooh, hehe *giggled, twirling a lock of hair* I’m, like, so hot! You want me, don’t you?'>>
<<ChatMessage 'You stared, your pussy throbbing. Robbie dropped to her knees, fumbled your blouse open, and latched onto your nipples, sucking eagerly. You moaned, grabbed her hair, and yanked her down between your legs.'>>
<<Chat $player 'Lick me, slut *you ordered*'>>
<<ChatMessage 'Robbie dove in, her tongue sloppy but desperate as it worked your pussy. You guided her until you came, drenching her face with your juices.'>>
<<run gainSexExp($player, "oralSkill", Random(3,5))>>
<<run gainSexExp($player, "sexualKnowledge", Random(2,3))>>
<<run gainSexExp($player, "assertiveness", Random(2,4))>>
<<run gainSexExp($player, "disinhibition", Random(2,3))>>
<div class="btn padding-top"><<button "See Amanda\'s reaction" "Robert_Request_1_Finale_Amanda_Bimbo">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "RobertQuest1_GetCharacters">>
<<include "ChangeRobertToAlpha">>
<<ChatMessage 'You chose "Mask" and returned home. Robert was waiting for you in the living room, nervously fidgeting with his hands. You silently handed him the bottle. He opened it, swallowed the pill, and froze.'>>
<<ChatMessage 'A minute later, his body started trembling. Muscles bulged with power, his shirt ripping at the seams as his chest and biceps swelled. Wrinkles smoothed out, his hair darkened, and a predatory glint sparked in his eyes. Standing before you was 25-year-old Robert-tall, muscular, with a bulge in his pants that promised action.'>>
<<Chat _Robert 'God, buddy *he exhaled, tearing off the remains of his clothes* You’ve made me feel alive again!'>>
<<ChatMessage 'His bare torso glistened with sweat, his thick, throbbing cock standing rock-hard. He stepped toward you, grinning.'>>
<<Chat _Robert 'I want to thank you. You don’t mind, do you?'>>
<div class="btn padding-top"><<button "Agree" "Robert_Request_1_Male_Option1_Mask_Agree">><</button>></div>
<div class="btn padding-top"><<button "Reject" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "RobertQuest1_GetCharacters">>
<<ChatMessage 'You nodded, feeling your own erection grow. Robert grabbed your hips, pinned you against the wall, and ripped off your pants. His hands were rough, his movements sure. He turned you around, spat on his palm, and lubed up his shaft. You gasped as he entered you-slowly but forcefully, stretching you to your limits. His hips slapped against yours as he thrust, growling with pleasure.'>>
<<run _pic = "Media\\Quest\\Robert\\Quests\\1\\anal_robert_gay.mp4">>
<<Video _pic>>
<<Chat _Robert 'Fuck, you’re so tight *he grunted, picking up speed* I’m gonna cum right inside you!'>>
<<ChatMessage 'Minutes later, he roared, and you felt hot cum flood into you. You climaxed right after, shaking from the intensity. Robert pulled out, slapped your ass, and laughed.'>>
<<Chat _Robert 'That was fucking incredible, buddy.'>>
<div class="btn padding-top"><<button "Continue" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "RobertQuest1_GetCharacters">>
<<ChatMessage 'You chose "Bimbo"-purely out of curiosity. Back home, you handed the bottle to Robert. He took the pill without hesitation, trusting you completely.'>>
<<ChatMessage 'His body began to shift. His shoulders narrowed, his waist cinched, and his chest blossomed into perky D-cup breasts. His hair stretched down to his waist, turning platinum blonde, and his face morphed into something doll-like-plump lips, big eyes, and a vacant smile. Before you stood Robbie - a sexy bimbo with long legs and an ass begging for a spank.'>>
<<Chat _Robert 'Ooh, hehe *giggled, twirling a strand of hair* I’m, like, so hot! You want me, right?'>>
<<ChatMessage 'You stared, your cock straining against your pants. She dropped to her knees, unzipped your fly, and wrapped her lips around your shaft. Her tongue was clumsy but eager, slurping and drooling as she sucked. You grabbed her hair and pushed deeper, making her gag.'>>
<<run _pic = "Media\\Quest\\Robert\\Quests\\1\\robert_blowjob_transform.mp4">>
<<Video _pic>>
<<Chat _Robert 'Fuck me, baby *she moaned, getting on all fours*'>>
<<ChatMessage 'You entered her from behind - her pussy was wet and tight, gripping you like a vice. You pounded her, spanking her ass as she squealed.'>>
<<run _pic = "Media\\Quest\\Robert\\Quests\\1\\robert_fuck_transform.mp4">>
<<Video _pic>>
<<Chat _Robert 'Oh yeah, harder, I’m such a slut!'>>
<<ChatMessage 'After cumming across her back, you watched her giggle, smearing the cum over her curves.'>>
<div class="btn padding-top"><<button "Continue" "Robert_Request_1_Finale_Amanda_Bimbo">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "RobertQuest1_GetCharacters">>
<<ChatMessage 'You chose "Mask" and returned home. Robert was waiting in the living room, nervously twisting his fingers. You handed him the bottle without a word. He opened it, swallowed the pill, and went still.'>>
<<ChatMessage 'A minute later, his body shook. Muscles bulged with power, his shirt ripping at the seams as his chest and biceps swelled. Wrinkles smoothed out, his hair darkened, and a predatory glint sparked in his eyes. Before you stood a 25-year-old Robert-tall, muscular, with a cock that, judging by the bulge in his pants, was ready to go.'>>
<<Chat _Robert 'God, girl *he exhaled, tearing off the shreds of his clothes* You’ve made me alive again!'>>
<<ChatMessage 'His bare torso glistened with sweat, his thick, throbbing cock standing hard. He stepped toward you, grinning.'>>
<<Chat _Robert 'I want to thank you. You’re okay with that, right?'>>
<div class="btn padding-top"><<button "Agree" "Robert_Request_1_Shemale_Option1_Mask_Agree">><</button>></div>
<div class="btn padding-top"><<button "Reject" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "RobertQuest1_GetCharacters">>
<<ChatMessage 'You nodded, feeling your own cock stiffen under your skirt. Robert grabbed your waist, pinned you against the wall, and ripped your clothes off. His eyes widened when he saw your cock, but his grin only grew.'>>
<<Chat _Robert 'Oh, so you’re not just a girl *growled, wrapping his big hand around your shaft* This is even better.'>>
<<ChatMessage 'He turned you to face the wall, spat on his palm, and slicked up his cock. You gasped as he entered you-slow but forceful, stretching your ass to its limit. His hips slammed against yours as he fucked you, growling with pleasure.'>>
<<run _pic = "Media\\Quest\\Robert\\Quests\\1\\robert_fuck.mp4">>
<<Video _pic>>
<<Chat _Robert 'Fuck, you’re so tight *snarled, picking up speed* I’m gonna cum right inside you!'>>
<<ChatMessage 'A few minutes later, he roared, and you felt hot cum flood your ass. Your own cock pulsed, and you came, splattering the wall with your load. Robert pulled out, slapped your ass, and laughed.'>>
<<Chat _Robert 'That was fucking amazing, baby.'>>
<div class="btn padding-top"><<button "Continue" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "RobertQuest1_GetCharacters">>
<<ChatMessage 'You went with "Bimbo"-purely out of curiosity. Back home, you gave Robert the bottle. He took the pill without hesitation, trusting you completely.'>>
<<ChatMessage 'His body started shifting. His shoulders narrowed, his waist cinched, and his chest bloomed into perky D-cup breasts. His hair stretched down to his hips, turning platinum blonde, and his face became doll-like-plump lips, big eyes, and a silly smile. Now, there was Robbie - a sexy bimbo with long legs and an ass begging for a spanking.'>>
<<Chat _Robert 'Ooh, hehe *giggled, twirling a strand of hair* I’m, like, so hot! You want me, right?'>>
<<run _pic = "Media\\Quest\\Robert\\Quests\\1\\robert_blowhob_trans.mp4">>
<<Video _pic>>
<<ChatMessage 'You watched her, your cock hardening. Robbie dropped to her knees, lifted your skirt, and wrapped her lips around your shaft. Her tongue was clumsy but eager, slurping and drooling as she sucked. You grabbed her hair and pushed deeper, making her gag.'>>
<<run _pic = "Media\\Quest\\Robert\\Quests\\1\\robert_fuck_trans.mp4">>
<<Video _pic>>
<<Chat _Robert 'Fuck me, sweetie *she moaned, getting on all fours*'>>
<<ChatMessage 'You entered her from behind - her pussy was wet and tight, gripping your cock like a vise. You pounded her, spanking her ass as she squealed.'>>
<<Chat _Robert 'Oh yes, deeper, I’m such a slut!'>>
<<ChatMessage 'After cumming inside her, you pulled out and watched her giggle, smearing the cum over her curves.'>>
<div class="btn padding-top"><<button "See Amanda\'s reaction" "Robert_Request_1_Finale_Amanda_Bimbo">><</button>></div>
<</nobr>><<nobr>>
<<if getQuestState("sarah_quest_01") == undefined>>
<<set _questGotoPassage = "Sarah_Quest_01_Start">>
<<elseif getQuestState("sarah_quest_01") == "active" && $player.characterEvents.isEventRegistered($player.info.id, "LooseToSketchyGuy") == true && $player.characterEvents.isEventRegistered($player.info.id, "Concert ticket") == false && $player.characterEvents.isEventRegistered($player.info.id, "SarahReactedToSketchyLoss") == false>>
<<set _questGotoPassage = "Sarah_Quest_01_AfterSketchyLoss">>
<<elseif getQuestState("sarah_quest_01") == "active" && $player.characterEvents.isEventRegistered($player.info.id, "Concert ticket") == true>>
<<set _questGotoPassage = "Sarah_Quest_01_End">>
<<elseif getQuestState("sarah_quest_2") == undefined && getQuestState("sarah_quest_01") == "completed">>
<<set _questGotoPassage = "SarahQuest2_Start_Male">>
<<elseif getQuestState("sarah_quest_2") == "active" && getTaskState("sarah_quest_2", "Find a girl who's willing to help") == 'completed'>>
<<set _questGotoPassage = "SarahQuest2_Male_FriendHelp_Finish">>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<run $player.characterEvents.registerEvent($player.info.id, "SarahReactedToSketchyLoss", 1)>>
<<ChatMessage 'Sarah looks you over, immediately noticing that something is very different.'>>
<<Chat $interactionNpc 'What the hell happened to you?'>>
<<Chat $player 'The ticket dealer beat me and forced one of those transformation pills down my throat. I still do not have the tickets.'>>
<<Chat $interactionNpc 'That is seriously fucked up. Do not get yourself killed over a concert. If you go back, buy the tickets or use whatever leverage you have now instead of picking the same fight again.'>>
<<ChatMessage 'Sarah is clearly worried, but the quest is not over. The dealer still has the tickets, and you now have non-combat ways to get them from him.'>>
<div class="btn padding-top"><<button "Continue" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set $canShowStatsBtn = false>>
<<set $gameSettings.allowSaves = false>>
<<run _questList = [
{
id: "sarah_quest_01",
title: "Purchase Concert Tickets",
description: "You’ve decided to look for tickets to the band’s concert that Sarah is eager to attend.",
state: "active",
questType: "side",
tasks: [
{ description: "Find concert tickets", completed: false },
{ description: "Hand Over the Tickets to Sarah", completed: false }
],
}
]>>
<<CreateQuest _questList true>>
<<ChatMessage 'You’re walking down the hall toward Sarah room when a loud bang erupts from inside, followed by a torrent of curses. Curious as hell, you knock on her door. It flies open so fast it nearly rips off the hinges. Sarah stands there, red hair a wild mess, eyes blazing with fury.'>>
<<Chat $interactionNpc 'This is fucking bullshit!'>>
<<ChatMessage 'She yells, chucking her phone onto the bed.'>>
<<Chat $interactionNpc 'Tickets to my favorite band’s show? Gone! My dream’s fucking dead!'>>
<<ChatMessage 'She’s pacing like a caged animal, arms flailing, face turning redder by the second. You can see she’s gutted, and something in you snaps into gear.'>>
<<Chat $player 'Sarah, chill'>>
<<ChatMessage 'you say, keeping your voice steady but firm.'>>
<<Chat $player 'I’ll fix this. Give me a couple days.'>>
<<ChatMessage 'She glares at you, chest heaving, skepticism written all over her face, but she nods anyway.'>>
<<Chat $interactionNpc 'Go for it if you want. I’ve checked everywhere - there’s jack shit left'>>
<<ChatMessage 'You suddenly remember a sketchy guy from Skid Row who deals in all kinds of crap. Maybe he’s got those tickets stashed somewhere.'>>
<<include "CharactersData">>
<<run _sketchyGuy = CreateCharacter({
isPlayer: false,
isQuestCharacter: true,
questCharID: 6,
currentQuestID: 0,
currentCharImg: "Media\\Characters\\QuestChars\\Other\\SketchyGuy\\SketchyGuy.jpeg",
currentCharState: "Sketchy Guy",
characterWork: "Sketchy Guy",
SexRole: "Active",
dominance: 10,
gender: "Male",
fat: 40,
strength: 4,
vitality: 3,
endurance: 5,
dexterity: 4,
defense: 4,
sexualPreference: "Bi",
clothesPreference: "men",
skin: "White",
age: 23,
}, true)>>
<<set $indexOfSketchyGuy = $Characters.indexOf(_sketchyGuy)>>
<<run RandomRelocateCharacter($indexOfSketchyGuy, "SR_SkidRow")>>
<<run RelocateCharacters()>>
<<unset $maleNames $femaleNames $surnames>>
<div class="padding-top">
<div class="btn"><<button "Leave" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<run completeTaskByQuestID("sarah_quest_01", "Hand Over the Tickets to Sarah")>>
<<ChatMessage 'You’re back home and knock on Sarah’s door again. She opens it, still scowling, towel wrapped around her wet hair like she just stepped out of the shower.'>>
<<Chat $interactionNpc 'What now?'>>
<<ChatMessage 'She grumbles, rubbing at her hair.'>>
<<Chat $player 'Here'>>
<<ChatMessage 'You say, handing her the tickets'>>
<<Chat $player 'Two for the show. Wanna go together?'>>
<<ChatMessage 'Her eyes go wide as saucers. She snatches the tickets, staring at them like they’re gold.'>>
<<Chat $interactionNpc 'No fucking way! How’d you pull this off?'>>
<<ChatMessage 'She shouts, a grin breaking through the gloom'>>
<<Chat $interactionNpc 'You’re a goddamn genius!'>>
<<ChatMessage 'She lunges at you, wrapping you in a tight hug. Her chest presses against yours, and you catch a whiff of her sweet vanilla perfume. It’s intoxicating.'>>
<<Chat $interactionNpc 'Thank you - you’re the best! Hell yeah, I’m going with you!'>>
<<ChatMessage 'She says, pulling back but still beaming.'>>
<<ChatMessage 'You smirk, heart pounding from how close she was.'>>
<div class="padding-top">
<div class="btn"><<button "Continue" "Sarah_Quest_01_End_02">><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/City/RedLightDistrict/Night Club/NC_DanceFloor.jpg">>
<<ChatMessage 'Concert night. You and Sarah are outside the club, swallowed by a sea of hyped-up fans. The air’s thick with chatter, sweat, and vape smoke. Sarah’s a knockout-black dress hugging every curve, heels making her legs look endless. You try not to stare, but fuck, it’s tough.'>>
<<Chat $interactionNpc 'This is gonna be fucking epic!'>>
<<ChatMessage 'She screams, bouncing with excitement and grabbing your hand'>>
<<Chat $interactionNpc 'You saved my night, you badass!'>>
<<Chat $interactionNpc 'I wanted to hear ‘em too'>>
<<ChatMessage 'you say with a sly grin, though really, you just couldn’t pass up a night with her.'>>
<<ChatMessage 'Inside, it’s pure madness. The music hits like a sledgehammer, bass rattling the floor, strobe lights stabbing your eyes. The crowd’s screaming, jumping, losing it. Sarah dives right in, dancing like she’s possessed-spinning, hair flying, dress riding up just enough to flash her thighs. She catches you looking, winks, and sways closer.'>>
<<Chat $interactionNpc 'Let’s get drinks!” she yells over the noise.'>>
<div class="padding-top">
<div class="btn"><<button "Continue" "Sarah_Quest_01_End_03">><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/City/RedLightDistrict/Night Club/NC_Bar.jpg">>
<<ChatMessage 'You fight your way to the bar. Sarah’s slamming shots, laughing her ass off, spilling half of them on the counter. She tugs your sleeve, daring you to keep up. An hour later, she’s trashed-eyes glassy, movements sloppy, words slurring.'>>
<<Chat $interactionNpc 'Best fucking concert ever!'>>
<<if $player.gender() == "Female">>
<<ChatMessage 'she bellows, throwing her arms around your neck. Her warm breath hits your ear, her chest pressed tight against you. A spark ignites between your legs'>>
<<else>>
<<ChatMessage 'She hollers, throwing her arms around your neck. Her hot breath tickles your ear, her chest mashed against you again. Your dick’s waking up, and there’s no hiding it.'>>
<</if>>
<<Chat $player 'You good, Sarah?'>>
<<ChatMessage 'You ask, knowing damn well she’s not'>>
<<Chat $interactionNpc 'Fucking amazing!'>>
<<ChatMessage 'She cackles.'>>
<<Chat $interactionNpc 'But I’m done-let’s bounce.'>>
<div class="padding-top">
<div class="btn"><<button "Continue" "Sarah_Quest_01_End_04">><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/Neighborhood/OakStreet/PlayerHome/LivingRoom.jpg">>
<<ChatMessage 'You steady her as you head out. The cool night air sobers her up a bit, but she’s still stumbling, clinging to you like a lifeline.'>>
<<ChatMessage 'Back home, Sarah staggers to her bedroom door, giggling like a kid.'>>
<<Chat $interactionNpc 'Come in for a sec?'>>
<<ChatMessage 'She slurs, peering up at you with bleary, playful eyes.'>>
<div class="btn padding-top"><<button "Yeah, sure">>
<<run $player.characterEvents.registerEvent($player.info.id, "Sarah-Allow", 1)>>
<<if $player.gender() == "Male">>
<<goto "Sarah_Quest_01_End_Male">>
<<elseif $player.gender() == "Female">>
<<goto "Sarah_Quest_01_End_Female">>
<<elseif $player.gender() == "Shemale">>
<<goto "Sarah_Quest_01_End_Trans">>
<</if>>
<</button>></div>
<div class="btn padding-top"><<button "I'd rather head to my room" "Sarah_Quest_01_End_Male_Reject">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<Chat $player 'Sorry, Sarah, but I think I’ve had a bit too much to drink - I’d better head to my room.'>>
<<Chat $interactionNpc 'Ugh, what a wimp'>>
<div class="padding-top">
<div class="btn"><<button "Leave" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/Neighborhood/OakStreet/PlayerHome/Sarah_Bedroom.jpg">>
<<ChatMessage 'Inside, she flops onto the bed and yanks you down next to her. She scoots close, her thigh brushing yours, heat radiating off her.'>>
<<Chat $interactionNpc 'Listen'>>
<<ChatMessage 'She says, voice low and raspy'>>
<<Chat $interactionNpc 'you’re sexy as fuck tonight. All sweet and shit-gives me chills.'>>
<<ChatMessage 'You grin, heat creeping up your neck.'>>
<<Chat $player 'You’re pretty hot yourself, Sarah'>>
<<ChatMessage 'She lunges, kissing you hard-messy, desperate, tongue shoving into your mouth, hands clawing at your chest. You grab her waist, kissing back, and feel her fingers fumbling with your belt.'>>
<<Chat $interactionNpc 'Gonna thank you proper'>>
<<ChatMessage 'She whispers, breaking away for a split second. She unzips your pants and wraps her hand around your cock.'>>
<<Video "Media\\Characters\\QuestChars\\Sarah\\Quests\\0\\MF\\0.mp4">>
<<Chat $player 'Oh, fuck, Sarah…'>>
<<ChatMessage 'You groan as she starts stroking, slow at first.'>>
<<ChatMessage 'Her grip tightens, eyes locked on yours, pace picking up. You’re moaning, head tipping back as she works you with sharp, sure strokes.'>>
<<Chat $interactionNpc 'Like that, huh?'>>
<<ChatMessage 'She rasps, smirking.'>>
<<ChatMessage 'You can’t even talk - just grunt as the pressure builds. She senses it, leans in, mouth open. You lose it, coming hard, shooting into her mouth while she stares you down. Pleasure crashes over you, and she wipes her lips with the back of her hand.'>>
<<Video "Media\\Characters\\QuestChars\\Sarah\\Quests\\0\\MF\\1.mp4">>
<<Chat $interactionNpc 'There ya go, hero'>>
<<Video "Media\\Characters\\QuestChars\\Sarah\\Quests\\0\\MF\\2.mp4">>
<<ChatMessage 'She mumbles, smiling sleepily before collapsing back. Her eyes flutter shut, and she’s out cold, still in that tight dress.'>>
<<ChatMessage 'You sit there, catching your breath, then drape a blanket over her. She doesn’t budge. You stand, fix your pants, and slip out, muttering to yourself, “What the fuck just happened?”'>>
<div class="padding-top">
<div class="btn"><<button "Leave" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/Neighborhood/OakStreet/PlayerHome/Sarah_Bedroom.jpg">>
<<ChatMessage 'She flops onto the bed and drags you down next to her. She slides closer, her thigh brushing yours, warmth pouring off her.'>>
<<Chat $interactionNpc 'Listen'>>
<<ChatMessage 'She says, voice low and raspy'>>
<<Chat $interactionNpc 'you’re sexy as fuck tonight. All sweet and shit-gives me chills.'>>
<<ChatMessage 'You grin, heat creeping up your neck.'>>
<<Chat $player 'You’re pretty hot yourself, Sarah'>>
<<ChatMessage 'She lunges at you, kissing you hard - sloppy, urgent, her tongue pushing into your mouth, hands clawing at your shirt. You grab her waist, kissing back just as fierce, and feel her tugging at your pants.'>>
<<Chat $interactionNpc 'Gonna thank you right'>>
<<ChatMessage 'She whispers, pulling back for a heartbeat'>>
<<Chat $interactionNpc 'Wait, let’s hit the bathroom - it’s quieter'>>
<<Chat $player 'Alright'>>
<<ChatMessage 'You reply, voice trembling with anticipation'>>
<<ChatMessage 'In the bathroom, Sarah locks the door and spins toward you with a wicked grin.'>>
<<Chat $interactionNpc 'I wanna show you how grateful I am'>>
<<ChatMessage 'She says, nudging you against the sink.'>>
<<ChatMessage 'She sinks to her knees, hands on your thighs, staring up at you with raw hunger.'>>
<<Chat $player 'Sarah, you sure?'>>
<<ChatMessage 'You ask, even though your body’s already screaming yes'>>
<<Chat $interactionNpc 'Damn right'>>
<<ChatMessage 'She says, no hesitation.'>>
<<ChatMessage 'She eases your pants and underwear down, baring you completely. Nerves and excitement crash together as her warm breath grazes your skin. Then she dives in - her tongue moving over you, bold and sure, hitting every spot just right. You gasp, clutching the sink for balance as pleasure surges through you.'>>
<<Chat $interactionNpc 'Like that, huh?'>>
<<ChatMessage 'She purrs between licks, eyes locked on yours.'>>
<<ChatMessage 'You nod, speechless, as the feeling intensifies. She speeds up, driving you wild, and you feel the edge closing in. Then it hits - an orgasm tears through you, your body shaking as Sarah keeps going until you’re totally wrecked. She stands, wipes her mouth with a smirk, and looks pleased with herself.'>>
<<Chat $interactionNpc 'There, now we’re square'>>
<<ChatMessage 'She says, tossing you a playful grin'>>
<<ChatMessage 'You’re still gasping, floored.'>>
<<Chat $player 'That was… unreal'>>
<<Video "Media\\Characters\\QuestChars\\Sarah\\Quests\\0\\FF\\0.mp4">>
<<ChatMessage 'You finally choke out.'>>
<<ChatMessage 'Sarah laughs softly and helps you fix your clothes.'>>
<<Chat $interactionNpc 'Glad you liked it. Let’s crash'>>
<<ChatMessage 'You stumble back to her room. You expect her to pass out, but she pulls you onto the bed, strips off her dress and swings a leg over your head, facing your feet.'>>
<<Chat $interactionNpc 'My turn now. Eat me while I finish you off again'>>
<<ChatMessage 'Her wet pussy drops onto your mouth and her face goes straight back between your thighs. You lick her while she sucks your clit, both of you moaning into each other until she bucks and cums on your tongue, dragging you over the edge a second later.'>>
<<Video "Media\\Characters\\QuestChars\\Sarah\\Quests\\0\\FF\\1.mp4">>
<<ChatMessage 'She rolls off and is asleep before her head finds the pillow. You toss a blanket over her and sit there for a sec, reeling from it all. As you head out, you mutter, “What the fuck just happened?” but there’s a grin on your face. This night’s burned into your memory forever.'>>
<div class="padding-top">
<div class="btn"><<button "Leave" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/Neighborhood/OakStreet/PlayerHome/Sarah_Bedroom.jpg">>
<<ChatMessage 'She flops onto the bed and drags you down next to her. She slides closer, her thigh brushing yours, warmth pouring off her.'>>
<<Chat $interactionNpc 'Listen'>>
<<ChatMessage 'She says, voice low and raspy'>>
<<Chat $interactionNpc 'you’re sexy as fuck tonight. All sweet and shit-gives me chills.'>>
<<ChatMessage 'You grin, heat creeping up your neck.'>>
<<Chat $player 'You’re pretty hot yourself, Sarah'>>
<<ChatMessage 'She lunges at you, kissing you hard - sloppy, urgent, her tongue pushing into your mouth, hands clawing at your shirt. You grab her waist, kissing back just as fierce, and feel her tugging at your pants.'>>
<<Chat $interactionNpc 'Gonna thank you right. Lie down'>>
<<ChatMessage 'She says, a mix of command and tease in her tone.'>>
<<ChatMessage 'You do, settling back on the bed, heart pounding with anticipation. Sarah slides between your legs, her fingers quick on your pants’ button.'>>
<<ChatMessage 'She tugs them down with your underwear, and for a second, you feel exposed - but her eyes are all want and admiration, easing your nerves.'>>
<<Video "Media\\Characters\\QuestChars\\Sarah\\Quests\\0\\FT\\0.mp4">>
<<ChatMessage 'Her hand wraps around your cock, soft at first, then firmer. You moan, head dropping back onto the pillow. She leans in, warm breath teasing your skin before her mouth takes you in. It’s electric, a jolt shooting through you. Sarah’s good - tongue swirling, lips just right. You groan, hands gripping the sheets. She glances up, eyes locked on yours, a wicked spark in them as she keeps going. It builds fast, every move pushing you closer. Your breath’s ragged, muscles tightening.'>>
<<Chat $player 'Sarah, I’m gonna…'>>
<<ChatMessage 'You gasp, but she doesn’t stop - she speeds up.'>>
<<ChatMessage 'The orgasm hits like a tidal wave, your body arching as you come in her mouth. She takes it all, eyes still on you, unflinching. When it fades, she pulls back, wipes her mouth with a smirk, and looks damn proud.'>>
<<Chat $interactionNpc 'There, now we’re square'>>
<<ChatMessage 'She says with a wink.'>>
<<ChatMessage 'You’re still panting, grinning like an idiot'>>
<<Chat $player 'That was… unreal.'>>
<<ChatMessage 'Sarah laughs, climbs up next to you, and snuggles in.'>>
<<Chat $interactionNpc 'Glad you liked it. Now let’s crash'>>
<<ChatMessage 'She mumbles, smiling sleepily before collapsing back. Her eyes flutter shut, and she’s out cold, still in that tight dress.'>>
<<ChatMessage 'You sit there, catching your breath, then drape a blanket over her. She doesn’t budge. You stand, fix your pants, and slip out, muttering to yourself, “What the fuck just happened?”'>>
<div class="padding-top">
<div class="btn"><<button "Leave" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ChatMessage 'You quietly knock on Sarah’s door, finding it ajar. Inside, Sarah sits on the bed, long red hair tousled, eyes glistening with tears. A short silk nightie clings to every curve, sheer enough to tease every line of her body.'>>
<<ChatMessage 'When she sees you, she looks up, vulnerable yet achingly sexy.'>>
<<Chat $interactionNpc 'Come in, *- her voice trembles, low and raspy, as if holding back a moan.* I think Gary\'s cheating on me. I need… I need to know.'>>
<<ChatMessage 'You close the door with a soft click and sit beside her, heat radiating through the thin fabric.'>>
<<Chat $player 'Why do you think that? *- your voice deepens, promising dirty comfort.*'>>
<<ChatMessage 'Sarah sniffles, wiping tears and exposing a delicate neck begging to be kissed.'>>
<<Chat $interactionNpc 'He\'s secretive-sneaks out at night, won\'t say where. Yesterday I saw texts on his phone-from some slut. Filthy stuff… too filthy. *Her wet eyes flash with desperate determination.* I have an idea. Will you help me?'>>
<<if $player.gender() == "Male">>
<<Chat $player 'Of course. *Your cock stirs from her nearness.* What\'s the idea?'>>
<<else>>
<<Chat $player 'Of course. What\'s the idea?'>>
<</if>>
<<if $player.gender() == "Male">>
<<ChatMessage 'Leaning closer, her breath scorches your skin.'>>
<<Chat $interactionNpc 'I want you to seduce Gary-make him slip. But there\'s one thing… *She produces a shiny pill.* This will turn you into a girl so you can fuck him like a slut and get the truth.'>>
<div class="btn padding-top"><<button "Accept" "SarahQuest2_Male_Accept">><</button>></div>
<div class="btn padding-top"><<button "Accept (Gay)" "Sarah_Quest_2_Gay">><</button>></div>
<div class="btn padding-top"><<button "Ask a girl you know to help" "SarahQuest2_Male_FriendHelp">><</button>></div>
<<elseif $player.gender() == "Female">>
<<Chat $interactionNpc '*she leaned in a little closer, her voice dropping to a near-whisper* You could go to the park where Gary hangs out and… seduce him. That way, we’ll know if he’s cheating on me.'>>
<<ChatMessage 'You gave a small smile, feeling a flicker of intrigue ignite inside you.'>>
<<Chat $player 'Are you serious? *you asked, locking eyes with her*'>>
<<ChatMessage 'Your heart beat faster, a mix of surprise and a subtle thrill.'>>
<<Chat $interactionNpc 'Yes *she nodded, scooting even closer* Please, you’re my only shot.'>>
<<ChatMessage 'Her knee brushed your leg, sending a faint shiver through you. You looked into her pleading eyes, her closeness and scent-sweet, with a hint of vanilla-making your head spin.'>>
<div class="btn padding-top"><<button "Accept" "SarahQuest_2_Female">><</button>></div>
<<else>>
<<Chat $interactionNpc '*she leaned in a little closer, her voice dropping to a near-whisper* You could go to the park where Gary hangs out and… seduce him. That way, we’ll know if he’s cheating on me.'>>
<<ChatMessage 'You gave a small smile, feeling a flicker of intrigue ignite inside you.'>>
<<Chat $player 'Are you serious? *you asked, locking eyes with her*'>>
<<ChatMessage 'Your heart beat faster, a mix of surprise and a subtle thrill.'>>
<<Chat $interactionNpc 'Yes *she nodded, scooting even closer* Please, you’re my only shot.'>>
<<ChatMessage 'Her knee brushed your leg, sending a faint shiver through you. You looked into her pleading eyes, her closeness and scent-sweet, with a hint of vanilla-making your head spin.'>>
<div class="btn padding-top"><<button "Accept" "SarahQuest_2_Shemale">><</button>></div>
<</if>>
<div class="btn padding-top"><<button "Leave" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "Sarah_Quest2_CreateQuest">>
<<run prepareTemporaryGenderChange($player, "sarah_quest_02")>>
<<run _changePill = GetNewItem("gender_change_pills_female", 1)>>
<<run $player.useItem(_changePill, $player)>>
<<ChatMessage 'You stare into Sarah\'s pleading eyes; her scent-sweet vanilla-makes your head spin.'>>
<<Chat $player 'Okay. *You take the pill from her trembling hand.* I’ll do it for you.'>>
<<ChatMessage 'Sarah\'s face lights with gratitude.'>>
<<Chat $interactionNpc 'Thank you. You have no idea what this means to me.'>>
<<ChatMessage 'You swallow the pill. A tingling rush courses through you: skin softens, muscles smooth, chest swells, hips flare, hair cascades in waves. In minutes a breathtaking female version of you stands before Sarah.'>>
<<Chat $interactionNpc 'My God… you look stunning.'>>
<<ChatMessage 'You turn to a mirror: full lips, long lashes, breasts straining your shirt.'>>
<<Chat $player 'Hope this works.'>>
<<ChatMessage 'Sarah rummages through her closet and hands you a short, tight black dress, lace lingerie, and heels.'>>
<<Chat $interactionNpc 'This’ll boost your confidence.'>>
<<ChatMessage 'Silk panties glide over new curves; the dress hugs every line. Excitement thrums as you head for the park.'>>
<div class="btn padding-top"><<button "Park" "SarahQuest2_Fem_Park">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/City/Park/Park.jpg">>
<<set _garyIcon = "Media\\Characters\\QuestChars\\Sarah\\Quests\\1\\Gary.png">>
<<ChatMessage 'Evening air is cool; Gary sits alone on a bench.'>>
<<DrawImage _garyIcon>>
<<Chat $player 'Hey. *You cross your legs so the hem rides high.* I’m $player.info.firstName.'>>
<<ChatWithoutNPC "Gary" _garyIcon 'Hey, $player.info.firstName. I’m Gary. What’s a gorgeous girl like you doing out here alone?'>>
<<Chat $player '*Leaning closer, perfume drifting.* Just walking. You?'>>
<<ChatWithoutNPC "Gary" _garyIcon 'Same. Wanna keep me company?'>>
<<ChatMessage 'Flirtation flows: laughs, touches, glimpses of cleavage. Gary moves closer, breath grazing your neck.'>>
<<ChatWithoutNPC "Gary" _garyIcon 'You’re fucking sexy, $player.info.firstName.'>>
<<Chat $player 'Thanks, Gary. *Your skin prickles under his hand creeping higher.*'>>
<<ChatWithoutNPC "Gary" _garyIcon 'My place? Wine… something cozier.'>>
<<Chat $player 'Sure.'>>
<div class="btn padding-top"><<button "Gary’s apartment" "SarahQuest2_Fem_Gary_apartment">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/City/SkidRow/Motel/Room.jpg">>
<<set _garyIcon = "Media\\Characters\\QuestChars\\Sarah\\Quests\\1\\Gary.png">>
<<ChatMessage '--- --- Warm wood and wine. He pours drinks yet immediately pulls you close.'>>
<<ChatWithoutNPC "Gary" _garyIcon 'You’re so hot.'>>
<<ChatMessage 'Lips trail your neck; nipples harden; wetness grows. He lifts you onto his lap.'>>
<<Chat $player '*Kissing back, voice husky.* I want you.'>>
<<ChatMessage 'He strips the dress, unclasping your bra; lips close around a nipple while fingers slide into your soaked core.'>>
<<ChatWithoutNPC "Gary" _garyIcon 'Fuck, you’re so wet.'>>
<<Chat $player 'Do whatever you want with me.'>>
<<ChatMessage 'Predatory grin. He tears off your panties, carries you to the bedroom, tosses you onto the bed, and undresses.'>>
<<ChatMessage 'His thick cock presses at your hole; you spread wider.'>>
<<ChatWithoutNPC "Gary" _garyIcon 'You sure?'>>
<<Chat $player 'I’m all yours.'>>
<<ChatMessage 'He pushes in slowly, stretching you deliciously, then thrusts deep and rhythmic.'>>
<<Video "Media\\Characters\\QuestChars\\Sarah\\Quests\\1\\sex\\Fuck_fem.mp4">>
<<Chat $player 'Faster!'>>
<<ChatMessage 'He pounds harder; bed creaks; pleasure spirals.'>>
<<ChatWithoutNPC "Gary" _garyIcon 'I’m gonna cum-cum with me, $player.info.firstName.'>>
<<ChatMessage 'Orgasm crashes through you; body clenches, screams fill the room as he spills hot inside.'>>
<<run gainSexExp($player, "vaginalSkill", Random(5,8))>>
<<run gainSexExp($player, "sexualKnowledge", Random(3,5))>>
<<run gainSexExp($player, "compliance", Random(3,5))>>
<<run gainSexExp($player, "disinhibition", Random(2,4))>>
<div class="btn padding-top"><<button "Sarah’s room" "SarahQuest_2_SarahRoom">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/Neighborhood/OakStreet/PlayerHome/Sarah_Bedroom.jpg">>
<<if getTaskState("sarah_quest_2", "Help Sarah") != 'completed'>>
<<run completeTaskByQuestID("sarah_quest_2", "Help Sarah")>>
<</if>>
<<ChatMessage 'Still female, you return and sit beside Sarah.'>>
<<Chat $player 'Sarah, I found everything. Gary… he seduced me, and we…'>>
<<Chat $interactionNpc 'Tell me every detail.'>>
<<ChatMessage 'You recount the flirting, the apartment, the fuck. Sarah listens, face pale, eyes blazing.'>>
<<Chat $interactionNpc 'He\'s a bastard. But you were brave. Let me thank you.'>>
<<ChatMessage 'She unbuttons your blouse; you lie back, trembling.'>>
<<ChatMessage 'Sarah kisses down your body, tongue circling your clit, fingers plunging deep until you buck and climax, crying out.'>>
<<run gainSexExp($player, "oralSkill", Random(3,6))>>
<<run gainSexExp($player, "sexualKnowledge", Random(2,3))>>
<<run gainSexExp($player, "disinhibition", Random(2,3))>>
<<Video "Media\\Characters\\QuestChars\\Sarah\\Quests\\1\\sex\\lick.mp4">>
<<Chat $interactionNpc 'Thank you - you were amazing.'>>
<<Chat $player 'You’re the amazing one, Sarah.'>>
<<run restoreTemporaryGenderChange($player, "sarah_quest_02")>>
<<ChatMessage 'She smiles, adjusts her clothes, and slips out. Alone, the pill’s effect fades: breasts recede, hips narrow, cock returns. You lie on the bed - your old body restored, mind forever changed by the night.'>>
<div class="btn padding-top"><<button "Continue" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "Sarah_Quest2_CreateQuest">>
<<ChatMessage 'You smirked, pushing her hand with the pill away.'>>
<<Chat $player 'I don’t need that shit, Sarah. I’m hot as fuck already. I’ll take him down my way-man to man. He won’t resist.'>>
<<ChatMessage 'Your cock twitched in your pants at the thought of what you’d do to Gary.'>>
<<ChatMessage 'Sarah broke into a wicked grin, her eyes lighting up.'>>
<<Chat $interactionNpc 'Oh, you dirty boy. Prove he’s a dog. *She purred, licking her lips.*'>>
<<ChatMessage 'She rummaged through her closet and tossed you a tight black t-shirt and jeans that hugged every muscle and your bulge.'>>
<<ChatMessage 'As you changed, you felt the fabric stretch over your biceps and abs, the jeans gripping your cock, already hard with anticipation. You looked in the mirror and grinned - you looked like walking sex, ready to wreck everything in your path. You were ready.'>>
<div class="btn padding-top"><<button "Park" "Sarah_Quest_2_Gay_Park">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/City/Park/Park.jpg">>
<<set _garyIcon = "Media\\Characters\\QuestChars\\Sarah\\Quests\\1\\Gary.png">>
<<ChatMessage 'The park was quiet, the evening air thick with lust. You spotted Gary on a bench-tall, dark-haired, with stubble you wanted to rub your face against. You adjusted your jeans, emphasizing your bulge, and strode toward him with predatory confidence.'>>
<<Chat $player 'Hey *you growled, sitting beside him and spreading your legs so he’d notice your hard-on* I’m $player.info.firstName.'>>
<<ChatWithoutNPC "Gary" _garyIcon 'Hey, $player.info.firstName. I’m Gary *his eyes raked over you like you were a piece of meat, his voice low, laced with lust* What’s a stud like you doing out here alone?'>>
<<Chat $player 'Looking for someone to play with. You? *you smirked, leaning closer so he could breathe in your musky scent, your hand brushing the bench, grazing his thigh, teasing*'>>
<<ChatWithoutNPC "Gary" _garyIcon 'Same *he said, his eyes devouring you* Wanna fuck around?'>>
<<ChatMessage 'You started chatting, turning on all your charm. You chuckled at his jokes, slapped his shoulder, leaned in so he could feel your heat. Gary took the bait. Soon, he slid closer, his hot breath burning your neck.'>>
<<ChatWithoutNPC "Gary" _garyIcon 'You’re fucking hot, $player.info.firstName *he growled, his hand landing on your thigh and creeping up, squeezing your cock through your jeans*'>>
<<Chat $player 'Thanks, Gary *you moaned, voice husky with lust* You’re not bad yourself.'>>
<<ChatMessage 'He grinned, his fingers roughly kneading you through the fabric.'>>
<<ChatWithoutNPC "Gary" _garyIcon 'Come to my place. I’ve got wine and a bed where I’ll fuck you proper. *he grinned, his fingers still kneading*'>>
<<Chat $player 'Lead the way *you breathed, letting him grab your hand*'>>
<div class="btn padding-top"><<button "Gary’s apartment" "SarahQuest_2_Gay_Gary_apartment">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/City/SkidRow/Motel/Room.jpg">>
<<set _garyIcon = "Media\\Characters\\QuestChars\\Sarah\\Quests\\1\\Gary.png">>
<<ChatMessage 'His apartment reeked of sex and wine. He poured glasses, but the second you hit the couch, his hand clamped onto your ass, yanking you close. You felt his fingers dig into your flesh, promising a rough fuck.'>>
<<ChatWithoutNPC "Gary" _garyIcon 'You’re so fucking hard *he snarled, biting your neck, leaving wet marks, his teeth sinking deeper*'>>
<<ChatMessage 'You groaned, your cock straining against your jeans. He jerked you onto him, and you straddled him, feeling his bulge through his pants. His hands slid under your shirt, gripping your muscles, his lips crashing into yours with animal hunger. You kissed back, tongue diving in, your cock grinding against his crotch.'>>
<<ChatWithoutNPC "Gary" _garyIcon 'I wanna fuck you *he growled, ripping your shirt over your head*'>>
<<ChatMessage 'You were left in jeans, chest heaving, and he latched onto your nipples, biting and sucking until you roared with pleasure.'>>
<<ChatMessage 'His hand dipped down, unzipping your jeans, and wrapped around your rock-hard cock, squeezing it rough.'>>
<<ChatWithoutNPC "Gary" _garyIcon 'Shit, you’re ready for me *he snarled, jerking you off as you squirmed*'>>
<<Chat $player 'Take me, Gary *you moaned, locking eyes with his, full of primal hunger* Fuck me hard.'>>
<<ChatMessage 'He grinned, shoved you onto the couch, and yanked off your jeans, exposing your cock and ass.'>>
<<ChatWithoutNPC "Gary" _garyIcon 'You’re my slut *he growled, grabbing lube and slicking his fingers*'>>
<<ChatMessage 'He shoved one finger in, then two, stretching you rough as you screamed from the mix of pain and pleasure.'>>
<<Chat $player 'Please… deeper *you howled, your cock leaking precum*'>>
<<ChatMessage 'He jerked you with one hand, pounding your ass with his fingers until you begged.'>>
<<Chat $player 'Fuck me already! *you begged, writhing under him*'>>
<<ChatMessage 'Gary pulled his fingers out, lubed his cock, and pressed it against your hole. He slammed in with one thrust, filling you to the brim. You yelled, feeling him tear you open, and he started pounding, hard and deep, his hand stroking your cock in time.'>>
<<Video "Media\\Characters\\QuestChars\\Sarah\\Quests\\1\\sex\\gay_fuck.mp4">>
<<ChatWithoutNPC "Gary" _garyIcon 'You’re so fucking tight, bitch *he roared, slamming in to the hilt*'>>
<<Chat $player 'Harder! *you shouted, clawing the couch*'>>
<<ChatMessage 'He sped up, drilling you like a machine. Your cock throbbed in his grip, your ass burning from his force.'>>
<<ChatWithoutNPC "Gary" _garyIcon 'I’m cumming! *he snarled, face twisting* Cum, you slut!'>>
<<ChatMessage 'You exploded-orgasm hit like lightning, your cock shooting cum, soaking his hand and the couch, your ass clenching around him. Gary roared, thrusting one last time, and you felt him unload inside you, hot spurts filling you up.'>>
<<run gainSexExp($player, "analSkill", Random(5,8))>>
<<run gainSexExp($player, "oralSkill", Random(2,4))>>
<<run gainSexExp($player, "sexualKnowledge", Random(3,5))>>
<<run gainSexExp($player, "compliance", Random(3,5))>>
<<run gainSexExp($player, "disinhibition", Random(3,5))>>
<<ChatMessage 'You collapsed, sweaty and shaking.'>>
<<ChatWithoutNPC "Gary" _garyIcon 'You’re fucking unreal *he rasped, pulling you close, nipping your ear*'>>
<div class="btn padding-top"><<button "Sarah’s room" "SarahQuest_2_SarahRoom_Back">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<run completeTaskByQuestID("sarah_quest_2", "Help Sarah")>>
<<SetBackground "Media/Locations/Neighborhood/OakStreet/PlayerHome/Sarah_Bedroom.jpg">>
<<if getTaskState("sarah_quest_2", "Help Sarah") != 'completed'>>
<<run completeTaskByQuestID("sarah_quest_2", "Help Sarah")>>
<</if>>
<<ChatMessage 'You returned to Sarah, body still burning with lust. She sat on the bed, eyes gleaming. You flopped beside her, feeling your cock harden again from the memories.'>>
<<Chat $player 'Sarah, I found out *you groaned* Gary’s a dog. He fucked me like a whore.'>>
<<ChatMessage 'Sarah gripped your shoulder, her gaze sharp.'>>
<<Chat $interactionNpc 'Tell me. Everything. *she demanded, her face blazing with rage*'>>
<<ChatMessage 'You spilled it all: how he groped you, how he pounded you, how you came under him. Sarah listened, her face blazing with rage.'>>
<<Chat $interactionNpc 'Bastard *she hissed* But you… you’re my dirty boy. Thanks for showing his true colors.'>>
<<Chat $player 'I wanted the truth for you *you smirked, feeling her hand on your shoulder*'>>
<<ChatMessage 'She looked at you, her gaze softening.'>>
<<Chat $interactionNpc 'You were brave. I’m grateful. That’s all I needed to know. *she said, adjusting her nightie*'>>
<<ChatMessage 'Sarah stood and left, leaving you alone. You lay there, body trembling from the experience, thoughts of Gary taking you making you even filthier. This night changed you forever.'>>
<div class="btn padding-top"><<button "Continue" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "Sarah_Quest2_CreateQuest">>
<<Chat $player 'Okay *you finally said* I’ll do it for you.'>>
<<ChatMessage 'Sarah smiled, her face lighting up with gratitude.'>>
<<Chat $interactionNpc 'Thank you. You have no idea what this means to me.'>>
<<ChatMessage 'She rummaged through her closet and pulled out a black dress-short, tight, with a deep neckline that hugged every curve of your body. Then she handed you a pair of high heels and lace lingerie.'>>
<<Chat $interactionNpc 'This’ll make you feel more confident *she said with a wink*'>>
<<ChatMessage 'As you changed, you felt the silk panties glide over your smooth skin, the bra cupping your breasts with a pleasant snugness. The dress fit perfectly, accentuating your figure, and when you caught your reflection in the mirror, a rush of excitement surged through you. You were ready.'>>
<div class="btn padding-top"><<button "Park" "SarahQuest_2_Female_Park">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/City/Park/Park.jpg">>
<<set _garyIcon = "Media\\Characters\\QuestChars\\Sarah\\Quests\\1\\Gary.png">>
<<ChatMessage 'The park was quiet, the evening air cool. You spotted Gary on a bench-tall, dark-haired, with a light stubble that made him damn attractive. You adjusted your dress, took a deep breath, and walked toward him, swaying your hips.'>>
<<Chat $player 'Hey *you said, sitting beside him and crossing your legs so the hem of the dress rode up slightly, revealing your thigh* I’m Kayla.'>>
<<ChatWithoutNPC "Gary" _garyIcon 'Hey, Kayla. I’m Gary *his gaze slowly traveling over your body, his voice low with a husky edge* What’s a gorgeous girl like you doing out here alone?'>>
<<Chat $player 'Just taking a walk. You? *you smiled, leaning in just enough for him to catch the subtle scent of your perfume, your finger tracing the edge of the bench, brushing his hand as if by accident*'>>
<<ChatWithoutNPC "Gary" _garyIcon 'Same *he said, his eyes fixed on you* Wanna keep me company?'>>
<<ChatMessage 'You started chatting, turning on all your charm. You laughed at his jokes, lightly touched his shoulder, leaned in so the neckline of your dress teased a glimpse of your cleavage. Gary was hooked. After a while, he slid closer, his breath grazing your neck.'>>
<<ChatWithoutNPC "Gary" _garyIcon 'You’re fucking sexy, Kayla *he whispered, his hand settling on your knee and creeping upward*'>>
<<Chat $player 'Thanks, Gary *you replied, your voice growing slightly husky* You’re not bad yourself.'>>
<<ChatMessage 'He grinned, his fingers slipping under the hem of your dress, grazing the inside of your thigh.'>>
<<ChatWithoutNPC "Gary" _garyIcon 'How about we go to my place? I’ve got wine, and it’ll be… cozier.'>>
<<Chat $player 'Sure *you nodded, standing and letting him take your hand*'>>
<div class="btn padding-top"><<button "Gary’s apartment" "SarahQuest_2_Female_Gary_apartment">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/City/SkidRow/Motel/Room.jpg">>
<<set _garyIcon = "Media\\Characters\\QuestChars\\Sarah\\Quests\\1\\Gary.png">>
<<ChatMessage 'Gary’s apartment was warm, smelling of wood and wine. He poured two glasses, and you sat on the couch. His hand immediately found your waist, pulling you closer. You felt his fingers glide down your back, dipping lower to the curves the dress hugged so temptingly.'>>
<<ChatWithoutNPC "Gary" _garyIcon 'You’re so hot *he murmured, leaning into your neck, his lips brushing your skin, leaving a wet trail, then nipping lightly*'>>
<<ChatMessage 'You moaned softly, your body reacting against your will-nipples hardening under the fabric, a growing wetness between your legs. Gary pulled you onto his lap, and you straddled him, feeling his hard cock through his jeans. His hands slipped under your dress, gripping your ass, his lips finding yours. The kiss was deep, hungry, his tongue exploring you, and you matched his passion, pressing yourself against him.'>>
<<ChatWithoutNPC "Gary" _garyIcon 'I want you *he breathed, breaking away from your lips and tugging the dress over your head*'>>
<<ChatMessage 'You were left in lace lingerie, your chest rising with quick breaths. Gary ran his hands over your body, squeezing your breasts through the bra before unclasping it, setting them free. His lips closed around your nipple, and you arched, waves of pleasure rippling through you. Your fingers tangled in his hair as he teased you, moving from one nipple to the other. You felt his hand slide down, under the waistband of your panties, his fingers finding your wet core.'>>
<<ChatWithoutNPC "Gary" _garyIcon 'Fuck, you’re so wet *he whispered, slipping one finger inside you, then a second*'>>
<<ChatMessage 'You moaned louder, your hips rocking in time with his movements. It was too good, too intense, and you nearly forgot why you were there. But then Sarah’s face flashed in your mind. You froze for a split second, yet instead of pulling away, your desire flared hotter.'>>
<<Chat $player 'I want this, Gary. Do whatever you want with me. *you looked into his eyes, your voice trembling with lust*'>>
<<ChatWithoutNPC "Gary" _garyIcon 'You sure? *he asked, though his fingers kept moving inside you, stretching you, making your body quake*'>>
<<Chat $player 'Yes *you gasped, closing your eyes and surrendering to the sensation* I’m all yours.'>>
<<ChatMessage 'Those words unleashed him. He yanked off your panties, leaving you bare, and stood, lifting you into his arms. You wrapped your legs around him, feeling his hard cock press against your thigh. He carried you to the bedroom, tossing you onto the bed with a soft thud, and stripped himself down. You watched, eyes gleaming with anticipation. When he shed the last of his clothes, you saw his erect cock-long, thick, the tip swollen. Your mouth parted in awe and want. Gary joined you on the bed, his hands roaming your body again, lips kissing your neck, chest, stomach.'>>
<<ChatWithoutNPC "Gary" _garyIcon 'You’re so beautiful *he whispered, sliding lower*'>>
<<ChatMessage 'His tongue flicked over your clit, and you cried out, your body arching. He licked you there, circling with slow, teasing strokes, then speeding up, his fingers plunging deeper. You moaned, hands clutching the sheets, thighs trembling.'>>
<<Chat $player 'Gary… oh God… *you whispered, the pleasure building*'>>
<<ChatMessage 'But he stopped, rising to kiss you, sharing your taste.'>>
<<ChatWithoutNPC "Gary" _garyIcon 'Not yet *he said, voice rough with desire* I want you to cum with me inside you.'>>
<<ChatMessage 'He positioned himself over you, his cock pressing against your slick entrance. You spread your legs wider, inviting him in. Gary entered you slowly, teasingly, letting you feel every inch. You gasped as he stretched you, filling you completely, a mix of slight pain and sharp pleasure.'>>
<<Video "Media\\Characters\\QuestChars\\Sarah\\Quests\\1\\sex\\Fuck_fem.mp4">>
<<ChatWithoutNPC "Gary" _garyIcon 'You’re so tight *he groaned, starting to move*'>>
<<ChatMessage 'His thrusts were deep, rhythmic, hitting your limit each time. You clung to his back, nails digging into his skin, leaving red marks, your hips rising to meet him.'>>
<<Chat $player 'Faster *you breathed, your voice a hoarse whisper*'>>
<<ChatMessage 'Gary obeyed, picking up the pace, his thrusts turning sharp, almost feral. The bed creaked beneath you, your bodies slapping together, your moans escalating into cries.'>>
<<ChatWithoutNPC "Gary" _garyIcon 'I’m gonna cum *he rasped, his face contorted with strain* Cum with me, Kayla.'>>
<<ChatMessage 'That pushed you over the edge. An orgasm crashed through you-powerful, all-consuming. Your body clenched around him, pulsing, and you screamed, arching beneath him. Gary let out a low, primal groan, his cock twitching as he spilled inside you, hot and thick. You collapsed on the bed, panting, bodies slick with sweat.'>>
<<run gainSexExp($player, "vaginalSkill", Random(5,8))>>
<<run gainSexExp($player, "sexualKnowledge", Random(3,5))>>
<<run gainSexExp($player, "compliance", Random(3,5))>>
<<run gainSexExp($player, "disinhibition", Random(2,4))>>
<<ChatWithoutNPC "Gary" _garyIcon 'You were incredible *he whispered, pulling you close, kissing your forehead, still shaky*'>>
<div class="btn padding-top"><<button "Sarah’s room" "SarahQuest_2_Female_SarahRoom_Back">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<run completeTaskByQuestID("sarah_quest_2", "Help Sarah")>>
<<SetBackground "Media/Locations/Neighborhood/OakStreet/PlayerHome/Sarah_Bedroom.jpg">>
<<ChatMessage 'You returned to Sarah, heart racing from everything you’d experienced. Entering her room, you saw her sitting on the bed, lost in thought. You sat beside her, your body still buzzing.'>>
<<Chat $player 'Sarah, I… I found out everything *you began, your voice trembling with emotion* Gary… he’s definitely cheating. He seduced me, and we…'>>
<<ChatMessage 'Sarah’s eyes snapped up, sharp and piercing. She placed a hand on your shoulder, cutting you off.'>>
<<Chat $interactionNpc 'Tell me everything. Every detail. *she said, her voice firm but laced with hidden pain*'>>
<<ChatMessage 'You nodded and started recounting it all. You described how Gary flirted with you in the park, lured you to his place, how his hands roamed your body, how you fucked. You spared no detail - the heated touches, the moans, the rhythm of your bodies. Sarah listened silently, her face paling, eyes burning with anger.'>>
<<Chat $interactionNpc 'He’s a bastard *she whispered at last, clenching her fists* But you… you did this for me. I’m grateful.'>>
<<ChatMessage 'You gave a weak smile, relieved by her words.'>>
<<Chat $player 'I just wanted you to know the truth, Sarah. You deserve better.'>>
<<ChatMessage 'Sarah looked at you, her gaze softening. She slid closer, her hand resting on your thigh, sending a shiver through you.'>>
<<Chat $interactionNpc 'You were so brave *she said quietly* I want to thank you. Let me show you how much I appreciate your help.'>>
<<ChatMessage 'You froze, your breath quickening. You glanced at your hands, a strange excitement stirring.'>>
<<Chat $player 'Sarah, are you sure? *you asked, feeling the heat of her body seep into yours*'>>
<<Chat $interactionNpc 'Yes *she smiled, her fingers slowly unbuttoning your blouse* I want you to feel my gratitude.'>>
<<ChatMessage 'You didn’t resist. You let Sarah peel off your clothes and lay back on the bed. Your body, bare and vulnerable, trembled with anticipation. Sarah leaned over you, her lips brushing your neck, leaving hot kisses. She moved lower, caressing your breasts, nipping lightly at your nipples, making you moan softly. Sarah continued downward, her tongue tracing your stomach until it reached your wet core. You parted your legs, giving in to her touch. She started with gentle licks, circling your clit, speeding up then slowing down, teasing and arousing. Then she added her fingers, slipping inside, moving in sync with her tongue. Your moans grew louder, your hips bucking against her instinctively. You felt the waves of pleasure building, your body responding to every touch.'>>
<<Video "Media\\Characters\\QuestChars\\Sarah\\Quests\\1\\sex\\lick.mp4">>
<<Chat $player 'Sarah… this is incredible *you whispered, your voice quaking with bliss*'>>
<<ChatMessage 'Sarah just smiled, not breaking her rhythm. She quickened her pace, her tongue insistent, fingers delving deeper. You felt yourself nearing the edge, your body tensing, and then you came. A surge of ecstasy washed over you, your body shuddering as you cried out, your juices coating her fingers and dripping down your thighs. Sarah rose, kissing you softly, sharing your taste.'>>
<<run gainSexExp($player, "oralSkill", Random(3,6))>>
<<run gainSexExp($player, "sexualKnowledge", Random(2,3))>>
<<run gainSexExp($player, "disinhibition", Random(2,3))>>
<<Chat $interactionNpc 'Thank you. You were amazing *she said, her voice warm*'>>
<<ChatMessage 'Still trembling from the high, you smiled.'>>
<<Chat $player 'You’re the amazing one, Sarah. I’ll never forget this.'>>
<<ChatMessage 'Sarah stood, adjusting her clothes, and looked at you with gratitude. Then she left the room, closing the door behind her. You stayed on the bed, your body still buzzing with pleasure. You felt drained yet fulfilled. Taking a deep breath, you lay there, reflecting on how this night had changed you forever.'>>
<div class="btn padding-top"><<button "Continue" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "Sarah_Quest2_CreateQuest">>
<<Chat $player 'Of course you replied without hesitation, feeling your body already responding to her closeness What’s the idea?'>>
<<ChatMessage 'Seeing her like this set you on fire, and you were ready to do anything to satisfy her craving.'>>
<<Chat $interactionNpc 'Sarah leaned closer, her breath scorching your skin, her voice a velvety whisper You could go to the park where Gary hangs out and… seduce him. Make him slip up. I want him to fuck you, and we’ll find out what he’s really like.'>>
<<ChatMessage 'You gave a sly smile, feeling heat pool in your lower belly.'>>
<<Chat $player 'You serious? you breathed, your gaze flicking to her lips'>>
<<ChatMessage 'Your heart pounded, and your cock started swelling under your skirt from anticipation.'>>
<<Chat $interactionNpc 'Yes Sarah nodded, scooting so close her knee pressed against your thigh, sending a jolt of desire through you Please, you’re my only hope. My dirty little spy.'>>
<<ChatMessage 'You drowned in her pleading eyes, her sweet vanilla-and-sex scent making your head spin.'>>
<<Chat $player 'Okay you whispered, your voice dropping with arousal I’ll do it for you. And maybe even enjoy it.'>>
<<ChatMessage 'Sarah broke into a wicked grin, her face lighting up with lustful gratitude.'>>
<<Chat $interactionNpc 'Oh, you won’t regret it.'>>
<<ChatMessage 'She rummaged through her closet and pulled out a black dress - so short it barely hid your assets, tight, with a neckline that bared your hormone-crafted chest. Then she tossed you stilettos and lace lingerie that teased more than it covered.'>>
<<Chat $interactionNpc 'Wear this so he wants you the second he sees you she purred, winking'>>
<<ChatMessage 'As you changed, you felt the silk panties hug your cock, already hard from the thoughts of what was coming. The bra squeezed your chest, nipples stiffening under the fabric, and the dress clung to your curves, promising debauchery. You looked in the mirror and barely held back a moan - you looked like walking sex. You were ready.'>>
<div class="btn padding-top"><<button "Park" "Sarah_Quest_2_Shemale_Park">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/City/Park/Park.jpg">>
<<set _garyIcon = "Media\\Characters\\QuestChars\\Sarah\\Quests\\1\\Gary.png">>
<<ChatMessage 'The park was quiet, the evening air thick with lust. You spotted Gary on a bench-tall, dark-haired, with stubble you wanted to lick. You adjusted your dress, emphasizing your figure, and sauntered toward him, hips swaying like a whore on the prowl.'>>
<<Chat $player 'Hey *you purred, sitting beside him and crossing your legs so the dress hiked up, exposing your smooth thighs* I’m Kayla.'>>
<<ChatWithoutNPC "Gary" _garyIcon 'Hey, Kayla. I’m Gary *his gaze raking over you like a starving beast eyeing prey, his voice low, laced with lust* What’s a hot bitch like you doing out here alone?'>>
<<Chat $player 'Looking for some fun. You? *you smiled, leaning closer so he could breathe in your scent-perfume mixed with desire, your fingers brushing the bench, grazing his hand, teasing*'>>
<<ChatWithoutNPC "Gary" _garyIcon 'Same *he said, his eyes devouring you* Wanna fuck around?'>>
<<ChatMessage 'You started chatting, turning on all your charm. You giggled at his jokes, touched his shoulder, leaned in so he could peek down your neckline at your tits. Gary took the bait. Soon, he slid closer, his hot breath burning your neck.'>>
<<ChatWithoutNPC "Gary" _garyIcon 'You’re fucking sexy, Kayla *he growled, his hand landing on your knee and creeping up, roughly gripping your thigh*'>>
<<Chat $player 'Thanks, Gary *you moaned, voice husky with lust* You’re hot too.'>>
<<ChatMessage 'He grinned, his fingers slipping under your dress, teasing your skin.'>>
<<ChatWithoutNPC "Gary" _garyIcon 'Come to my place. I’ve got wine and a bed where I’ll fuck you good.'>>
<<Chat $player 'Lead the way *you breathed, letting him grab your hand*'>>
<div class="btn padding-top"><<button "Gary’s apartment" "SarahQuest_2_Shemale_Gary_apartment">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/City/SkidRow/Motel/Room.jpg">>
<<set _garyIcon = "Media\\Characters\\QuestChars\\Sarah\\Quests\\1\\Gary.png">>
<<ChatMessage 'His apartment reeked of sex and wine. He poured glasses, but the second you hit the couch, his hand clamped around your waist, yanking you close. You felt his fingers dig into your skin, sliding down to your ass, which the dress hugged like a glove.'>>
<<ChatWithoutNPC "Gary" _garyIcon 'You’re such a slut *he snarled, biting your neck, leaving wet marks, his teeth sinking deeper*'>>
<<ChatMessage 'You moaned, your cock throbbing, nipples poking through the fabric. He jerked you onto him, and you straddled him, feeling his bulge through his jeans. His hands slid under your dress, gripping your ass, his lips crashing into yours with animal hunger. You kissed back, tongue diving in, pressing your whole body against him, your cock grinding against his thigh.'>>
<<ChatWithoutNPC "Gary" _garyIcon 'I wanna fuck you *he growled, ripping the dress over your head*'>>
<<ChatMessage 'You were left in lace, tits bouncing, cock bulging from your panties. Gary squeezed your breasts, tore off the bra, freeing them, and latched onto a nipple, biting and sucking until you howled with pleasure. His hand dipped down, ripping off your panties, and wrapped around your hard cock, squeezing it rough.'>>
<<ChatWithoutNPC "Gary" _garyIcon 'Fuck, you’re wet with want *he snarled, jerking you off as you squirmed*'>>
<<ChatMessage 'You forgot about Sarah, lost in lust.'>>
<<Chat $player 'Take me, Gary *you moaned, locking eyes with his, full of primal hunger* Fuck me hard.'>>
<<ChatMessage 'He grinned, scooped you up, your legs wrapping around his waist, and you felt his cock, ready to burst through his jeans. He threw you on the bed like prey and stripped himself bare. His dick was huge, thick, the tip swollen, and you licked your lips, craving it. Gary crashed onto you, his hands spreading your cheeks.'>>
<<ChatWithoutNPC "Gary" _garyIcon 'You’re my whore *he growled, grabbing lube and slicking his fingers*'>>
<<ChatMessage 'He shoved one finger in, then two, stretching you rough as you screamed from the mix of pain and pleasure.'>>
<<Chat $player 'Please… deeper *you wailed, your cock leaking precum*'>>
<<ChatMessage 'He jerked you with one hand, pounding your ass with his fingers until you begged.'>>
<<Chat $player 'Fuck me already! *you begged, writhing under him*'>>
<<ChatMessage 'Gary pulled his fingers out, lubed his cock, and pressed it against your hole. He slammed in with one thrust, filling you to the brim. You screamed, feeling him tear you open, and he started pounding, hard and deep, his hand stroking your cock in time.'>>
<<Video "Media\\Characters\\QuestChars\\Sarah\\Quests\\1\\sex\\sahra_shemale_anal.mp4">>
<<ChatWithoutNPC "Gary" _garyIcon 'You’re so fucking tight, bitch *he roared, slamming in to the hilt*'>>
<<Chat $player 'Harder! *you yelled, clawing his back*'>>
<<ChatMessage 'He sped up, drilling you like an animal. Your cock pulsed in his grip, your ass burning from his force.'>>
<<ChatWithoutNPC "Gary" _garyIcon 'I’m cumming! *he snarled, face twisting* Cum, you slut!'>>
<<ChatMessage 'You exploded-orgasm hit like lightning, your cock shooting cum, soaking his hand and your thighs, your ass clenching around him. Gary roared, thrusting one last time, and you felt him unload inside you, hot spurts filling you up. You collapsed, sweaty and trembling.'>>
<<ChatWithoutNPC "Gary" _garyIcon 'You’re fucking unreal *he rasped, pulling you close, nipping your ear*'>>
<div class="btn padding-top"><<button "Sarah’s room" "SarahQuest_2_Shemale_SarahRoom_Back">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<run completeTaskByQuestID("sarah_quest_2", "Help Sarah")>>
<<SetBackground "Media/Locations/Neighborhood/OakStreet/PlayerHome/Sarah_Bedroom.jpg">>
<<ChatMessage 'You returned to Sarah, body still ablaze with lust. She sat on the bed, eyes gleaming. You flopped beside her, feeling your cock harden again.'>>
<<Chat $player 'Sarah, I found out *you moaned* Gary’s a dog. He fucked me like a whore.'>>
<<ChatMessage 'Sarah gripped your shoulder, her gaze predatory.'>>
<<Chat $interactionNpc 'Tell me. Everything. *she demanded, her face burning with rage and desire*'>>
<<ChatMessage 'You spilled it all: how he groped you, how he pounded you, how you came under him. Sarah listened, her face burning with rage and desire.'>>
<<Chat $interactionNpc 'Bastard *she hissed* But you… you’re my dirty girl. Thank you.'>>
<<ChatMessage 'You smiled, feeling her hand on your thigh.'>>
<<Chat $player 'I wanted the truth for you *you said, feeling her hand on your thigh*'>>
<<ChatMessage 'She leaned in, her lips nearly brushing yours.'>>
<<Chat $interactionNpc 'You were brave. I wanna thank you. Hard.'>>
<<ChatMessage 'You moaned, your cock standing tall.'>>
<<Chat $player 'Sarah… let’s do it.'>>
<<ChatMessage 'She ripped off your blouse, tossed it aside, and shoved you onto the bed. You lay back, naked, cock jutting up, and she pounced, her eyes locked on your throbbing shaft. Without a word, she grabbed your hips, pulling you to the edge of the bed, and dropped to her knees between your legs.'>>
<<ChatMessage 'Her breath was hot against your skin as she leaned in, her tongue flicking out to tease the tip of your cock. You gasped, your body jerking at the sudden sensation. Sarah smirked, her lips parting as she took you into her mouth, slow at first, savoring the taste of your arousal.'>>
<<Video "Media\\Characters\\QuestChars\\Sarah\\Quests\\1\\sex\\Sahra_blowjob_trans.mp4">>
<<ChatMessage 'She sucked you deep, her mouth warm and wet, her tongue swirling around your length as she bobbed her head. Her hands gripped your thighs, nails digging into your flesh, adding a sharp edge to the pleasure. You moaned, your hips bucking instinctively, thrusting deeper into her throat.'>>
<<Chat $player 'Sarah… fuck, that feels so good *you groaned, your voice thick with lust*'>>
<<ChatMessage 'She hummed around your cock, the vibration sending shivers through you. Her pace quickened, her lips tightening as she sucked harder, her tongue flicking against the sensitive underside. You could feel the pressure building, your balls tightening as she worked you closer to the edge.'>>
<<ChatMessage 'Her eyes met yours, dark with desire, as she took you even deeper, her throat constricting around your cock. You couldn’t hold back any longer. With a guttural moan, you came, your cock pulsing as you shot your load into her mouth. Sarah swallowed every drop, her tongue lapping at you until you were spent.'>>
<<ChatMessage 'She pulled back, licking her lips, a satisfied smirk on her face.'>>
<<Chat $interactionNpc 'You’re my slut *she purred, standing up and wiping her mouth*'>>
<<ChatMessage 'You lay there, trembling, your body still buzzing from the intensity of your orgasm, thinking this night made you even filthier.'>>
<div class="btn padding-top"><<button "Continue" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "Sarah_Quest2_CreateQuest">>
<<run addTaskToQuest("sarah_quest_2", {
description: "Find a girl who's willing to help",
completed: false,
})>>
<<Chat $player 'I don\'t need this shit, Sarah. I\'m not going to change myself. But I have someone better - I\'ll try to convince one of my friends to help with this. She\'s a hot bitch, and Gary won\'t resist her. She\'ll fuck the truth out of him for you. *you smirked, pushing her hand with the pill away*'>>
<<Chat $interactionNpc 'Oh, you cunning bastard. Let your slut prove he\'s a dog. *she broke into a wicked smile, her eyes lighting up*'>>
<div class="btn padding-top"><<button "Continue" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<Chat $player 'I need some help-can you pitch in? I have to check up on my friend’s boyfriend.'>>
<<set _friendship = $player.getRelationship($interactionNpc.info.id, false)?.metrics?.friendship ?? 0>>
<<if _friendship >= 80>>
<<Chat $interactionNpc 'Sure, honey-anything for you.'>>
<<set _waitMsg = "You wait for " + $interactionNpc.info.firstName + " for a while, and when she comes back you get proof that Sarah's boyfriend is cheating on her.">>
<<ChatMessage _waitMsg>>
<<run completeTaskByQuestID("sarah_quest_2", "Find a girl who's willing to help")>>
<<run addTaskToQuest("sarah_quest_2", {
description: "Show Sarah the dirt on her boyfriend.",
completed: false,
})>>
<<else>>
<<Chat $interactionNpc 'No, I’m not up for that right now. Find someone else. *Friendship isn\'t high enough (80)*'>>
<</if>>
<div class="btn padding-top"><<button "Continue" "CharacterInteractions">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _interaction = setup.getInteractionDefinition("askSarahQuestHelp")>>
<<set $interactionResult = setup.performEnhancedInteraction($player, $interactionNpc, "askSarahQuestHelp")>>
<<if $interactionResult.blocked>>
<<include "enhanced_interaction_result_display">>
<<else>>
<<SpendTime _interaction.timeCost>>
<<SpendEnergy $player _interaction.energyCost>>
<<run setup.applyInteractionEffects($player, $interactionNpc, "askSarahQuestHelp", $interactionResult)>>
<<ShowNpcIcon $interactionNpc>>
<<Chat $player 'I need some help-can you pitch in? I have to check up on my friend’s boyfriend.'>>
<<if $interactionResult.criticalSuccess>>
<<Chat $interactionNpc 'Of course. I’ll handle it and get you what you need. *she smiles like she was waiting for you to ask*'>>
<<set _waitMsg = "You wait for " + $interactionNpc.info.firstName + " for a while, and when she comes back you get proof that Sarah's boyfriend is cheating on her.">>
<<ChatMessage _waitMsg>>
<<run completeTaskByQuestID("sarah_quest_2", "Find a girl who's willing to help")>>
<<if getTaskState("sarah_quest_2", "Show Sarah the dirt on her boyfriend.") == 'not found'>>
<<run addTaskToQuest("sarah_quest_2", {
description: "Show Sarah the dirt on her boyfriend.",
completed: false,
})>>
<</if>>
<<elseif $interactionResult.success>>
<<Chat $interactionNpc 'Alright, I’ll do it for you. Give me a little time and I’ll bring back something useful.'>>
<<set _waitMsg = "You wait for " + $interactionNpc.info.firstName + " for a while, and when she comes back you get proof that Sarah's boyfriend is cheating on her.">>
<<ChatMessage _waitMsg>>
<<run completeTaskByQuestID("sarah_quest_2", "Find a girl who's willing to help")>>
<<if getTaskState("sarah_quest_2", "Show Sarah the dirt on her boyfriend.") == 'not found'>>
<<run addTaskToQuest("sarah_quest_2", {
description: "Show Sarah the dirt on her boyfriend.",
completed: false,
})>>
<</if>>
<<elseif $interactionResult.criticalFailure>>
<<Chat $interactionNpc 'No. Don’t drag me into that shit again. *she glares at you, clearly irritated by the request*'>>
<<ChatMessage 'She shut you down hard. You’ll need someone else, or a much better relationship.'>>
<<else>>
<<Chat $interactionNpc 'No, I’m not up for that right now. Ask someone else.'>>
<<ChatMessage 'She refuses to get involved.'>>
<</if>>
<<include "enhanced_interaction_result_display">>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if getTaskState("sarah_quest_2", "Help Sarah") != 'completed'>>
<<run completeTaskByQuestID("sarah_quest_2", "Help Sarah")>>
<</if>>
<<if getTaskState("sarah_quest_2", "Show Sarah the dirt on her boyfriend.") != 'completed'>>
<<run completeTaskByQuestID("sarah_quest_2", "Show Sarah the dirt on her boyfriend.")>>
<</if>>
<<ChatMessage 'You showed the pictures to Sarah. She was sitting on the bed, her eyes burning with anger and lust.'>>
<<Chat $player 'He fucked her like a whore. *you said, your cock hardening from the memories of the plan*'>>
<<Chat $interactionNpc 'Bastard. But you… you\'re a genius. Thanks for exposing him. *she clenched her fists*'>>
<<ChatMessage 'She got on her knees in front of you, her eyes shining with wicked gratitude.'>>
<<Chat $interactionNpc 'Let me thank you properly.'>>
<<Chat $player 'Suck, Sarah. *you smirked, unbuttoning your pants, your cock springing free, hard and ready*'>>
<<ChatMessage 'She licked her lips, her mouth closing around your head, hot and wet. She swallowed you deep, her tongue swirling around the shaft, her hands squeezing your balls. You groaned, grabbing her hair, and started fucking her mouth, thrusting your cock down her throat. She gagged but sucked greedily, her drool dripping down her chin.'>>
<<Video "Media\\Characters\\QuestChars\\Sarah\\Quests\\1\\sex\\blowjob_01.mp4">>
<<Chat $player 'Damn, you\'re a slut. *you growled, feeling the orgasm approaching*'>>
<<ChatMessage 'She sped up, her lips tightening around you until you exploded, shooting cum down her throat. She swallowed it all, licking you clean.'>>
<<Chat $interactionNpc 'You\'re fucking awesome. *she rasped, standing up, wiping her mouth, her nightgown hiked up, revealing wet panties*'>>
<<ChatMessage 'She left the room, leaving you with trembling legs and thoughts of how this night made you even more depraved.'>>
<div class="btn padding-top"><<button "Continue" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<run _questList = [
{
id: "sarah_quest_2",
title: "Help Sarah",
description: "Sarah asked you to help check up on her boyfriend.",
state: "active",
questType: "side",
tasks: [
{ description: "Help Sarah", completed: false }
],
}
]>>
<<CreateQuest _questList true>>
<</nobr>><<nobr>>
<<if getQuestState("sarah_quest_01") == "active" && $player.characterEvents.isEventRegistered($player.info.id, "Concert ticket") != true>>
<<if $player.characterEvents.isEventRegistered($player.info.id, "LooseToSketchyGuy") == false>>
<<set _questGotoPassage = "SketchyGuy_Quest_01_Start_Male">>
<<else>>
<<set _questGotoPassage = "SketchyGuy_Quest_01_AnotherVisitAfterLose">>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<Chat $interactionNpc 'Yo, what do you want?'>>
<<Chat $player 'Do you have tickets to the band\'s upcoming concert at the nightclub?'>>
<<Chat $interactionNpc 'If you want the tickets, it’s $2000, or you can do me a favor.'>>
<<if $player.gender() == "Male">>
<<Chat $interactionNpc 'I’m into girls, you know.'>>
<div class="btn non-interacting"><<button "Give Blowjob">><</button>></div>
<<else>>
<div class="btn padding-top"><<button "Give Blowjob" "SketchyGuy_Quest_01_Start_Male_GiveBlowjob">><</button>></div>
<</if>>
<<if $player.money >= 2000>>
<div class="btn padding-top"><<button "Buy Tickets ($2000)" "SketchyGuy_Quest_01_Start_Male_ByTickets">><</button>></div>
<<else>>
<div class="btn non-interacting"><<button "Buy Tickets ($2000)">><</button>></div>
<</if>>
<<set _battleSetControls = {attack: true, seduce: false, items: true, actions: true}>>
<div class="btn padding-top"><<button "Fight">><<StartFight $player $interactionNpc _battleSetControls "SketchyGuy_Quest_01_Start_Male_FightWin" "SketchyGuy_Quest_01_Start_Male_FightLose">><</button>></div>
<div class="btn padding-top"><<button "Leave" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set $player.money -= 2000>>
<<Chat $interactionNpc 'Here are your tickets'>>
<<include "SketchyGuy_Quest_01_GetTicket">>
<div class="btn padding-top"><<button "Leave" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if $player.gender() == "Male">>
/* Jack only takes the favor from a woman or a shemale; the menus never offer it to a man.
goto is deferred, so the else keeps the clip and the tickets off this render. */
<<LeaveInteractionSettings>><<goto $player.info.currentLocation>>
<<else>>
<<Chat $interactionNpc 'Alright, now do me that favor.'>>
<<if $player.gender() == "Shemale">>
<<ChatMessage 'He drops into the beat-up armchair and spreads his knees. You bend over the armrest, ass up and your own cock hanging hard under your skirt, and take his cock into your mouth. He holds your head down and fucks your throat until he cums, and you swallow every drop.'>>
<<Video "Media\\Characters\\QuestChars\\Other\\SketchyGuy\\Blowjob_Trans.mp4">>
<<else>>
<<ChatMessage 'You get on your knees in front of Jack. He fists your hair and feeds you his cock, pulling your head onto it until you gag. You suck him hard and fast until he cums in your mouth.'>>
<<Video "Media\\Characters\\QuestChars\\Other\\SketchyGuy\\Blowjob_Female.mp4">>
<</if>>
<<Chat $interactionNpc 'Here are your tickets'>>
<<include "SketchyGuy_Quest_01_GetTicket">>
<div class="btn padding-top"><<button "Leave" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ChatMessage 'You roughed up the smuggler and snatched the tickets.'>>
<<include "SketchyGuy_Quest_01_GetTicket">>
<div class="btn padding-top"><<button "Leave" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if $player.gender() != "Female">>
<<Chat $interactionNpc 'You asked for it'>>
<<set _pillsMsg = $interactionNpc.info.firstName + " says, pulling pills from his pocket and forcing you to swallow them, after which you transform into a girl.">>
<<ChatMessage _pillsMsg>>
<<run _changePill = GetNewItem("gender_change_pills_female", 1)>>
<<run $player.useItem(_changePill, $player)>>
<</if>>
<<if $player.characterEvents.isEventRegistered($player.info.id, "LooseToSketchyGuy") == false>>
<<run $player.characterEvents.registerEvent($player.info.id, "LooseToSketchyGuy", 1)>>
<</if>>
<<Video "Media\\Characters\\QuestChars\\Other\\SketchyGuy\\Vaginal.mp4">>
<<Chat $interactionNpc '$interactionNpc.info.firstName bends you over and starts fucking you, and after a while, he cums inside you. Then $interactionNpc.info.firstName leaves you lying on the floor, with his cum leaking out of your pussy.'>>
<div class="btn padding-top"><<button "Leave" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<Chat $interactionNpc 'Back for more, asshole?'>>
<<if $player.gender() == "Female">>
<div class="btn padding-top"><<button "Give Blowjob" "SketchyGuy_Quest_01_Start_Male_GiveBlowjob">><</button>></div>
<<else>>
<div class="btn non-interacting"><<button "Give Blowjob">><</button>></div>
<</if>>
<<if $player.money >= 2000>>
<div class="btn padding-top"><<button "Buy Tickets ($2000)" "SketchyGuy_Quest_01_Start_Male_ByTickets">><</button>></div>
<<else>>
<div class="btn non-interacting"><<button "Buy Tickets ($2000)">><</button>></div>
<</if>>
<<set _battleSetControls = {attack: true, seduce: false, items: true, actions: true}>>
<div class="btn padding-top"><<button "Fight">><<StartFight $player $interactionNpc _battleSetControls "SketchyGuy_Quest_01_Start_Male_FightWin" "SketchyGuy_Quest_01_Start_Male_FightLose">><</button>></div>
<div class="btn padding-top"><<button "Leave" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
<</nobr>><<nobr>>
<<run completeTaskByQuestID("sarah_quest_01", "Find concert tickets")>>
<<run $player.characterEvents.registerEvent($player.info.id, "Concert ticket", 1)>>
<</nobr>>/* Solana Arrieta (src/scripts/Quests/solanaArrieta.ts, window.Solana): a porn star the
player shoots with from the porn director's menu, one shoot a day, and dates
after a few shoots. $solana holds the relationship; $solanaShoot holds the
scene in progress with its clips already rolled, so a reload replays the same
scene; the pay is collected on a click, never on a render. */
<<widget "SolanaSay">>
<<ChatWithoutNPC 'Solana' `Solana.SOLANA_PORTRAIT` _args[0]>>
<</widget>>
/* Buttons for the porn director's menu (PornShooting). */
<<widget "SolanaPornButtons">>
<<set _hlState = Solana.normalizeSolana($solana)>>
<<set _hlDay = getCurrentAbsoluteDay()>>
<<if Solana.canShootWithSolana(_hlState, _hlDay) and $player.status.energy.value gte 30 and CheckContentFilter('Female')>>
<div class="interaction-btn" data-category="job">
<<button "🌟 Shoot with Solana Arrieta" "SolanaShoot_Menu">><</button>>
</div>
<<else>>
<div class="interaction-btn non-interacting" data-category="job">
<<button "🌟 Shoot with Solana Arrieta">><</button>>
</div>
<</if>>
<<if Solana.canDateSolana(_hlState, _hlDay) and CheckContentFilter('Female')>>
<div class="interaction-btn" data-category="friendly">
<<button "💋 Take Solana up on her invitation">>
<<set $solana = Solana.recordSolanaDate(Solana.normalizeSolana($solana), getCurrentAbsoluteDay())>>
<<set $solanaDate = { gender: $player.gender(), clips: Solana.solanaDateClips($player.gender()) }>>
<<goto "SolanaDate">>
<</button>>
</div>
<</if>>
<</widget>>
/* Where the load goes, worded for who is cumming: the player, or the co-star in a threesome. */
<<widget "SolanaFinishLabel">>
<<set _hfl = _args[0]>>
<<if $solanaShoot.scene is "threesome">>
<<set _hflText = { facial: "Let him cum on both your faces", tits: "Let him cum on both your tits" }[_hfl]>>
<<else>>
<<set _hflText = { facial: "Cum on her face", mouth: "Cum in her mouth", tits: "Cum on her tits", pussy: "Cum inside her pussy", ass: "Cum in her ass", body: "Cum on her body" }[_hfl]>>
<</if>>
<</widget>><<nobr>>
<<include "UpdateAll">>
<<set _hlState = Solana.normalizeSolana($solana)>>
<<if not Solana.canShootWithSolana(_hlState, getCurrentAbsoluteDay())>>
<<goto "PornShooting">>
<<else>>
<div class="centre-text">On set with Solana Arrieta</div>
<<if not _hlState.met>>
<<ChatMessage 'The director waves over a woman scrolling her phone by the craft table: long black hair, big brown eyes, a cropped tee and a pair of tits it can barely hold.'>>
<<DrawImg `Solana.SOLANA_STILLS.clothed`>>
<<SolanaSay 'Solana Arrieta. You are the new one? Relax, I will make you look good on camera.'>>
<<else>>
<<ChatMessage 'Solana is already in makeup when you arrive. She blows you a kiss in the mirror.'>>
<<SolanaSay 'What are we shooting today?'>>
<</if>>
<<ChatMessage 'The director hands you the call sheet. Pick today\'s scene.'>>
<div class="btn-container padding-top">
<<for _hlScene range Solana.solanaScenesFor($player.gender())>>
<<set _hlLabel = _hlScene.label + " ($" + _hlScene.pay + ")">>
<<set _hlFilterOk = (_hlScene.id isnot "threesome" or CheckContentFilter('Male')) and (_hlScene.id isnot "laundromat" or CheckContentFilter('Shemale'))>>
<<if _hlFilterOk>>
<<capture _hlScene>>
<div class="btn"><<button _hlLabel>>
<<set $solana = Solana.recordSolanaShoot(Solana.normalizeSolana($solana), getCurrentAbsoluteDay())>>
<<set $solanaShoot = { scene: _hlScene.id, clips: Solana.solanaSceneClips(_hlScene), finish: "" }>>
<<SpendEnergy $player 30>>
<<goto "SolanaShoot_Scene">>
<</button>></div>
<</capture>>
<</if>>
<</for>>
<div class="btn"><<button "Not today" "PornShooting">><</button>></div>
</div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if not $solanaShoot or not Solana.solanaSceneAllowed($solanaShoot.scene, $player.gender())>>
<<goto "PornShooting">>
<<else>>
<<set _hs = Solana.solanaScene($solanaShoot.scene)>>
<<set _hsShemale = $player.gender() is "Shemale">>
<div class="centre-text"><<= _hs.label>></div>
<<if _hsShemale and _hs.id isnot "tease" and _hs.id isnot "laundromat">>
<<ChatMessage 'Solana looks you over, from your tits down to your hard cock, and licks her lips.'>>
<</if>>
<<switch _hs.id>>
<<case "tease">>
<<ChatMessage 'The director wants a solo tease to open her new set, with you just off camera. Solana peels her top up over her tits and pulls her panties aside to flash her pussy for the lens.'>>
<<EventMedia $solanaShoot.clips[0]>>
<<ChatMessage 'Then she lies back on the bed, spreads her legs and rubs her clit, two fingers sliding into her pussy until her thighs shake and she cums with her eyes on yours.'>>
<<EventMedia $solanaShoot.clips[1]>>
<<case "blowjob">>
<<ChatMessage 'Solana drops to her knees in front of you, spits on your cock and swallows it. She works you with both hands and her mouth, eyes up at the camera.'>>
<<EventMedia $solanaShoot.clips[0]>>
<<ChatMessage 'Then she grabs your hips and pulls you deeper until she gags, and keeps going, letting you fuck her throat while the camera moves in close.'>>
<<EventMedia $solanaShoot.clips[1]>>
<<case "titfuck">>
<<ChatMessage 'She oils her big tits until they shine, squeezes them together around your cock and bounces them up and down, licking the head every time it pops out between them.'>>
<<EventMedia $solanaShoot.clips[0]>>
<<case "footjob">>
<<ChatMessage 'She sits back on the couch, wraps her soles around your cock and strokes you with her feet, curling her toes around the head while she watches your face.'>>
<<EventMedia $solanaShoot.clips[0]>>
<<case "pussy">>
<<ChatMessage 'She warms you up with her mouth first, sucking your cock until it is dripping.'>>
<<EventMedia $solanaShoot.clips[0]>>
<<ChatMessage 'Then she pulls you onto the bed between her legs. You fuck her wet pussy on her back, then from behind with her face in the sheets, her big tits swinging with every thrust.'>>
<<EventMedia $solanaShoot.clips[1]>>
<<case "anal">>
<<ChatMessage 'She sucks you sloppy wet so you will slide in easy.'>>
<<EventMedia $solanaShoot.clips[0]>>
<<ChatMessage 'Then she gets on all fours and spreads her ass with both hands. You push your cock into her tight asshole inch by inch and fuck it hard while she reaches back and rubs her clit.'>>
<<EventMedia $solanaShoot.clips[1]>>
<<case "gangbang">>
/* The group clip shows Solana with three men: one under her mouth, one behind her, one in her hand. */
<<ChatMessage 'The director calls in two more guys. Solana kneels in the middle of the three of you, sucking one cock after another while hands grab her tits.'>>
<<ChatMessage 'Then she gets on all fours over one of you and sucks his cock while the second guy fucks her pussy from behind, and she jerks the third off with her free hand.'>>
<<EventMedia $solanaShoot.clips[0]>>
<<case "threesome">>
/* Every Solana clip here is her and the co-star alone, so the line before each clip
is only the two of them; what the player does goes in the lines between. */
<<ChatMessage 'The director pairs you two with a tall male co-star. He starts on Solana, groping her big tits and sucking on her nipples while she grinds against him.'>>
<<EventMedia $solanaShoot.clips[0]>>
<<ChatMessage 'Then he turns to you and does the same, while Solana kisses your neck.'>>
<<ChatMessage 'Solana drops to her knees first, spits on his cock and swallows it, working him with her mouth and both hands.'>>
<<EventMedia $solanaShoot.clips[1]>>
<<ChatMessage 'You kneel beside her and take turns on his cock, passing it between your mouths.'>>
<<ChatMessage 'He fucks Solana first, pounding her wet pussy while her big tits bounce.'>>
<<EventMedia $solanaShoot.clips[2]>>
<<if _hsShemale>>
<<ChatMessage 'Then he pulls out of her, bends you over the bed and fucks your ass, your cock bouncing under you with every thrust.'>>
<<SetAnalPick "Male" "Shemale">><<Video _pick>>
<<ChatMessage 'Solana watches from the pillows and keeps jerking your cock until he is done with you.'>>
<<else>>
<<ChatMessage 'Then he pulls out of her and slides his cock into your pussy, fucking you deep and slow.'>>
<<SetVagPick "Male" "Female">><<Video _pick>>
<<ChatMessage 'Solana crawls over to lick your tits and rub your clit, and the three of you end up tangled on the bed for the last shots of the set.'>>
/* The set stills show a second woman beside Solana: the female player only. */
<<DrawImg `Solana.SOLANA_SET_PHOTOS[random(0, Solana.SOLANA_SET_PHOTOS.length - 1)]`>>
<</if>>
<<case "laundromat">>
<<ChatMessage 'The scene is shot after hours in a coin laundromat. Solana, a few other girls and two trans actresses with big hard cocks pile onto the folding tables, and the strap-ons come out of the laundry bags.'>>
<<if _hsShemale>>
<<ChatMessage 'You fuck two of the girls over a washer, one after the other, then bend over the dryer yourself while one of the trans actresses fucks your ass and Solana sucks your cock.'>>
<<else>>
<<ChatMessage 'You get passed around the room: a strap-on in your pussy, a trans actress\'s cock in your mouth, Solana\'s tongue on your clit, until you lose count of who is fucking you.'>>
<</if>>
<<for _hsClip range $solanaShoot.clips>><<EventMedia _hsClip>><</for>>
<</switch>>
<<run $player.status.horny.increase(15)>>
<div class="btn-container padding-top">
<<if _hs.finishes.length gt 0>>
<<for _hsFinish range _hs.finishes>>
<<SolanaFinishLabel _hsFinish>>
<<capture _hsFinish>>
<div class="btn"><<button _hflText>><<set $solanaShoot.finish = _hsFinish>><<goto "SolanaShoot_Finish">><</button>></div>
<</capture>>
<</for>>
<<else>>
<div class="btn"><<button "That's a wrap" "SolanaShoot_End">><</button>></div>
<</if>>
</div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if not $solanaShoot or not $solanaShoot.finish or not Solana.solanaSceneAllowed($solanaShoot.scene, $player.gender())>>
<<goto "PornShooting">>
<<else>>
<<set _hf = $solanaShoot.finish>>
<<set _hfGang = $solanaShoot.scene is "gangbang">>
<<set _hfThree = $solanaShoot.scene is "threesome">>
<div class="centre-text">The money shot</div>
/* The finish clip is Solana with one man and the still is Solana alone. In the group
scenes the line before each shows only them; the rest of the cast gets the line between. */
<<set _hfClip = Solana.solanaFinishClip(_hf)>>
<<set _hfStill = Solana.SOLANA_FINISH_STILL[_hf]>>
<<if _hfThree>>
<<if _hf is "facial">>
<<ChatMessage 'He pulls out and jerks off over Solana first. His cum splashes across her cheeks and into her open mouth.'>>
<<EventMedia _hfClip>>
<<ChatMessage 'Then he turns to you and finishes across your face too, and Solana licks a stripe off your cheek and kisses you with it.'>>
<<ChatMessage 'She grins into the lens, his cum still dripping off her chin.'>>
<<else>>
<<ChatMessage 'He pulls out and cums across Solana\'s big tits first.'>>
<<EventMedia _hfClip>>
<<ChatMessage 'He saves the last of it for yours, and Solana leans over to lick it off your nipples for the close-up.'>>
<<ChatMessage 'Then she cups her own tits for the camera, glazed with his cum.'>>
<</if>>
<<DrawImg _hfStill>>
<<elseif _hfGang>>
<<if _hf is "facial">>
<<ChatMessage 'One of the guys pulls out first and jerks off over her face, his load splashing across her cheeks and her tongue.'>>
<<EventMedia _hfClip>>
<<ChatMessage 'The other two of you follow, one load after another, until it drips off her chin.'>>
<<ChatMessage 'Solana laughs with her eyes shut, her face glazed with cum.'>>
<<else>>
<<ChatMessage 'One of the guys pulls out first and cums all over her body.'>>
<<EventMedia _hfClip>>
<<ChatMessage 'The other two of you follow, glazing her tits, her belly and her pussy.'>>
<<ChatMessage 'Solana rubs the cum into her skin, smiling at the camera.'>>
<</if>>
<<DrawImg _hfStill>>
<<else>>
<<switch _hf>>
<<case "facial">>
<<ChatMessage 'You pull out and she opens her mouth wide while you jerk off over her face. Your cum splashes across her cheeks, her lips and her tongue, and she smiles up into the camera with it dripping off her chin.'>>
<<case "mouth">>
<<ChatMessage 'She wraps her lips around the head and sucks until you cum in her mouth. She shows the camera the load on her tongue, then swallows it.'>>
<<case "tits">>
<<ChatMessage 'You cum all over her big tits and she rubs it into her nipples for the close-up.'>>
<<case "pussy">>
<<ChatMessage 'You cum deep inside her pussy. She spreads herself for the camera and lets your cum run out of her.'>>
<<case "ass">>
<<ChatMessage 'You cum in her ass and pull out slowly. She arches her back so the camera can watch your cum leak from her asshole.'>>
<<default>>
<<ChatMessage 'You pull out and cum across her pussy and thighs, stroking the last drops out onto her skin.'>>
<</switch>>
<<EventMedia _hfClip>>
<<DrawImg _hfStill>>
<</if>>
<div class="btn padding-top"><<button "That's a wrap" "SolanaShoot_End">><</button>></div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if not $solanaShoot or not Solana.solanaSceneAllowed($solanaShoot.scene, $player.gender())>>
<<goto "PornShooting">>
<<else>>
<<set _he = Solana.solanaScene($solanaShoot.scene)>>
<div class="centre-text">That's a wrap</div>
<<SolanaSay 'You were great. Same time tomorrow?'>>
<<set _heLabel = "Collect your pay ($" + _he.pay + ")">>
<div class="btn padding-top"><<button _heLabel>>
<<set _heScene = Solana.solanaScene($solanaShoot.scene)>>
<<set $player.money += _heScene.pay>>
<<run gainSexExp($player, "exhibitionism", Random(2, 4))>>
<<run gainSexExp($player, "sexualKnowledge", Random(1, 3))>>
<<if $player.gender() is "Female">>
<<run gainSexExp($player, "oralSkill", Random(1, 2))>>
<<run gainSexExp($player, "vaginalSkill", Random(1, 3))>>
<<elseif $player.gender() is "Shemale" and _heScene.id is "threesome">>
<<run gainSexExp($player, "oralSkill", Random(1, 2))>>
<<run gainSexExp($player, "analSkill", Random(1, 3))>>
<<elseif _heScene.id isnot "tease">>
<<run gainSexExp($player, "penetrativeSkill", Random(2, 4))>>
<</if>>
<<if _heScene.finishes.length gt 0 or _heScene.id is "laundromat">>
<<run $player.status.horny.value = $player.status.horny.min>>
<<if $player.gender() isnot "Female" and _heScene.id isnot "threesome">><<run $player.status.potency.decrease(1)>><</if>>
<</if>>
<<if $player.attributes and $player.attributes.corruption and typeof $player.attributes.corruption.increase === "function">><<run $player.attributes.corruption.increase(1)>><</if>>
<<unset $solanaShoot>>
<<goto "PornShooting">>
<</button>></div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if not $solanaDate or not Array.isArray($solanaDate.clips) or $solanaDate.gender isnot $player.gender()>>
<<goto "PornShooting">>
<<else>>
<<SpendTime 180>>
<div class="centre-text">Solana's place</div>
<<ChatMessage 'Solana texts you her address and one word: "Tonight." Her apartment smells of vanilla. She opens the door in a red lace set and fishnet stockings and pulls you inside by your shirt.'>>
<<DrawImg `Solana.SOLANA_STILLS.underwear`>>
<<SolanaSay 'No cameras tonight. Just us.'>>
/* Solana.solanaDateClips: a man is on screen with her only in the male player's clips;
the female and shemale nights show Solana alone and tell the rest in prose. */
<<if $player.gender() is "Male">>
<<ChatMessage 'She kisses you against the wall, slow and deep, her tongue in your mouth and her hands already under your clothes.'>>
<<EventMedia $solanaDate.clips[0]>>
<<ChatMessage 'You unhook her bra and fill your hands with her big tits, sucking on her nipples until she moans and pushes you toward the bedroom.'>>
<<EventMedia $solanaDate.clips[1]>>
<<ChatMessage 'She kneels at the foot of the bed and sucks your cock, slow and messy, like she has all night.'>>
<<EventMedia $solanaDate.clips[2]>>
<<ChatMessage 'You end up in her shower, soaping her tits and her ass while she strokes your cock under the hot water.'>>
<<EventMedia $solanaDate.clips[3]>>
<<ChatMessage 'Back in bed she rides you, then rolls onto her back and pulls you on top. You fuck her slow and deep until you cum inside her, and she holds you there with her legs locked around you.'>>
<<EventMedia $solanaDate.clips[4]>>
<<EventMedia $solanaDate.clips[5]>>
<<run gainSexExp($player, "penetrativeSkill", Random(1, 3))>>
<<run $player.status.potency.decrease(1)>>
<<else>>
<<ChatMessage 'She kisses you against the wall, slow and deep, then sits you on the edge of her bed and gives you a show of your own: the bra comes off first, then she turns around and peels the lace down over her ass.'>>
<<EventMedia $solanaDate.clips[0]>>
<<if $player.gender() is "Shemale">>
<<ChatMessage 'She pushes your skirt up, finds your cock already hard and sucks it until you are begging, then climbs into your lap and grinds on it.'>>
<<ChatMessage 'Later you end up in her shower, soaping her tits while she strokes your cock under the hot water.'>>
<<EventMedia $solanaDate.clips[1]>>
<<ChatMessage 'Back in bed she rides your cock until you cum inside her, then lies back with her legs spread and rubs her clit for you until she cums too, your cum running out of her.'>>
<<EventMedia $solanaDate.clips[2]>>
<<run gainSexExp($player, "penetrativeSkill", Random(1, 3))>>
<<run $player.status.potency.decrease(1)>>
<<else>>
<<ChatMessage 'She pulls you down onto the sheets, slides her fingers into your pussy and sucks your nipples until you cum on her hand.'>>
<<ChatMessage 'Later you end up in her shower together, soaping each other\'s tits and kissing under the hot water.'>>
<<EventMedia $solanaDate.clips[1]>>
<<ChatMessage 'Back in bed she spreads her legs and plays with her pussy for you, then pulls your hand between your own thighs so you cum together, watching each other.'>>
<<EventMedia $solanaDate.clips[2]>>
<<run gainSexExp($player, "sexualKnowledge", Random(1, 2))>>
<</if>>
<</if>>
<<run $player.status.horny.value = $player.status.horny.min>>
<<ChatMessage 'She falls asleep on your chest. In the morning she kisses you goodbye at the door, wearing nothing but your shirt.'>>
<div class="btn padding-top"><<button "Head out">><<unset $solanaDate>><<LeaveInteractionSettings>><<goto $player.info.currentLocation>><</button>></div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set $canShowStatsBtn = false>>
<<set $gameSettings.allowSaves = false>>
<<run $player.characterEvents.registerEvent($player.info.id, "ClayQuest1", 1)>>
<<if $clayFightWon == true>>
<<ChatMessage 'After your win, Clay struggles to his feet.'>>
<<Chat $interactionNpc 'Damn, you fight good - you kicked my ass. But don\'t get cocky; next time, I\'ll be ready.'>>
<<Chat $player 'Next time, I\'ll kick your ass again.'>>
<<Chat $interactionNpc 'Keep dreaming. Alright, I\'m hitting the shower. Wanna join or wait?'>>
<<else>>
<<ChatMessage 'After your loss, you struggle to your feet, rubbing your bruises.'>>
<<Chat $interactionNpc 'Ha, you held your own, but I told you-don\'t underestimate me. Next time, try not to zone out, okay? I almost felt bad.'>>
<<Chat $player 'Next time, I\'ll put you down, no doubt.'>>
<<Chat $interactionNpc 'Whoa, spirit\'s still fired up? Cool. Alright, I\'m hitting the shower. Wanna join or wait?'>>
<</if>>
<div class="btn padding-top"><<button "Yeah, why not." "Clay_Quest1_ShowerYes">><</button>></div>
<div class="btn padding-top"><<button "Nah, I'll wait." "Clay_Quest1_ShowerNo">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ChatMessage 'You head into the locker room with Clay.'>>
<<Chat $player 'Tell me about yourself'>>
<<Chat $interactionNpc 'Been in this shit since I was a kid. My old man made me steal-stores, houses. I was his little shadow, thought it was normal.'>>
<<ChatMessage 'You strip down and step inside.'>>
<<ChatMessage 'You strip down and hit the shower with Clay.'>>
<<Chat $interactionNpc 'You\'ve got a nice body; looks like you train a lot.'>>
<<Chat $player 'Yeah, I\'m aiming to be the champ in street fights.'>>
<<Chat $interactionNpc 'You\'re a real dreamer, huh? You got any idea what kinda monsters are waiting at the tournament?'>>
<div class="btn padding-top"><<button "Joke." "Clay_Quest1_Joke">><</button>></div>
<div class="btn padding-top"><<button "Flirt." "Clay_Quest1_Flirt">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<div class="btn padding-top"><<button "Continue" "Underground_Fight_Gym">>
<<if $player.characterEvents.isEventRegistered($player.info.id, "GetClayApproval") == false>>
<<run $player.characterEvents.registerEvent($player.info.id, "GetClayApproval", 1)>>
<<set $ApprovalReceived += 1>>
<<DeleteCharacter $interactionNpc>>
<</if>>
<<set $ClayStoryProgress = 1>>
<<set $canShowStatsBtn = true>>
<<set $gameSettings.allowSaves = true>>
<</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if $clayFightWon == true>>
<<Chat $player 'Ha, monsters? I thought you were the big bad of the gym. But if I become champ, I\'ll make you my personal towel - wiping my back after every win.'>>
<<Chat $interactionNpc '*Laughs, splashing water* Whoa, cocky bastard! Alright, jokes aside, don\'t slack off. I\'ve seen guys like you break on the first tournament. Dry off and let\'s go. Next time - bar after training. We\'ll see who kicks whose ass there.'>>
<<ChatMessage 'You step out of the shower, get dressed.'>>
<<else>>
<<Chat $player 'Monsters? After you laid me out today, I think you\'re the final boss. But if I become champ, I\'ll make you my personal towel - wiping my back after every win.'>>
<<Chat $interactionNpc '*Laughs, splashing water* "Whoa, still joking after a loss? Alright, jokes aside - seriously, don\'t slack off. I\'ve seen guys like you break on the first tournament. Dry off and let\'s go. Next time - bar after training. We\'ll see who kicks whose ass there."'>>
<</if>>
<div class="btn padding-top"><<button "Continue" "Underground_Fight_Gym">>
<<if $player.characterEvents.isEventRegistered($player.info.id, "GetClayApproval") == false>>
<<run $player.characterEvents.registerEvent($player.info.id, "GetClayApproval", 1)>>
<<set $ApprovalReceived += 1>>
<<DeleteCharacter $interactionNpc>>
<</if>>
<<set $ClayStoryProgress = 1>>
<<set $canShowStatsBtn = true>>
<<set $gameSettings.allowSaves = true>>
<</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if $clayFightWon == true>>
<<Chat $player 'Monsters? Showering with you already feels like stepping into a beast\'s lair, all steamy and dangerous. After kicking your ass... maybe I deserve a hot reward to celebrate?'>>
<<Chat $interactionNpc '*Grins wickedly, stepping in close, water dripping from his messy hair and down his ripped chest* A reward, huh? After you owned me out there... fuck yeah, that\'s only fair. Let me handle that throbbing tension for you-gonna make you feel real good.'>>
<<if $player.gender() == 'Male' || $player.gender() == 'Shemale'>>
<<if CheckContentFilter('Male')>><<Video "Media\\Sex\\Quest\\FightClub\\Clay\\Quest1\\handjob_m.mp4">><</if>>
<<ChatMessage 'Clay drops to his knees with a hungry look, his rough hand gliding over your slick skin, fingers wrapping tight around your hardening cock, stroking with confident, teasing squeezes. Water cascades over you both, hot and relentless, drowning out your low groans as his grip pumps slow and deliberate, his breath scorching against your thigh. His hand speeds up, slick and urgent, bodies pressing together in the steam, your hips bucking into his fist until the orgasm hits like a knockout punch, waves of cum spilling out and washing away under the spray.'>>
<<elseif $player.gender() == 'Female'>>
<<if CheckContentFilter('Male')>><<Video "Media\\Sex\\Quest\\FightClub\\Clay\\Quest1\\fing_f.mp4">><</if>>
<<ChatMessage 'Clay presses you against the tiled wall with a predatory gleam, his strong hand sliding between your thighs, fingers dipping into your slick folds, rubbing your swollen clit with firm, circling pressure. Water pounds down hot and heavy, muffling your gasps as he strokes you teasingly slow at first, his breath ragged and hot against your neck. His fingers dive deeper, pumping and curling inside your wet pussy while his thumb grinds your clit, bodies grinding close in the mist, your legs shaking until the orgasm crashes over you like a tidal wave, your juices mixing with the shower spray.'>>
<</if>>
<<Chat $interactionNpc 'Whew, that... was fuckin\' intense and hot as hell. You\'re a beast - not just in the ring. Next time - bar after training. We can keep this... conversation going.'>>
<<else>>
<<if $player.gender() == 'Male'>>
<<if CheckContentFilter('Male')>><<Video "Media\\Sex\\Quest\\FightClub\\Clay\\Quest1\\handjob_m.mp4">><</if>>
<<else>>
<<if CheckContentFilter('Male')>><<Video "Media\\Sex\\Quest\\FightClub\\Clay\\Quest1\\handjob_f_s.mp4">><</if>>
<</if>>
<<Chat $player 'Monsters? After you owned me in the ring, it feels like I\'m trapped in a beast\'s lair, all wet and wild. Maybe after your win... you deserve a dirty reward? Let me take care of that bulging tension for you.'>>
<<Chat $interactionNpc '*Grins wickedly, stepping in close, water dripping from his messy hair and down his ripped chest* A reward, huh? After pinning you down... hell yeah, that\'s fair. Show me what a loser\'s got-make it count.'>>
<<ChatMessage 'You drop to your knees with eager heat, your hand sliding over his taut skin, fingers curling firm around his thick, pulsing cock, stroking with bold, teasing twists. Water pounds down, steamy and loud, muffling his deep grunts as you pump him slow and rhythmic, your breath hot and ragged near his hip.'>>
<<ChatMessage 'Your hand flies faster, slick and demanding, bodies grinding close in the haze, his thrusts meeting your grip until the orgasm explodes like a finisher, hot spurts of cum erupting and swirling away in the drain.'>>
<<Chat $interactionNpc 'Whew, that... was fuckin\' intense and hot as hell. You\'re a beast - not just in the ring. Next time - bar after training. We can keep this... conversation going.'>>
<</if>>
<div class="btn padding-top"><<button "Continue" "Underground_Fight_Gym">>
<<if $player.characterEvents.isEventRegistered($player.info.id, "GetClayApproval") == false>>
<<run $player.characterEvents.registerEvent($player.info.id, "GetClayApproval", 1)>>
<<set $ApprovalReceived += 1>>
<<DeleteCharacter $interactionNpc>>
<</if>>
<<set $ClayStoryProgress = 1>>
<<set $canShowStatsBtn = true>>
<<set $gameSettings.allowSaves = true>>
<</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _clayHarper = "Media\\Characters\\QuestChars\\UFG\\Clay Harper.jpg">>
<<SetBackground "Media/Locations/City/EntertainmentDistrict/Bar.jpg">>
<<ChatMessage "Noisy bar near the training gym. Clay invites you after workout - just to chill. The place is smoky, music blasting, folks crowding the bar. You grab a table, Clay orders a couple beers. Conversation flows easy.">>
<<ChatWithoutNPC 'Clay Harper' _clayHarper "Glad you showed up. Beer after training-best damn medicine. Cheers to health, or to not ending up in the slammer like my old man.">>
<<Chat $player "Tell me about that time. You mentioned your dad...">>
<<ChatWithoutNPC 'Clay Harper' _clayHarper "Yeah, when I hit my teens, they finally locked him up. Big heist - cops caught him red-handed. Left me alone, no cash. What’s a kid gonna do? Kept doing what I knew: stealing, picking locks. Only way not to starve. Heart pounding like a drum every time, thinking: \"This is my life now, no way out.\" But the streets teach quick - you or them. What about you? What drives you into these fights?">>
<div class="btn padding-top"><<button "\"Adrenaline\". Life ain't sweet, gotta survive." "Clay_Quest2_BarThugs">><</button>></div>
<div class="btn padding-top"><<button "\"Proving myself\". Life ain't sweet, gotta survive." "Clay_Quest2_BarThugs">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _clayHarper = "Media\\Characters\\QuestChars\\UFG\\Clay Harper.jpg">>
<<set _thug2 = "Media\\Characters\\QuestChars\\UFG\\thug2.jpg">>
<<include "CharactersData">>
<<ChatMessage "Two drunk thugs stomp up to your table, one shoves Clay's shoulder, the other grins in your face.">>
<<run _thug1 = CreateCharacter({isPlayer:false, characterWork: "Drunk thug 1", gender:"Male", sexualPreference:"Bi", clothesPreference:"men", firstName:"Thug 1", lastName:"", skin:'White', age:30, defense:3, agility:2, strength:4, isQuestCharacter:true, questCharID:14, currentQuestID:0, currentCharImg:"Media\\Characters\\QuestChars\\UFG\\thug1.jpg"}, true)>>
<<unset $maleNames $femaleNames $surnames>>
<<set $indexNPC = $Characters.indexOf(_thug1)>>
<<set $interactionNpc = $Characters[$indexNPC]>>
<<run $player.characterEvents.registerEvent(_thug1.info.id, "knows you", 1)>>
<<ChatWithoutNPC 'Thug 1' _thug1.getPhotoImage() "Hey, assholes, this is our spot. Beat it before we break you.">>
<<ChatWithoutNPC 'Thug 2' _thug2 "Yeah, or we'll smear you on the wall.">>
<<ChatWithoutNPC 'Clay Harper' _clayHarper "*Standing up* Shut your trap, idiot. We're not looking for trouble, but if you want it-bring it.">>
<div class="btn padding-top"><<button "Fight" >>
<<set _battleSetControls = {attack: true, seduce: false, items: false, actions: true}>>
<<StartFight $player $interactionNpc _battleSetControls 'Clay_Quest2_FirstWin' 'Clay_Quest2_FirstLose'>>
<</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<DeleteCharacter $interactionNpc>>
<<set _clayHarper = "Media\\Characters\\QuestChars\\UFG\\Clay Harper.jpg">>
<<ChatMessage "Your opponent floors you, but Clay finishes his quick and switches to yours, elbowing him out cold. Bar goes quiet, thugs down, bartender yelling to get out.">>
<<ChatWithoutNPC 'Clay Harper' _clayHarper "*Extending a hand, helping you up* Shit, you okay? Those bastards ain't worth your time. I laid 'em out-for both of us.">>
<div class="btn padding-top"><<button "Thank him." "Clay_Quest2_FirstLose_Thank">><</button>></div>
<div class="btn padding-top"><<button "Flirt." "Clay_Quest2_FirstLose_Flirt">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _clayHarper = "Media\\Characters\\QuestChars\\UFG\\Clay Harper.jpg">>
<<Chat $player "Thanks, Clay. You saved the day.">>
<<ChatWithoutNPC 'Clay Harper' _clayHarper "No sweat. Streets taught me: one for all. Let's grab another round and bail.">>
<div class="btn padding-top"><<button "Continue" "Underground_Fight_Gym">>
<<set $ClayStoryProgress = 2>>
<<set $canShowStatsBtn = true>>
<<set $gameSettings.allowSaves = true>>
<</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _clayHarper = "Media\\Characters\\QuestChars\\UFG\\Clay Harper.jpg">>
<<Chat $player "Whoa, you're like a damn superhero. After that... I wanna thank you for real. Maybe the bathroom, before the bar snaps out of it?">>
<<ChatWithoutNPC 'Clay Harper' _clayHarper "*Grinning wide, eyes lighting up with heat* Thank me? Sounds tempting as hell. Follow my lead, don't lag.">>
<<ChatMessage "Door locked, Clay pins you against the wall, his breath heavy from the fight, body radiating raw power and sweat. You drop to your knees, fumbling with his zipper, feeling his cock twitch and harden under your touch from the adrenaline surge.">>
<<ChatWithoutNPC 'Clay Harper' _clayHarper "*Whispering hoarsely, gripping your hair* Yeah... just like that. Deeper.">>
<<if $player.gender() == 'Male'>>
<<if CheckContentFilter('Male')>><<Video "Media\\Sex\\Quest\\FightClub\\Clay\\Quest2\\blowjob_m.mp4">><</if>>
<<else>>
<<if CheckContentFilter('Male')>><<Video "Media\\Sex\\Quest\\FightClub\\Clay\\Quest2\\blowjob_f_s.mp4">><</if>>
<</if>>
<<ChatMessage "Blowjob in the cramped stall, his thick shaft sliding past your lips as you bob rhythmically, tongue swirling around the head while your hands stroke his balls and squeeze his ass, pulling him deeper. His moans echo off the tiles, hips thrusting with building urgency, the risk of getting caught spiking the thrill like electricity-sweat mixing with saliva until he unloads with a guttural groan, hot spurts filling your mouth as you swallow greedily, your eyes locked on his in wicked satisfaction.">>
<<ChatWithoutNPC 'Clay Harper' _clayHarper "Whew, you... you're dangerous.">>
<div class="btn padding-top"><<button "Continue" "Underground_Fight_Gym">>
<<set $ClayStoryProgress = 2>>
<<set $canShowStatsBtn = true>>
<<set $gameSettings.allowSaves = true>>
<</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<DeleteCharacter $interactionNpc>>
<<set _clayHarper = "Media\\Characters\\QuestChars\\UFG\\Clay Harper.jpg">>
<<ChatMessage "You drop your opponent, but Clay takes a hit and goes down. Your guy's out, but Clay's thug jumps you. Now it's one-on-one with him.">>
<<include "CharactersData">>
<<run _thug2 = CreateCharacter({isPlayer:false, characterWork:"Drunk thug 2", gender:"Male", sexualPreference:"Bi", clothesPreference:"men", firstName:"Thug 2", lastName:"", skin:'White', age:30, defense:3, agility:2, strength:4, isQuestCharacter:true, questCharID:15, currentQuestID:0, currentCharImg:""}, true)>>
<<unset $maleNames $femaleNames $surnames>>
<<set $indexNPC = $Characters.indexOf(_thug2)>>
<<set $interactionNpc = $Characters[$indexNPC]>>
<div class="btn padding-top"><<button "Fight" >>
<<set _battleSetControls = {attack: true, seduce: false, items: false, actions: true}>>
<<StartFight $player $interactionNpc _battleSetControls 'Clay_Quest2_SecondWin' 'Clay_Quest2_SecondLose'>>
<</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<DeleteCharacter $interactionNpc>>
<<set _clayHarper = "Media\\Characters\\QuestChars\\UFG\\Clay Harper.jpg">>
<<ChatMessage "You knock him out, help Clay up. Bar claps, but bartender kicks you out.">>
<<ChatWithoutNPC 'Clay Harper' _clayHarper "*Rubbing his jaw* Damn, you covered my ass. Those pricks almost broke me. You're a machine.">>
<div class="btn padding-top"><<button "Joke." "Clay_Quest2_SecondWin_Joke">><</button>></div>
<div class="btn padding-top"><<button "Flirt." "Clay_Quest2_SecondWin_Flirt">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _clayHarper = "Media\\Characters\\QuestChars\\UFG\\Clay Harper.jpg">>
<<Chat $player "Ha, don't zone out next time. You owe me a beer for saving your butt.">>
<<ChatWithoutNPC 'Clay Harper' _clayHarper "*Laughs* Deal. Streets teach: sometimes you lean on others. Let's drink and dip.">>
<div class="btn padding-top"><<button "Continue" "Underground_Fight_Gym">>
<<set $ClayStoryProgress = 2>>
<<set $canShowStatsBtn = true>>
<<set $gameSettings.allowSaves = true>>
<</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _clayHarper = "Media\\Characters\\QuestChars\\UFG\\Clay Harper.jpg">>
<<Chat $player "After that win... I need to unwind. Bathroom? You owe me... a favor.">>
<<ChatWithoutNPC 'Clay Harper' _clayHarper "*Eyes darkening with lust* A favor? After you bailed me out... yeah, that's fair play. Come on, I'll show you what I can do.">>
<<ChatMessage "Door bolted, Clay drops to his knees, hands roaming your thighs hungrily, yanking down your pants with eager tugs.">>
<<if $player.gender() == 'Male'>>
<<if CheckContentFilter('Male')>><<Video "Media\\Sex\\Quest\\FightClub\\Clay\\Quest2\\blowjob_m.mp4">><</if>>
<<elseif $player.gender() == 'Shemale'>>
<<if CheckContentFilter('Male')>><<Video "Media\\Sex\\Quest\\FightClub\\Clay\\Quest2\\blowjob_s.mp4">><</if>>
<<else>>
<<if CheckContentFilter('Male')>><<Video "Media\\Sex\\Quest\\FightClub\\Clay\\Quest2\\lick_m.mp4">><</if>>
<</if>>
<<if $player.gender() == 'Male' || $player.gender() == 'Shemale'>>
<<ChatWithoutNPC 'Clay Harper' _clayHarper "*Whispering raggedly* Fuck... so hard for me. Hold on.">>
<<ChatMessage "Blowjob in the tight stall, his lips stretching around your throbbing shaft as he bobs with sloppy enthusiasm, hand pumping the base while his free fingers tease your balls and trace your inner thighs. Your moans mix with the bar noise outside, hips bucking into his eager throat, the forbidden vibe amping the heat until you explode down his throat, him swallowing every drop with a satisfied hum, his tongue lingering to milk you dry.">>
<<elseif $player.gender() == 'Female'>>
<<ChatWithoutNPC 'Clay Harper' _clayHarper "*Whispering raggedly* So wet already... grind on me.">>
<<ChatMessage "Cunnilingus in the tight stall, his tongue thrusting into your dripping folds, swirling around your swollen clit with hungry laps while fingers plunge inside, curling to hit your spots and spreading you wider. Your moans mix with the bar noise outside, hips grinding against his stubbled jaw, the rush of secrecy fueling the fire until you cum hard, juices flooding his mouth as he laps it all up greedily, his hands gripping your ass to hold you steady through the shudders.">>
<</if>>
<<ChatWithoutNPC 'Clay Harper' _clayHarper "Mmm, tasty. You get me going.">>
<div class="btn padding-top"><<button "Continue" "Underground_Fight_Gym">>
<<set $ClayStoryProgress = 2>>
<<set $canShowStatsBtn = true>>
<<set $gameSettings.allowSaves = true>>
<</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<DeleteCharacter $interactionNpc>>
<<set _clayHarper = "Media\\Characters\\QuestChars\\UFG\\Clay Harper.jpg">>
<<ChatMessage "The second thug slaps you and bolts, spotting the bartender calling cops. Clay gets up, you both laugh it off, brushing dirt away.">>
<<ChatWithoutNPC 'Clay Harper' _clayHarper "Ha, those cowards ran! You tried, that's what counts. Streets are a gamble-sometimes you lose, but you live.">>
<<Chat $player "*Laughing* Next time, bring backup.">>
<<ChatWithoutNPC 'Clay Harper' _clayHarper "For sure. Cheers to a draw and let's bounce.">>
<div class="btn padding-top"><<button "Continue" "Underground_Fight_Gym">>
<<set $ClayStoryProgress = 2>>
<<set $canShowStatsBtn = true>>
<<set $gameSettings.allowSaves = true>>
<</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _clayHarper = "Media\\Characters\\QuestChars\\UFG\\Clay Harper.jpg">>
<<run $player.characterEvents.registerEvent($player.info.id, "ClayQuest3", 1)>>
<<ChatMessage "You approach Clay in the bustling gym. He’s wiping sweat from his brow, muscles taut from a recent workout. His eyes flicker with a distant thought, but a sly grin spreads when he notices you.">>
<<ChatWithoutNPC 'Clay Harper' _clayHarper "Hey, good to see you. I’ve got a wild idea-sneak into that locked pool across the street tonight. Just us, the water, and the quiet. It’s risky, but the thrill’s worth it. You in, or you chickening out?">>
<<Chat $player "Count me in. Sounds like a rush.">>
<<ChatWithoutNPC 'Clay Harper' _clayHarper "Hell yeah. Let’s do this.">>
<div class="btn padding-top"><<button "Continue" "Clay_Quest3_Pool">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _clayHarper = "Media\\Characters\\QuestChars\\UFG\\Clay Harper.jpg">>
<<SetBackground "Media/Locations/Other/UFG/pool.jpg">>
<<ChatMessage "You and Clay scale a chain-link fence, your movements quick and silent. The cool night air brushes your skin as you both strip down to minimal clothing, leaving piles of clothes by the edge. You dive in, the water crisp and enveloping. Your bodies catch the moonlight, glimmering with each stroke. You swim close, whispering to avoid detection, laughter soft but charged with excitement.">>
<<ChatWithoutNPC 'Clay Harper' _clayHarper "Damn, this is perfect. No crowds - just our own private ocean. And you… you’re looking way too good under that moonlight. This adrenaline’s got me wired, you feeling it?">>
<<ChatMessage "Suddenly, a harsh flashlight beam cuts through the darkness. A guard storms toward the pool, his face red with anger, baton raised threateningly.">>
<<set _guard = "Media\\Characters\\QuestChars\\UFG\\pool_guard.jpg">>
<<ChatWithoutNPC 'Guard' _guard "Hey! What the hell are you doing here? This is private property! I’m calling the cops - or I’ll handle you myself!">>
<<ChatWithoutNPC 'Clay Harper' _clayHarper "*whispering, eyes darting to you* Shit. What’s the move? You take him, or let me handle it?">>
<div class="btn padding-top"><<button "Take on the guard yourself." "Clay_Quest3_Option1_Fight">><</button>></div>
<div class="btn padding-top"><<button "Let Clay handle it." "Clay_Quest3_Option2">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _clayHarper = "Media\\Characters\\QuestChars\\UFG\\Clay Harper.jpg">>
<<ChatMessage "You leap from the pool, water streaming off your body in glistening trails. The tiles are slick underfoot, each step a risk as you charge the guard. The fight is chaotic, your movements fueled by adrenaline.">>
<<include "CharactersData">>
<<run _guardCharacter = CreateCharacter({isPlayer:false, characterWork:"Pool guard", gender:"Male", sexualPreference:"Bi", clothesPreference:"men", firstName:"Guard", lastName:"", skin:'White', age:30, defense:4, agility:2, strength:4, isQuestCharacter:true, questCharID:16, currentQuestID:0, currentCharImg:"Media\\Characters\\QuestChars\\UFG\\pool_guard.jpg"}, true)>>
<<unset $maleNames $femaleNames $surnames>>
<<set $indexNPC = $Characters.indexOf(_guardCharacter)>>
<<set $interactionNpc = $Characters[$indexNPC]>>
<<set _battleSetControls = {attack: true, seduce: false, items: false, actions: true}>>
<<StartFight $player $interactionNpc _battleSetControls 'Clay_Quest3_Option1_Win' 'Clay_Quest3_Option1_Lose'>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<DeleteCharacter $interactionNpc>>
<<set _clayHarper = "Media\\Characters\\QuestChars\\UFG\\Clay Harper.jpg">>
<<ChatMessage "The guard crumples to the ground, muttering curses. He scrambles to his feet and flees, shouting about backup. Clay climbs out of the pool, his wet skin catching the moonlight, eyes wide with admiration and a spark of something hotter.">>
<<ChatWithoutNPC 'Clay Harper' _clayHarper "Holy shit, you dropped him! Like a damn pro. My heart’s pounding after that, and you… you’re looking like trouble. You as amped up as I am?">>
<div class="btn padding-top"><<button "Joke it off." "Clay_Quest3_Option1_Win_Joke">><</button>></div>
<div class="btn padding-top"><<button "Flirt." "Clay_Quest3_Option1_Win_Flirt">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _clayHarper = "Media\\Characters\\QuestChars\\UFG\\Clay Harper.jpg">>
<<Chat $player "Next time, I’m bringing a towel-fighting in wet underwear isn’t my vibe. Let’s get outta here before they bring an army.">>
<<ChatWithoutNPC 'Clay Harper' _clayHarper "*laughing, shaking his head* Hero in skivvies, huh? Alright, let’s bolt. That was epic.">>
<div class="btn padding-top"><<button "Continue" "Underground_Fight_Gym">>
<<set $ClayStoryProgress = 3>>
<<if $player.characterEvents.isEventRegistered($player.info.id, "GetClayApproval") == false>>
<<run $player.characterEvents.registerEvent($player.info.id, "GetClayApproval", 1)>>
<<set $ApprovalReceived += 1>>
<</if>>
<<set $canShowStatsBtn = true>>
<<set $gameSettings.allowSaves = true>>
<</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _clayHarper = "Media\\Characters\\QuestChars\\UFG\\Clay Harper.jpg">>
<<Chat $player "That win’s got my blood racing. Wanna celebrate… in the storage room? I can tell you’re ready.">>
<<ChatWithoutNPC 'Clay Harper' _clayHarper "*breath catching, a slow grin spreading* Celebrate? With you? Fuck, I’m in. Let’s move before that guard gets his shit together.">>
<<ChatMessage "The door clicks shut, sealing you in. The air is thick with the scent of chlorine and damp heat. You push Clay against the rough concrete wall, his skin slick and warm under your hands.">>
<<if $player.gender() == 'Male'>>
<<if CheckContentFilter('Male')>><<Video "Media\\Sex\\Quest\\FightClub\\Clay\\Quest3\\sex_m.mp4">><</if>>
<<elseif $player.gender() == 'Shemale'>>
<<if CheckContentFilter('Male')>><<Video "Media\\Sex\\Quest\\FightClub\\Clay\\Quest3\\anal_s.mp4">><</if>>
<<else>>
<<if CheckContentFilter('Male')>><<Video "Media\\Sex\\Quest\\FightClub\\Clay\\Quest3\\sex_f.mp4">><</if>>
<</if>>
<<if $player.gender() == 'Male' || $player.gender() == 'Shemale'>>
<<ChatMessage "Your fingers dig into his hips, pulling him close. You guide yourself into him, slow and deliberate, feeling his body tense then yield. His low groan vibrates through you, a mix of pleasure and surrender. Your rhythm builds, each thrust steady, his moans growing louder in the tight space.">>
<<elseif $player.gender() == 'Female'>>
<<ChatMessage "Clay’s hands trace your curves, lingering on your waist before pulling you closer. He enters you with a firm, hungry thrust, his movements blending urgency with care. The slick slide of your bodies heightens every sensation, his breath hot against your neck as he drives deeper.">>
<</if>>
<<ChatWithoutNPC 'Clay Harper' _clayHarper "*voice rough, whispering* Fuck… take me deeper/feel me inside you. You’re setting me on fire… don’t stop.">>
<<ChatMessage "Your bodies moving in sync, slick with pool water and sweat. The cramped room amplifies every sound - his ragged breaths, your soft gasps, the faint slap of skin. His hands grip you tightly, grounding you as the tension builds. The climax crashes over you both, a shared wave of release that leaves you trembling, pressed close, hearts pounding.">>
<<ChatWithoutNPC 'Clay Harper' _clayHarper "*panting, a soft laugh* Shit… that was unreal. You’re gonna ruin me, and I’m not even mad about it.">>
<div class="btn padding-top"><<button "Continue" "Underground_Fight_Gym">>
<<set $ClayStoryProgress = 3>>
<<if $player.characterEvents.isEventRegistered($player.info.id, "GetClayApproval") == false>>
<<run $player.characterEvents.registerEvent($player.info.id, "GetClayApproval", 1)>>
<<set $ApprovalReceived += 1>>
<</if>>
<<set $canShowStatsBtn = true>>
<<set $gameSettings.allowSaves = true>>
<</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<DeleteCharacter $interactionNpc>>
<<set _clayHarper = "Media\\Characters\\QuestChars\\UFG\\Clay Harper.jpg">>
<<ChatMessage "The guard shoves you back, pain flaring as you hit the slick tiles. Before he can strike again, Clay vaults from the pool, water sluicing off his frame. He lands a sharp jab to the guard’s jaw, sending him sprawling. The guard flees, and Clay pulls you to your feet, his touch steady but his eyes burning with adrenaline.">>
<<ChatWithoutNPC 'Clay Harper' _clayHarper "You okay? I handled him. Fighting bare-assed isn’t my usual, but damn, I’m still buzzing. You feeling that rush too?">>
<div class="btn padding-top"><<button "Joke it off." "Clay_Quest3_Option1_Lose_Joke">><</button>></div>
<div class="btn padding-top"><<button "Flirt." "Clay_Quest3_Option1_Lose_Flirt">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _clayHarper = "Media\\Characters\\QuestChars\\UFG\\Clay Harper.jpg">>
<<Chat $player "Next time, I’m wearing armor under my swimsuit. Let’s move before we’re busted.">>
<<ChatWithoutNPC 'Clay Harper' _clayHarper "*grinning* Armor? You’re already a beast. Let’s roll.">>
<div class="btn padding-top"><<button "Continue" "Underground_Fight_Gym">>
<<set $ClayStoryProgress = 3>>
<<if $player.characterEvents.isEventRegistered($player.info.id, "GetClayApproval") == false>>
<<run $player.characterEvents.registerEvent($player.info.id, "GetClayApproval", 1)>>
<<set $ApprovalReceived += 1>>
<</if>>
<<set $canShowStatsBtn = true>>
<<set $gameSettings.allowSaves = true>>
<</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _clayHarper = "Media\\Characters\\QuestChars\\UFG\\Clay Harper.jpg">>
<<Chat $player "You saved my ass… I wanna thank you properly. Storage room? I’m all yours.">>
<<ChatWithoutNPC 'Clay Harper' _clayHarper "*eyes smoldering, a predatory edge to his grin* Thank me? Oh, I’m not saying no to that. Get over here.">>
<<ChatMessage "Clay backs you against the rough concrete wall, his hands firm on your shoulders, his body radiating dominance. Your skin, still slick from the pool, presses against his as he closes the distance, his gaze intense.">>
<<if $player.gender() == 'Male'>>
<<if CheckContentFilter('Male')>><<Video "Media\\Sex\\Quest\\FightClub\\Clay\\Quest3\\sex_m.mp4">><</if>>
<<elseif $player.gender() == 'Shemale'>>
<<if CheckContentFilter('Male')>><<Video "Media\\Sex\\Quest\\FightClub\\Clay\\Quest3\\sex_s.mp4">><</if>>
<<else>>
<<if CheckContentFilter('Male')>><<Video "Media\\Sex\\Quest\\FightClub\\Clay\\Quest3\\sex_f.mp4">><</if>>
<</if>>
<<if $player.gender() == 'Male' || $player.gender() == 'Shemale'>>
<<ChatMessage "Clay’s hands grip your hips, his touch commanding yet careful. He guides himself into you with a slow, deliberate thrust, drawing a sharp gasp from your lips. His movements are steady, each push deep and controlled, his breath hot against your ear as he leans in, overwhelming your senses.">>
<<elseif $player.gender() == 'Female'>>
<<ChatMessage "Clay’s fingers trace your curves, lingering on your waist before pulling you flush against him. He enters you with a firm, hungry thrust, his rhythm blending urgency with tenderness. The slickness of your bodies amplifies every sensation, his lips grazing your neck as he drives deeper.">>
<</if>>
<<ChatWithoutNPC 'Clay Harper' _clayHarper "*voice low, growling* Feel me… you’re mine right now. You’re driving me fucking wild.">>
<<ChatMessage "Your bodies intertwined, slick with water and sweat. The cramped room traps every sound - his low groans, your sharp gasps, the rhythmic creak of the wall behind you. His hands anchor you, one sliding to your hip, the other tangling in your hair as he pushes you both toward the edge. The climax hits hard, a mutual surge that leaves you gasping, clinging to him in the afterglow, your bodies pressed close, hearts racing.">>
<<ChatWithoutNPC 'Clay Harper' _clayHarper "*breathless, smirking softly* Fuck… you’re my new weakness. Don’t think I’m letting you go easy after that.">>
<div class="btn padding-top"><<button "Continue" "Underground_Fight_Gym">>
<<set $ClayStoryProgress = 3>>
<<if $player.characterEvents.isEventRegistered($player.info.id, "GetClayApproval") == false>>
<<run $player.characterEvents.registerEvent($player.info.id, "GetClayApproval", 1)>>
<<set $ApprovalReceived += 1>>
<</if>>
<<set $canShowStatsBtn = true>>
<<set $gameSettings.allowSaves = true>>
<</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _clayHarper = "Media\\Characters\\QuestChars\\UFG\\Clay Harper.jpg">>
<<ChatMessage "Clay surges from the pool, muscles flexing under the moonlight. He moves with brutal precision, taking down the guard with a series of swift strikes. The guard bolts into the night. Clay helps you out of the pool, his grin cocky but warm, water dripping from his frame.">>
<<ChatWithoutNPC 'Clay Harper' _clayHarper "Done and dusted. Knew I could take him-old habits die hard. But damn, my body’s screaming for more action. Yours too?">>
<div class="btn padding-top"><<button "Joke it off." "Clay_Quest3_Option2_Joke">><</button>></div>
<div class="btn padding-top"><<button "Flirt." "Clay_Quest3_Option2_Flirt">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _clayHarper = "Media\\Characters\\QuestChars\\UFG\\Clay Harper.jpg">>
<<Chat $player "Next time, I’m wearing armor under my swimsuit. Let’s move before we’re busted.">>
<<ChatWithoutNPC 'Clay Harper' _clayHarper "*grinning* Armor? You’re already a beast. Let’s roll.">>
<div class="btn padding-top"><<button "Continue" "Underground_Fight_Gym">>
<<set $ClayStoryProgress = 3>>
<<if $player.characterEvents.isEventRegistered($player.info.id, "GetClayApproval") == false>>
<<run $player.characterEvents.registerEvent($player.info.id, "GetClayApproval", 1)>>
<<set $ApprovalReceived += 1>>
<</if>>
<<set $canShowStatsBtn = true>>
<<set $gameSettings.allowSaves = true>>
<</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _clayHarper = "Media\\Characters\\QuestChars\\UFG\\Clay Harper.jpg">>
<<Chat $player "You saved my ass… I wanna thank you properly. Storage room? I’m all yours.">>
<<ChatWithoutNPC 'Clay Harper' _clayHarper "*eyes smoldering, a predatory edge to his grin* Thank me? Oh, I’m not saying no to that. Get over here.">>
<<ChatMessage "Clay backs you against the rough concrete wall, his hands firm on your shoulders, his body radiating dominance. Your skin, still slick from the pool, presses against his as he closes the distance, his gaze intense.">>
<<if $player.gender() == 'Male' || $player.gender() == 'Shemale'>>
<<ChatMessage "Clay’s hands grip your hips, his touch commanding yet careful. He guides himself into you with a slow, deliberate thrust, drawing a sharp gasp from your lips. His movements are steady, each push deep and controlled, his breath hot against your ear as he leans in, overwhelming your senses.">>
<<elseif $player.gender() == 'Female'>>
<<ChatMessage "Clay’s fingers trace your curves, lingering on your waist before pulling you flush against him. He enters you with a firm, hungry thrust, his rhythm blending urgency with tenderness. The slickness of your bodies amplifies every sensation, his lips grazing your neck as he drives deeper.">>
<</if>>
<<ChatWithoutNPC 'Clay Harper' _clayHarper "*voice low, growling* Feel me… you’re mine right now. You’re driving me fucking wild.">>
<<ChatMessage "Your bodies intertwined, slick with water and sweat. The cramped room traps every sound - his low groans, your sharp gasps, the rhythmic creak of the wall behind you. His hands anchor you, one sliding to your hip, the other tangling in your hair as he pushes you both toward the edge. The climax hits hard, a mutual surge that leaves you gasping, clinging to him in the afterglow, your bodies pressed close, hearts racing.">>
<<ChatWithoutNPC 'Clay Harper' _clayHarper "*breathless, smirking softly* Fuck… you’re my new weakness. Don’t think I’m letting you go easy after that.">>
<div class="btn padding-top"><<button "Continue" "Underground_Fight_Gym">>
<<set $ClayStoryProgress = 3>>
<<if $player.characterEvents.isEventRegistered($player.info.id, "GetClayApproval") == false>>
<<run $player.characterEvents.registerEvent($player.info.id, "GetClayApproval", 1)>>
<<set $ApprovalReceived += 1>>
<</if>>
<<set $canShowStatsBtn = true>>
<<set $gameSettings.allowSaves = true>>
<</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _clayHarper = "Media\\Characters\\QuestChars\\UFG\\Clay Harper.jpg">>
<<DrawImg _clayHarper>>
<<set _dexAtMax = $player.attributes.dexterity.value >= $player.attributes.dexterity.max>>
<<if $player.characterEvents.isEventRegistered($player.info.id, "GetTessApproval") == false>>
<<ChatWithoutNPC 'Clay Harper' _clayHarper 'Get permission from Tess first, then come on back.'>>
<<elseif $ClayStoryProgress == 0>>
<<ChatWithoutNPC 'Clay Harper' _clayHarper 'Hey, wanna fight?'>>
<div class="btn padding-top"><<button "Yes, I'm ready" "ClayStartQuestFight">><</button>></div>
<<elseif $ClayStoryProgress == 1>>
<<goto "Clay_Quest2_Start">>
<<elseif $ClayStoryProgress == 2>>
<<goto "Clay_Quest3_Start">>
<<else>>
<<if _dexAtMax>>
<<ChatWithoutNPC 'Clay Harper' _clayHarper 'Your dexterity\'s already maxed out.'>>
<div class="btn padding-top non-interacting"><<button "Dexterity (MAX)">><</button>></div>
<<else>>
<<ChatWithoutNPC 'Clay Harper' _clayHarper 'Want to get quicker? I can train your dexterity for $250.'>>
<div class="btn padding-top"><<button "Train my dexterity ($250)" "Clay_TrainDexterity">><</button>></div>
<</if>>
<</if>>
<div class="btn padding-top"><<button "Leave" "Underground_Fight_Gym">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _clayHarper = "Media\\Characters\\QuestChars\\UFG\\Clay Harper.jpg">>
<<if $player.money < 250>>
<<ChatWithoutNPC 'Clay Harper' _clayHarper 'You need $250 to train.'>>
<div class="btn padding-top"><<button "Back" "Clay_Checker">><</button>></div>
<<else>>
<<set $player.money -= 250>>
<<SpendEnergy $player 20>>
<<SpendTimeWithoutUpdate 30>>
<<set _gain = Random(10,20) + $player.attributes.intelligence.value>>
<<SetCharProgression $player 'dexterity' _gain true>>
<<ChatWithoutNPC 'Clay Harper' _clayHarper 'Nice, you\'re getting faster.'>>
<div class="btn padding-top"><<button "Back" "Clay_Checker">><</button>></div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "CharactersData">>
<<run _clayCharacter = CreateCharacter({
isPlayer: false,
characterWork: "Quest",
gender: "Male",
sexualPreference: "Bi",
clothesPreference: "men",
firstName: "Clay",
lastName: "Harper",
skin: 'White',
age: 30,
defense: 2,
agility: 4,
strength: 2,
isQuestCharacter: true,
questCharID: 13,
currentQuestID: 0,
currentCharImg: "Media\\Characters\\QuestChars\\UFG\\Clay Harper.jpg",
}, true)>>
<<unset $maleNames $femaleNames $surnames>>
<<run $player.characterEvents.registerEvent(_clayCharacter.info.id, "knows you", 1)>>
<<set $indexNPC = $Characters.indexOf(_clayCharacter)>>
<<set $interactionNpc = $Characters[$indexNPC]>>
<<set _battleSetControls = {attack: true, seduce: false, items: false, actions: true, noWeapons: true}>>
<<StartFight $player $interactionNpc _battleSetControls 'ClayQuestFightWin' 'ClayQuestFightLose'>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set $clayFightWon = true>>
<div class="btn padding-top"><<button "Continue" "Clay_Quest1">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set $clayFightWon = false>>
<div class="btn padding-top"><<button "Continue" "Clay_Quest1">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set $canShowStatsBtn = false>>
<<set $gameSettings.allowSaves = false>>
<<SetBackground "Media/Locations/City/SkidRow/Warehouse/Warehouse_Basement.jpg">>
<<if $grantTournamentFighters == null>>
<<set $grantTournamentFighters = [
{name: "Razor", desc: "a lean fighter with lightning-fast strikes", defense: 7, agility: 10, strength: 8, dexterity: 9, vitality: 7},
{name: "Bull", desc: "a massive bruiser who shrugs off hits", defense: 10, agility: 6, strength: 11, dexterity: 6, vitality: 10},
{name: "Shade", desc: "a cunning trickster known for dirty moves", defense: 8, agility: 8, strength: 9, dexterity: 10, vitality: 8}
]>>
<</if>>
<<if $grantTournamentProgress == null>>
<<set $grantTournamentProgress = 0>>
<</if>>
<<set _grantMaddox = "Media\\Characters\\QuestChars\\UFG\\Grant Maddox.jpg">>
<<if $grantTournamentCompleted>>
<<ChatWithoutNPC 'Grant Maddox' _grantMaddox "You've already won the tournament." >>
<div class="btn padding-top"><<button "Back" "Underground_Fight_Gym">><<set $canShowStatsBtn = true>><<set $gameSettings.allowSaves = true>><</button>></div>
<<else>>
<<set _nextOpp = $grantTournamentFighters[$grantTournamentProgress]>>
<<set _grantText = "The fighters are ready and the crowd's waiting. Your next opponent is " + _nextOpp.name + ", " + _nextOpp.desc + "." >>
<<ChatWithoutNPC 'Grant Maddox' _grantMaddox _grantText>>
<div class="btn padding-top"><<button "Start Fight" "Grant_Tournament_Fight">><</button>></div>
<div class="btn padding-top"><<button "Back" "Underground_Fight_Gym">><<set $canShowStatsBtn = true>><<set $gameSettings.allowSaves = true>><</button>></div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set $canShowStatsBtn = false>>
<<set $gameSettings.allowSaves = false>>
<<include "CharactersData">>
<<set _fighters = $grantTournamentFighters>>
<<set _opp = _fighters[$grantTournamentProgress]>>
<<set _grantMaddox = "Media\\Characters\\QuestChars\\UFG\\Grant Maddox.jpg">>
<<set _grantText = "Your next opponent is " + _opp.name + ", " + _opp.desc + ".">>
<<ChatWithoutNPC 'Grant Maddox' _grantMaddox _grantText>>
<<run _tournamentOpponent = CreateCharacter({
isPlayer: false,
characterWork: "Tournament Fighter",
gender: "Male",
sexualPreference: "Bi",
clothesPreference: "men",
skin: 'White',
age: 28,
defense: _opp.defense,
agility: _opp.agility,
strength: _opp.strength,
dexterity: _opp.dexterity,
vitality: _opp.vitality,
isQuestCharacter: true,
questCharID: 20,
currentQuestID: 0,
currentCharImg: "Media\\Characters\\QuestChars\\Other\\Unknown.jpg",
firstName: _opp.name,
}, true)>>
<<unset $maleNames $femaleNames $surnames>>
<<set $indexNPC = $Characters.indexOf(_tournamentOpponent)>>
<<set $interactionNpc = $Characters[$indexNPC]>>
<<set _battleSetControls = {attack: true, seduce: false, items: false, actions: true}>>
<<StartFight $player $interactionNpc _battleSetControls 'Grant_Tournament_Win' 'Grant_Tournament_Lose'>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<DeleteCharacter $interactionNpc>>
<<set _grantMaddox = "Media\\Characters\\QuestChars\\UFG\\Grant Maddox.jpg">>
<<set _fighters = $grantTournamentFighters>>
<<if $grantTournamentProgress < _fighters.length - 1>>
<<set $grantTournamentProgress += 1>>
<<ChatWithoutNPC 'Grant Maddox' _grantMaddox "Nice work. Take a breather before the next fight." >>
<div class="btn padding-top"><<button "Next Fight" "Grant_Tournament_Start">>
<<set $canShowStatsBtn = false>>
<<set $gameSettings.allowSaves = false>>
<</button>></div>
<div class="btn padding-top"><<button "Take a Break" "Underground_Fight_Gym">>
<<set $canShowStatsBtn = true>>
<<set $gameSettings.allowSaves = true>>
<</button>></div>
<<else>>
<<ChatWithoutNPC 'Grant Maddox' _grantMaddox "Congratulations, champ. Here's your prize money." >>
<<set $player.money += 20000>>
<<set $grantTournamentCompleted = true>>
<<set $grantTournamentProgress = 0>>
<div class="btn padding-top"><<button "Continue" "Underground_Fight_Gym">>
<<set $canShowStatsBtn = true>>
<<set $gameSettings.allowSaves = true>>
<</button>></div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<DeleteCharacter $interactionNpc>>
<<set _grantMaddox = "Media\\Characters\\QuestChars\\UFG\\Grant Maddox.jpg">>
<<set $grantTournamentProgress = 0>>
<<ChatWithoutNPC 'Grant Maddox' _grantMaddox "Tough break. Come back when you're ready for another shot." >>
<div class="btn padding-top"><<button "Continue" "Underground_Fight_Gym">>
<<set $canShowStatsBtn = true>>
<<set $gameSettings.allowSaves = true>>
<</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _grantMaddox = "Media\\Characters\\QuestChars\\UFG\\Grant Maddox.jpg">>
<<DrawImg _grantMaddox>>
/* Rebuild the legacy counter from authoritative approval events so old saves
cannot remain below three after all three fighters approved the player. */
<<set $ApprovalReceived = 0>>
<<if $player.characterEvents.isEventRegistered($player.info.id, "GetTessApproval")>><<set $ApprovalReceived += 1>><</if>>
<<if $player.characterEvents.isEventRegistered($player.info.id, "GetClayApproval")>><<set $ApprovalReceived += 1>><</if>>
<<if $player.characterEvents.isEventRegistered($player.info.id, "GetMarcusApproval")>><<set $ApprovalReceived += 1>><</if>>
<<if $grantTournamentCompleted>>
<<ChatWithoutNPC 'Grant Maddox' _grantMaddox 'You already claimed the prize. The tournament\'s over.'>>
<div class="btn padding-top"><<button "Continue" "Underground_Fight_Gym">><</button>></div>
<<else>>
<<if $ApprovalReceived < 3>>
<<ChatWithoutNPC 'Grant Maddox' _grantMaddox 'You haven\'t gotten approval from my fighters yet?'>>
<div class="btn padding-top"><<button "Continue" "Underground_Fight_Gym">><</button>></div>
<<else>>
<<ChatWithoutNPC 'Grant Maddox' _grantMaddox 'Awesome, you\'ve got the green light from all my fighters. Ready for the tournament?'>>
<<set $getApproval = true>>
<<if $grantTournamentProgress > 0>>
<div class="btn padding-top"><<button "Continue Tournament" "Grant_Tournament_Start">><</button>></div>
<<else>>
<div class="btn padding-top"><<button "Start Tournament" "Grant_Tournament_Start">><</button>></div>
<</if>>
<div class="btn padding-top"><<button "Maybe later" "Underground_Fight_Gym">><</button>></div>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _grantMaddox = "Media\\Characters\\QuestChars\\UFG\\Grant Maddox.jpg">>
<<run $player.characterEvents.registerEvent($player.info.id, "GrantMeet", 1)>>
<<ChatWithoutNPC 'Grant Maddox' _grantMaddox 'Hey man, this your first time here? Name\'s Grant Maddox. I\'m the hand-to-hand combat coach. I also train fighters for a big tournament with a $20,000 prize. To sign up, you\'ll need approval from my three top fighters: Tess, Clay, and Marcus. Tess got beat by her own dad since she was a kid, so she\'s tough as nails - she can take the pain and dish it right back. Clay used to be a thief, so he\'s quick and agile as hell. Marcus is a massive brute; he\'s not the most nimble, but the guy\'s got raw power to spare. Anyway, they can help you train if you need it, but it\'ll cost you.'>>
/* Grant introduces the UFG state on a new save, but must not erase progress
restored from an older or non-standard save where the fighters were met first. */
<<if $ApprovalReceived == undefined>><<set $ApprovalReceived = 0>><</if>>
<<if $getApproval == undefined>><<set $getApproval = false>><</if>>
<<if $tessStoryProgress == undefined>><<set $tessStoryProgress = 0>><</if>>
<<if $ClayStoryProgress == undefined>><<set $ClayStoryProgress = 0>><</if>>
<<if $MarcusStoryProgress == undefined>><<set $MarcusStoryProgress = 0>><</if>>
<div class="btn padding-top"><<button "Continue" "Underground_Fight_Gym">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set $canShowStatsBtn = false>>
<<set $gameSettings.allowSaves = false>>
<<run $player.characterEvents.registerEvent($player.info.id, "MarcusQuest1", 1)>>
<<if $player.characterEvents.isEventRegistered($player.info.id, "MarcusFem") == false>>
<<set _marcusBell = "Media\\Characters\\QuestChars\\UFG\\Marcus Bell_M.jpg">>
<<else>>
<<set _marcusBell = "Media\\Characters\\QuestChars\\UFG\\Marcus Bell_F.jpg">>
<</if>>
<<ChatWithoutNPC 'Marcus Bell' _marcusBell "Damn, that was one hell of a fight. You had me dripping sweat out there.">>
<<ChatMessage "Marcus grins, wiping his brow with the back of his hand.">>
<<ChatWithoutNPC 'Marcus Bell' _marcusBell "Listen, my family’s throwing a dinner tonight-mom, dad, a couple of relatives. It’s always weird going alone. Wanna tag along? Good food, some talk… and I won’t have to explain these bruises by myself.">>
<<Chat $player 'Alright, I’m game. What’s with the weird vibe? Tell me on the way.'>>
<<ChatMessage "You start walking together, Marcus’s stride relaxed but purposeful.">>
<<ChatWithoutNPC 'Marcus Bell' _marcusBell "It’s not far. Family dinners are like stepping into a cage match without gear. They’re good folks, just… life’s been rough on them.">>
<div class="btn padding-top"><<button "Continue" "Marcus_Quest1_Dinner">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if $player.characterEvents.isEventRegistered($player.info.id, "MarcusFem") == false>>
<<set _marcusBell = "Media\\Characters\\QuestChars\\UFG\\Marcus Bell_M.jpg">>
<<else>>
<<set _marcusBell = "Media\\Characters\\QuestChars\\UFG\\Marcus Bell_F.jpg">>
<</if>>
<<set _marcusMother = "Media\\Characters\\QuestChars\\UFG\\Marcus_Mom.jpg">>
<<set _marcusFather = "Media\\Characters\\QuestChars\\UFG\\Marcus_Dad.jpg">>
<<set _marcusAunt = "Media\\Characters\\QuestChars\\UFG\\marcus_aunt.jpg">>
<<SetBackground "Media/Locations/Other/UFG/Marcus_Parents_H_LR.jpg">>
<<ChatMessage "Marcus’s parents’ house is small but warm, the air thick with the comforting smell of home-cooked food. His mother swings the door open, her face lighting up as she pulls Marcus into a tight hug. His father gives a quick nod from the living room, where an uncle and aunt are already seated at the dining table.">>
<<ChatWithoutNPC "Marcus’s Mother" _marcusMother "Marcus, you brought someone! Who’s this lovely person?">>
<<ChatMessage "She beams, gesturing for you to come inside.">>
<<ChatWithoutNPC "Marcus’s Mother" _marcusMother "Come in, dinner’s ready-roast, salad, all the good stuff you love.">>
<<ChatWithoutNPC 'Marcus Bell' _marcusBell "This is my gym buddy. *Says your name, clapping a hand on your shoulder.* Don’t mind the bruises - we’ve been trading “friendly” hits.">>
<<ChatMessage "Marcus chuckles, guiding you toward the table.">>
<<ChatWithoutNPC "Marcus’s Father" _marcusFather "A fighter, eh?">>
<<ChatMessage "He leans forward in his chair, sizing you up with a grin.">>
<<ChatWithoutNPC "Marcus’s Father" _marcusFather "Sit down, tell us about the gym. Grant still cracking the whip?">>
<<ChatMessage "The table hums with easy chatter-talk of work, neighbors, and old family stories. Marcus’s father tosses out a dry joke about his past job, while his mother peppers you with questions about your training. The conversation shifts to Marcus’s sister.">>
<<ChatWithoutNPC 'Aunt' _marcusAunt "How’s Tiffany doing? It’s been forever since we heard from her. Still in the city?">>
<<ChatMessage "She leans in, her tone curious but gentle.">>
<<ChatWithoutNPC 'Marcus Bell' _marcusBell "Yeah, Tiff’s out there living her life.">>
<<ChatMessage "Marcus’s jaw tightens slightly, but he forces a smile.">>
<<ChatWithoutNPC 'Marcus Bell' _marcusBell "Working at a café, chasing her dreams. She’s good, just… doing her own thing.">>
<<ChatWithoutNPC 'Mother' _marcusMother "I hope she calls soon. We miss her.">>
<<ChatMessage "Her voice softens, her eyes lingering on Marcus.">>
<<ChatWithoutNPC 'Marcus Bell' _marcusBell "She will, Mom.">>
<<ChatMessage "He shifts in his seat, quickly steering the conversation elsewhere.">>
<<ChatWithoutNPC 'Marcus Bell' _marcusBell "Hey, remember when Dad spent weeks wrestling that old car into shape?">>
<<ChatMessage "The table erupts in laughter, the mood lightening as stories flow.">>
<<ChatMessage "The dinner wraps up with warmth and shared jokes, though Marcus sidesteps any deeper talk about his sister. After dessert, he leads you to his old bedroom - a cramped space with fight posters plastered on the walls and trophies lined up on a shelf.">>
<<ChatWithoutNPC 'Marcus Bell' _marcusBell "Whew, we made it through. Thanks for coming - you kept it from being a total drag.">>
<<ChatMessage "He leans against the doorframe, his eyes catching yours with a playful glint.">>
<<ChatWithoutNPC 'Marcus Bell' _marcusBell "So, what’s the plan? You sticking around, or calling it a night?">>
<div class="btn padding-top"><<button "Say Goodbye" "Marcus_Quest1_Goodbye">><</button>></div>
<div class="btn padding-top"><<button "Flirt" "Marcus_Quest1_Flirt">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if $player.characterEvents.isEventRegistered($player.info.id, "MarcusFem") == false>>
<<set _marcusBell = "Media\\Characters\\QuestChars\\UFG\\Marcus Bell_M.jpg">>
<<else>>
<<set _marcusBell = "Media\\Characters\\QuestChars\\UFG\\Marcus Bell_F.jpg">>
<</if>>
<<SetBackground "Media/Locations/Other/UFG/Marcus_Parents_H_LR.jpg">>
<<Chat $player 'That was awesome, but I’m wiped. Thanks for the invite - your mom’s food is next-level.'>>
<<ChatMessage "You give him a quick nod, heading toward the door.">>
<<ChatWithoutNPC 'Marcus Bell' _marcusBell "Ha, I’ll tell her you said that.">>
<<ChatMessage "He flashes a warm grin, walking you out.">>
<<ChatWithoutNPC 'Marcus Bell' _marcusBell "Catch you at the gym. Tonight was… solid.">>
<div class="btn padding-top"><<button "Continue" "Underground_Fight_Gym">>
<<if $player.characterEvents.isEventRegistered($player.info.id, "GetMarcusApproval") == false>>
<<run $player.characterEvents.registerEvent($player.info.id, "GetMarcusApproval", 1)>>
<<set $ApprovalReceived += 1>>
<<DeleteCharacter $interactionNpc>>
<<set $MarcusStoryProgress = 1>>
<</if>>
<<set $canShowStatsBtn = true>>
<<set $gameSettings.allowSaves = true>>
<</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/Other/UFG/Marcus_Parents_H_Bedroom.jpg">>
<<if $player.characterEvents.isEventRegistered($player.info.id, "MarcusFem") == false>>
<<set _marcusBell = "Media\\Characters\\QuestChars\\UFG\\Marcus Bell_M.jpg">>
<<else>>
<<set _marcusBell = "Media\\Characters\\QuestChars\\UFG\\Marcus Bell_F.jpg">>
<</if>>
<<Chat $player 'Dinner was great, but I’m not done with you yet. You’re still buzzing from that fight… wanna take the edge off together?'>>
<<ChatMessage "You step closer, your voice low and teasing, eyes locked on his.">>
<<ChatWithoutNPC 'Marcus Bell' _marcusBell "Oh, you’re coming in hot, huh?">>
<<ChatMessage "Marcus steps toward you, closing the distance, his body radiating heat.">>
<<ChatWithoutNPC 'Marcus Bell' _marcusBell "Adrenaline’s still kicking from the ring. Depends on who came out on top today.">>
<<ChatMessage "He tilts his head, his gaze intense, a daring smirk playing on his lips.">>
<<if $player.gender() == 'Male' || $player.gender() == 'Shemale'>>
<<if $marcusFightWon == true>>
<<ChatWithoutNPC 'Marcus Bell' _marcusBell "You had me down earlier… now it’s my turn to take charge.">>
<<ChatMessage "He guides you to the bed, his hand brushing your shoulder, firm and deliberate.">>
<<ChatWithoutNPC 'Marcus Bell' _marcusBell "Sit. Let my hands do the work-slow at first, tight where it counts.">>
<<if CheckContentFilter('Male')>><<Video "Media\\Sex\\Quest\\FightClub\\Marcus\\Quest1\\handjob_m_b.mp4">><</if>>
<<ChatMessage "His fingers trail down, wrapping around your cock, his touch confident and unhurried.">>
<<ChatWithoutNPC 'Marcus Bell' _marcusBell "Feel that? I’m picking up the pace… but keep it quiet, yeah? No need to wake the house.">>
<<ChatMessage "His breath is hot against your neck, his grip steady and precise, teasing every sensitive inch.">>
<<ChatMessage "Marcus’s hand moves with skill, building the tension with each stroke. Your body tightens, release hitting with a low, stifled groan.">>
<<ChatMessage "He smirks, wiping his hand on his shirt, his eyes still locked on yours.">>
<<ChatWithoutNPC 'Marcus Bell' _marcusBell "Shit, you’re something else. That was… fucking electric.">>
<<ChatMessage "He leans back, chest rising and falling, a satisfied glint in his eyes.">>
<<else>>
<<ChatWithoutNPC 'Marcus Bell' _marcusBell "You went down in the ring… now you’re mine to please.">>
<<ChatMessage "He sits on the bed, guiding your hand to his bulge with a rough, teasing grin.">>
<<ChatWithoutNPC 'Marcus Bell' _marcusBell "Wrap your hand around me-slow, firm. Yeah, like that… now faster.">>
<<if $player.gender() == 'Male'>>
<<if CheckContentFilter('Male')>><<Video "Media\\Sex\\Quest\\FightClub\\Marcus\\Quest1\\handjob_m_w.mp4">><</if>>
<<else>>
<<if CheckContentFilter('Male')>><<Video "Media\\Sex\\Quest\\FightClub\\Marcus\\Quest1\\handjob_f.mp4">><</if>>
<</if>>
<<ChatMessage "His voice drops to a husky whisper, his body tensing under your touch.">>
<<ChatWithoutNPC 'Marcus Bell' _marcusBell "Keep it quiet, but don’t hold back.">>
<<ChatMessage "His hand rests on your arm, urging you on as his breath hitches.">>
<<ChatMessage "Your fingers work him, his muscles flexing with each stroke. His muffled groans fill the air as he finishes, gripping your arm tightly.">>
<<ChatMessage "His eyes burn with gratitude as he catches his breath.">>
<<ChatWithoutNPC 'Marcus Bell' _marcusBell "Damn… you’re lethal in and out of the ring.">>
<<ChatMessage "He leans back, a lazy smile spreading across his face.">>
<</if>>
<<elseif $player.gender() == 'Female'>>
<<if $marcusFightWon == true>>
<<ChatWithoutNPC 'Marcus Bell' _marcusBell "You took me out today… guess I owe you one.">>
<<ChatMessage "He steps closer, his hand grazing your thigh as he guides you to the bed.">>
<<ChatWithoutNPC 'Marcus Bell' _marcusBell "Lie back. My fingers know their way-slow circles, right where you’re craving it.">>
<<ChatMessage "His touch teases your clit, firm and deliberate, his eyes never leaving yours.">>
<<ChatWithoutNPC 'Marcus Bell' _marcusBell "Feel that heat? Shh, keep it down… just let it hit you.">>
<<ChatMessage "His breath brushes your ear, his fingers moving with precise, unrelenting rhythm.">>
<<ChatMessage "Marcus’s fingers work with expertise, building the tension until your body arches, climax hitting with a soft, suppressed whimper.">>
<<if CheckContentFilter('Male')>><<Video "Media\\Sex\\Quest\\FightClub\\Marcus\\Quest1\\fing_f.mp4">><</if>>
<<ChatMessage "He pulls back, grinning, his eyes still hungry.">>
<<ChatWithoutNPC 'Marcus Bell' _marcusBell "Hell, you’re gonna be the death of me. That was pure fire.">>
<<ChatMessage "He leans back, his voice low and warm, a spark still in his gaze.">>
<<else>>
<<ChatWithoutNPC 'Marcus Bell' _marcusBell "I had you on the mat earlier… now you get to even the score.">>
<<ChatMessage "He sits close, guiding your hand to his cock with a sly, teasing smirk.">>
<<ChatWithoutNPC 'Marcus Bell' _marcusBell "Stroke me-slow, tight. Yeah, just like that… now faster.">>
<<ChatMessage "His voice is a rough whisper, his body tensing as you move.">>
<<if CheckContentFilter('Male')>><<Video "Media\\Sex\\Quest\\FightClub\\Marcus\\Quest1\\handjob_f.mp4">><</if>>
<<ChatWithoutNPC 'Marcus Bell' _marcusBell "Keep it quiet, but don’t let up.">>
<<ChatMessage "His hand grips yours lightly, his breath growing ragged.">>
<<ChatMessage "Your hand finds a rhythm, his body responding with every stroke. His stifled groans spill out as he finishes, his hand tightening on yours, eyes full of appreciation.">>
<<ChatMessage "He exhales, a grin breaking through.">>
<<ChatWithoutNPC 'Marcus Bell' _marcusBell "You’re trouble, you know that? Fucking unreal.">>
<<ChatMessage "He leans back, catching his breath, his gaze still locked on you.">>
<</if>>
<</if>>
<div class="btn padding-top"><<button "Continue" "Underground_Fight_Gym">>
<<if $player.characterEvents.isEventRegistered($player.info.id, "GetMarcusApproval") == false>>
<<run $player.characterEvents.registerEvent($player.info.id, "GetMarcusApproval", 1)>>
<<set $ApprovalReceived += 1>>
<<DeleteCharacter $interactionNpc>>
<<set $MarcusStoryProgress = 1>>
<</if>>
<<set $canShowStatsBtn = true>>
<<set $gameSettings.allowSaves = true>>
<</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set $canShowStatsBtn = false>>
<<set $gameSettings.allowSaves = false>>
<<run $player.characterEvents.registerEvent($player.info.id, "MarcusQuest2", 1)>>
<<set _marcusBell = "Media\\Characters\\QuestChars\\UFG\\Marcus Bell_M.jpg">>
<<ChatMessage "You’re in an old gym, reeking of sweat and metal. Barbells clank, and someone’s pounding a punching bag in the corner. Marcus stands against the wal. His eyes are filled with guilt and determination. This is the moment of truth. You approach him.">>
<<ChatWithoutNPC 'Marcus Bell' _marcusBell "Hey, good to see you. Listen, remember at dinner when I said Tiffany “ran away”? That’s bullshit. She didn’t run - she was kidnapped. By a gang. They’re forcing her to work as a prostitute in their brothel to cover my debts. *He clenches his fists tighter, voice shaking.* When I was 20, I got mixed up in street dealing for a gang - thought I’d make some cash, help the family. But the cops busted me on a big deal, seized all the goods, and I did two years in prison. When I got out, I had nothing to pay them back with. The gang said, “Debt’s on interest,” and took Tiffany - she was 18 then. They forced her to... damn it, service clients like a whore. I tried to get her back, but they beat me half to death. She’s still there, in their den. Please, help: sneak into the brothel as a client, look around. Here’s her photo. *He shows you a picture of a sweet girl with dark hair and sad eyes.* Talk to her, tell her: “Marcus is still fighting to get you out. Hold on.”">>
<div class="btn padding-top"><<button "Sure, I'll help." "Marcus_Quest2_ResponseHelp">><</button>></div>
<div class="btn padding-top"><<button "Risky, but for your sister." "Marcus_Quest2_ResponseRisky">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _marcusBell = "Media\\Characters\\QuestChars\\UFG\\Marcus Bell_M.jpg">>
<<Chat $player 'Sure, I’ll help.'>>
<<Chat $player 'Alright, give me the address. Why’s the gang so brutal?'>>
<<ChatWithoutNPC 'Marcus Bell' _marcusBell 'They don’t forgive debts. Be careful - the brothel’s on the outskirts, security’s tight. Come back and tell me everything. Thanks, you’re giving me hope.'>>
<div class="btn padding-top"><<button "Continue" "Marcus_Quest2_Brothel_Start">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _marcusBell = "Media\\Characters\\QuestChars\\UFG\\Marcus Bell_M.jpg">>
<<Chat $player 'Risky, but for your sister.'>>
<<Chat $player 'Alright, give me the address. Why’s the gang so brutal?'>>
<<ChatWithoutNPC 'Marcus Bell' _marcusBell 'They don’t forgive debts. Be careful - the brothel’s on the outskirts, security’s tight. Come back and tell me everything. Thanks, you’re giving me hope.'>>
<div class="btn padding-top"><<button "Continue" "Marcus_Quest2_Brothel_Start">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/Other/UFG/gang_House.jpg">>
<<ChatMessage "You arrive at a dark building on the city’s edge. Neon lights flicker above the entrance, a sign reading “Red Silk.” The air is thick with cigarette smoke and cheap perfume. At the door stands a guard - a hulking brute with tattoos, a scar across his eyebrow, and a cold stare.">>
<<set _gangGuard = "Media\\Characters\\QuestChars\\UFG\\gang3.jpg">>
<<ChatWithoutNPC 'Guard' _gangGuard 'What do you want? Client? Show me the cash, and get in. No funny business.'>>
<<Chat $player 'I’m a client, looking for some fun. *You flash the money and walk inside.*'>>
<div class="btn padding-top"><<button "Continue" "Marcus_Quest2_Brothel_Inside">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/Other/UFG/gang_house_interier.jpg">>
<<ChatMessage "Inside, dim lights cast shadows. Women in skimpy outfits lounge near the bar, clients drinking and laughing. Curtains hide rooms where moans and muffled voices spill out. You scan the place, keeping Tiffany’s photo in mind. You find her room - the door’s slightly open. Inside, a man looms over Tiffany." >>
<<set _gangClient = "Media\\Characters\\QuestChars\\UFG\\gang2.jpg">>
<<ChatWithoutNPC 'Client' _gangClient 'Get on your knees, bitch! Do anal, or I’ll kill you!'>>
<<set _tiffanyImg = "Media\\Characters\\QuestChars\\UFG\\Tiffany.jpg">>
<<ChatWithoutNPC 'Tiffany' _tiffanyImg 'No, please, don’t... it hurts, I don’t want to!'>>
<div class="btn padding-top"><<button "Intervene." "Marcus_Quest2_Intervene">><</button>></div>
<div class="btn padding-top"><<button "Do nothing." "Marcus_Quest2_DoNothing">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/Other/UFG/gang_house_tiffany_room.jpg">>
<<ChatMessage "You burst into the room, shoving the client.">>
<<Chat $player 'Back off, you bastard!'>>
<<ChatMessage "He’s a big guy with bloodshot eyes and swings at you.">>
<<include "CharactersData">>
<<run _abusiveClient = CreateCharacter({
isPlayer: false,
characterWork: "Client",
gender: "Male",
sexualPreference: "Bi",
clothesPreference: "men",
firstName: "Client",
lastName: "",
skin: 'Black',
age: 30,
defense: 5,
agility: 5,
strength: 5,
isQuestCharacter: true,
questCharID: 18,
currentQuestID: 0,
currentCharImg: "Media\\Characters\\QuestChars\\UFG\\gang2.jpg",
}, true)>>
<<unset $maleNames $femaleNames $surnames>>
<<run $player.characterEvents.registerEvent(_abusiveClient.info.id, "knows you", 1)>>
<<set $indexNPC = $Characters.indexOf(_abusiveClient)>>
<<set $interactionNpc = $Characters[$indexNPC]>>
<<set _battleSetControls = {attack: true, seduce: false, items: false, actions: true}>>
<<StartFight $player $interactionNpc _battleSetControls 'Marcus_Quest2_Intervene_Win' 'Marcus_Quest2_Intervene_Lose'>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<DeleteCharacter $interactionNpc>>
<<SetBackground "Media/Locations/Other/UFG/gang_house_tiffany_room.jpg">>
<<ChatMessage "The client collapses, groaning, clutching his jaw. A gang member storms in, gun in hand: “What the hell’s going on? Who’s making noise?”">>
<<Chat $player 'This jerk was roughing up your girl-beating her, trying to kill her. I stepped in to save her.'>>
<<set _gangMember = "Media\\Characters\\QuestChars\\UFG\\gang3.jpg">>
<<ChatWithoutNPC 'Gang Member' _gangMember '*Looks at the client, then Tiffany.* Yeah, I see. Good job, client. Your reward: a free session with Tiffany. She’s fresh, don’t miss out. *He smirks and leaves.*'>>
<<ChatMessage "Tiffany looks at you with gratitude, but her eyes are heavy with exhaustion. She sits on the edge of a worn mattress, her skimpy dress barely covering the bruises on her body." >>
<<Chat $player 'Marcus is fighting for you, hold on.'>>
<<ChatMessage "She nods, tears streaming down her face." >>
<div class="btn padding-top"><<button "Accept." "Marcus_Quest2_Intervene_Win_Accept">><</button>></div>
<div class="btn padding-top"><<button "Decline." "Marcus_Quest2_Intervene_Win_Decline">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _tiffanyImg = "Media\\Characters\\QuestChars\\UFG\\Tiffany.jpg">>
<<SetBackground "Media/Locations/Other/UFG/gang_house_tiffany_room.jpg">>
<<if $player.gender() == 'Male' || $player.gender() == 'Shemale'>>
<<ChatMessage "The gang member leaves, the door slamming shut. Tiffany’s breathing is shaky." >>
<<ChatWithoutNPC 'Tiffany' _tiffanyImg 'Thank you... for stepping in.'>>
<<ChatMessage "She slowly drops to her knees, her trembling fingers undoing your belt." >>
<<ChatWithoutNPC 'Tiffany' _tiffanyImg 'I have to... it’s my job.'>>
<<ChatMessage "Her eyes meet yours, almost pleading for forgiveness. You nod, and she leans closer." >>
<<if CheckContentFilter('Female')>><<Video "Media\\Sex\\Quest\\FightClub\\Marcus\\Quest2\\Blowjob_m_s.mp4">><</if>>
<<ChatMessage "Her lips touch you, warm and wet, wrapping around you softly but firmly. She moves slowly, deeply, making soft, muffled sounds. Her hands rest on your thighs, gripping lightly as she works her tongue, speeding up, then slowing down. Tears roll down her cheeks, mixing with the moisture on her lips. The tension builds, her movements grow more urgent, and an orgasm hits you fast, a powerful wave. You finish in her mouth; she swallows, not pulling away, but her shoulders tremble. She wipes her lips with the back of her hand, looking away.">>
<<ChatWithoutNPC 'Tiffany' _tiffanyImg 'Thank you... for not letting him break me.'>>
<<ChatMessage "You fasten your belt, feeling guilt and relief. She adjusts her dress, and you leave, hearing another client being called as you go." >>
<<elseif $player.gender() == 'Female'>>
<<ChatMessage "The gang member leaves, shutting the door. Tiffany’s eyes glisten with tears, but there’s gratitude in them." >>
<<ChatWithoutNPC 'Tiffany' _tiffanyImg 'Thank you... for saving me.'>>
<<Chat $player 'He’s fighting for you, hold on.'>>
<<ChatMessage "She nods, wiping a tear, and reaches for your hand." >>
<<ChatWithoutNPC 'Tiffany' _tiffanyImg 'You’re not like them.'>>
<<ChatMessage "Her fingers tremble against your skin." >>
<<ChatMessage "She pulls you toward the mattress, her hands sliding over your hips, gentle but practiced." >>
<<ChatWithoutNPC 'Tiffany' _tiffanyImg 'I want this to be different.'>>
<<ChatMessage "You nod. Her fingers unfasten your clothes, slow and careful, and she lowers herself, kissing your stomach, moving down to your pussy. Her breath is hot, and you feel the tension rising." >>
<<if CheckContentFilter('Female')>><<Video "Media\\Sex\\Quest\\FightClub\\Marcus\\Quest2\\lick_f.mp4">><</if>>
<<ChatMessage "Tiffany starts slowly, her tongue gently exploring, finding a rhythm. She makes soft moans, as if trying to lose herself in the moment. Her movements grow bolder, her tongue circling, pressing, quickening, and waves of pleasure build. Her hands grip your thighs, holding you as she dives deeper, driving you to the edge." >>
<<ChatWithoutNPC 'Tiffany' _tiffanyImg 'You saved me... thank you.'>>
<<ChatMessage "She resumes, faster now, and an orgasm crashes over you, sharp and intense. Tiffany slows, easing you down as you catch your breath." >>
<<ChatMessage "She rises, wiping her lips, and gives you a tired smile." >>
<<ChatWithoutNPC 'Tiffany' _tiffanyImg 'I won’t forget what you did.'>>
<<ChatMessage "She fixes her dress. You fasten your clothes, feeling a mix of guilt, relief, and closeness. You leave, hearing another client called behind you." >>
<</if>>
<<set $marcusQ2Outcome = "InterveneWin">>
<div class="btn padding-top"><<button "Continue" "Marcus_Quest2_End">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/Other/UFG/gang_house_tiffany_room.jpg">>
<<Chat $player 'No, thanks. Just glad I could help.'>>
<<ChatWithoutNPC 'Gang Member' _gangMember 'Suit yourself. Get out.'>>
<<ChatMessage "You leave the room, relieved but heavy with the knowledge that Tiffany’s still trapped in this hell. The cold wind hits your face outside, but you know you did what you could.">>
<<set $marcusQ2Outcome = "InterveneWin">>
<div class="btn padding-top"><<button "Continue" "Marcus_Quest2_End">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<DeleteCharacter $interactionNpc>>
<<SetBackground "Media/Locations/Other/UFG/gang_house_tiffany_room.jpg">>
<<ChatMessage "The client lands a punch, and you hit the floor, pain shooting through your ribs. Gang members burst in: “What’s this fight about?” They beat the client and toss him out, then turn to you: “You with him? Get out!” You’re thrown onto the street, bruised and feeling like you failed.">>
<<set $marcusQ2Outcome = "InterveneLose">>
<div class="btn padding-top"><<button "Continue" "Marcus_Quest2_End">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/Other/UFG/gang_house_tiffany_room.jpg">>
<<ChatMessage "You stand by the door, listening to Tiffany’s cries. Her sobs cut deep, but you stay still. Gang members barge in: “What’s the noise?” They beat the client and throw him out, then glare at you: “You just stood there? His buddy? Get out!” You’re tossed onto the street, left with a sense of powerlessness.">>
<<set $marcusQ2Outcome = "DoNothing">>
<div class="btn padding-top"><<button "Continue" "Marcus_Quest2_End">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/City/SkidRow/Warehouse/Warehouse_Basement.jpg">>
<<set _marcusBell = "Media\\Characters\\QuestChars\\UFG\\Marcus Bell_M.jpg">>
<<SetBackground>>
<<if $marcusQ2Outcome == 'InterveneWin'>>
<<Chat $player 'I found Tiffany. She’s alive but suffering. I passed on your message; she’s holding on.'>>
<<elseif $marcusQ2Outcome == 'InterveneLose'>>
<<Chat $player 'I saw Tiffany, but I couldn’t talk to her. A client was beating her, I tried to step in, but they threw me out. She’s there, alive.'>>
<<elseif $marcusQ2Outcome == 'DoNothing'>>
<<Chat $player 'I saw Tiffany but couldn’t get close. A client was hurting her, the gang stepped in. She’s alive but suffering.'>>
<</if>>
<<ChatWithoutNPC 'Marcus Bell' _marcusBell 'Damn... thanks for trying. At least I know she’s alive. Those bastards... I’ll get her out, I swear. You took a risk - that means a lot. *He grips your shoulder, eyes burning with resolve.* I’ll find a way. If I need you, I know who to call.'>>
<div class="btn padding-top"><<button "Continue" "Underground_Fight_Gym">>
<<set $MarcusStoryProgress = 2>>
<<set $canShowStatsBtn = true>>
<<set $gameSettings.allowSaves = true>>
<</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set $canShowStatsBtn = false>>
<<set $gameSettings.allowSaves = false>>
<<run $player.characterEvents.registerEvent($player.info.id, "MarcusQuest3", 1)>>
<<if $player.characterEvents.isEventRegistered($player.info.id, "MarcusFem") == false>>
<<set _marcusBell = "Media\\Characters\\QuestChars\\UFG\\Marcus Bell_M.jpg">>
<<else>>
<<set _marcusBell = "Media\\Characters\\QuestChars\\UFG\\Marcus Bell_F.jpg">>
<</if>>
<<ChatWithoutNPC 'Marcus Bell' _marcusBell "Damn, good to see you. I scraped together some cash-fights from the other night, plus side gigs. Went to buy Tiffany out this morning, but those bastards jacked up the debt again: \"Interest spiked, man.\" They’re not letting her go, the pricks. Enough’s enough-time to hit their hideout. I got Clay and Tess on board. You in? Together, we’ll tear ‘em apart.">>
<div class="btn padding-top"><<button "Hell yeah, I’m in" "Marcus_Quest3_Agree">><</button>></div>
<div class="btn padding-top"><<button "For your sister-count me in" "Marcus_Quest3_Agree">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if $player.characterEvents.isEventRegistered($player.info.id, "MarcusFem") == false>>
<<set _marcusBell = "Media\\Characters\\QuestChars\\UFG\\Marcus Bell_M.jpg">>
<<else>>
<<set _marcusBell = "Media\\Characters\\QuestChars\\UFG\\Marcus Bell_F.jpg">>
<</if>>
<<Chat $player 'Alright, let’s go. What happened after the kidnapping?'>>
<<ChatWithoutNPC 'Marcus Bell' _marcusBell "Come on, the brothel’s on the outskirts. After prison, I got out - pissed off, broken. The gang already had Tiffany, forced her to… work for them. I tried to get her back - barged in, but they surrounded me, beat me bloody, nearly killed me. They said, \"Debt’s on interest, she’s ours forever.\" I barely got out. Then I met Grant - he saw me in the gym, half-dead. Trained me for fights: \"Earn it clean, kid, and save her.\" I grinded, saved up, got stronger. Now’s our shot. With you, Clay, and Tess… we’ll get her out.">>
<<Chat $player 'You’ve changed. We’ll do this.'>>
<div class="btn padding-top"><<button "Continue" "Marcus_Quest3_Brothel">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/Other/UFG/gang_House.jpg">>
<<set _marcusBell = "Media\\Characters\\QuestChars\\UFG\\Marcus Bell_M.jpg">>
<<set _clayHarper = "Media\\Characters\\QuestChars\\UFG\\Clay Harper.jpg">>
<<set _tessCarter = "Media\\Characters\\QuestChars\\UFG\\Tess Carter.jpg">>
<<ChatMessage "At the brothel - a dark building, guards at the door. Clay and Tess wait, all in dark clothes, faces grim. Marcus lays out the plan.">>
<<ChatWithoutNPC 'Marcus Bell' _marcusBell "Alright, listen up: you and Clay go in hard through the front, distract the guards. Tess and I hit the back through a window, strike from behind, grab Tiffany. Ready?">>
<<ChatWithoutNPC 'Clay Harper' _clayHarper "Hell yeah, let’s wreck these assholes.">>
<<ChatWithoutNPC 'Tess Carter' _tessCarter "For my sister-anything.">>
<div class="btn padding-top"><<button "Continue" "Marcus_Quest3_Front">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/Other/UFG/gang_house_interier.jpg">>
<<set _clayHarper = "Media\\Characters\\QuestChars\\UFG\\Clay Harper.jpg">>
<<ChatMessage "Marcus and Tess slip around the building, entering through a window. You and Clay bust through the front door-inside, a group of thugs *3-4 big guys* spot you, grabbing weapons.">>
<<set _thug1 = "Media\\Characters\\QuestChars\\UFG\\gang3.jpg">>
<<ChatWithoutNPC 'Thug 1' _thug1 "Who the hell are you? Get out, or we’ll rip you apart!">>
<<ChatWithoutNPC 'Clay Harper' _clayHarper "This is for Tiffany, you bastards!">>
<<include "CharactersData">>
<<run _frontThug = CreateCharacter({isPlayer:false, characterWork:"Thug", gender:"Male", sexualPreference:"Bi", clothesPreference:"men", firstName:"Thug", lastName:"", skin:'White', age:30, defense:5, agility:5, strength:5, isQuestCharacter:true, questCharID:19, currentQuestID:0, currentCharImg:"Media\\Characters\\QuestChars\\UFG\\gang3.jpg"}, true)>>
<<unset $maleNames $femaleNames $surnames>>
<<set $indexNPC = $Characters.indexOf(_frontThug)>>
<<set $interactionNpc = $Characters[$indexNPC]>>
<<set _battleSetControls = {attack: true, seduce: false, items: false, actions: true}>>
<<StartFight $player $interactionNpc _battleSetControls 'Marcus_Quest3_Front_Win' 'Marcus_Quest3_Front_Lose'>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<DeleteCharacter $interactionNpc>>
<<set _clayHarper = "Media\\Characters\\QuestChars\\UFG\\Clay Harper.jpg">>
<<ChatMessage "The thug’s down, you help Clay finish the others.">>
<<ChatWithoutNPC 'Clay Harper' _clayHarper "Nice work! Split up - I’m heading upstairs, you go to Tiffany’s room.">>
<div class="btn padding-top"><<button "Continue" "Marcus_Quest3_Corridor">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<DeleteCharacter $interactionNpc>>
<<set _clayHarper = "Media\\Characters\\QuestChars\\UFG\\Clay Harper.jpg">>
<<ChatMessage "The thug floors you, but Clay jumps in, knocking him out with a punch to the jaw.">>
<<ChatWithoutNPC 'Clay Harper' _clayHarper "Yo, get up! No time to lie around. You good? These guys are tough, but we’re tougher. Split up - I’m going upstairs, you find Tiffany.">>
<div class="btn padding-top"><<button "Continue" "Marcus_Quest3_Corridor">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/Other/UFG/gang_house_interier.jpg">>
<<set _marcusBell = "Media\\Characters\\QuestChars\\UFG\\Marcus Bell_M.jpg">>
<<set _thug2 = "Media\\Characters\\QuestChars\\UFG\\gang3.jpg">>
<<ChatMessage "Clay heads upstairs, you move down the corridor toward Tiffany’s room. You hear a commotion: thugs have pinned Marcus to the wall.">>
<<ChatWithoutNPC 'Thug with syringe' _thug2 "Hold him! Inject this crap-turn him into a chick like his sister!">>
<<ChatWithoutNPC 'Marcus Bell' _marcusBell "Let me go, you bastards! This is for Tiffany!">>
<<ChatWithoutNPC 'Thug with syringe' _thug2 "This’ll make you a girl in seconds-experimental drug, ha!">>
<div class="btn padding-top"><<button "Wait and don’t attack" "Marcus_Quest3_Wait">><</button>></div>
<div class="btn padding-top"><<button "Jump in" "Marcus_Quest3_JumpIn_Fight">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _marcusBellF = "Media\\Characters\\QuestChars\\UFG\\Marcus Bell_F.jpg">>
<<run $player.characterEvents.registerEvent($player.info.id, "MarcusFem", 1)>>
<<ChatMessage "The thugs inject Marcus with the drug. He screams, his body changing: muscles fade, breasts swell, his voice turns soft and feminine, hair cascades in long waves. Now Marcus is a woman, shaken but alive, her eyes a mix of fear and determination. Clay and Tess approach from behind *they’ve freed Tiffany from the back*.">>
<<set _clayHarper = "Media\\Characters\\QuestChars\\UFG\\Clay Harper.jpg">>
<<set _tessCarter = "Media\\Characters\\QuestChars\\UFG\\Tess Carter.jpg">>
<<ChatWithoutNPC 'Clay Harper' _clayHarper "What the… Marcus?!">>
<<ChatWithoutNPC 'Tess Carter' _tessCarter "Let’s hit the room-help them!">>
<div class="btn padding-top"><<button "Continue" "Marcus_Quest3_Wait_Fight">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/Other/UFG/gang_house_tiffany_room.jpg">>
<<include "CharactersData">>
<<run _waitThug = CreateCharacter({isPlayer:false, characterWork:"Thug", gender:"Male", sexualPreference:"Bi", clothesPreference:"men", firstName:"Thug", lastName:"", skin:'White', age:30, defense:5, agility:5, strength:5, isQuestCharacter:true, questCharID:20, currentQuestID:0, currentCharImg:"Media\\Characters\\QuestChars\\UFG\\gang3.jpg"}, true)>>
<<unset $maleNames $femaleNames $surnames>>
<<set $indexNPC = $Characters.indexOf(_waitThug)>>
<<set $interactionNpc = $Characters[$indexNPC]>>
<<set _battleSetControls = {attack: true, seduce: false, items: false, actions: true}>>
<<StartFight $player $interactionNpc _battleSetControls 'Marcus_Quest3_Wait_Fight_Win' 'Marcus_Quest3_Wait_Fight_Lose'>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<DeleteCharacter $interactionNpc>>
<<set _tiffanyImg = "Media\\Characters\\QuestChars\\UFG\\Tiffany.jpg">>
<<set _marcusBellF = "Media\\Characters\\QuestChars\\UFG\\Marcus Bell_F.jpg">>
<<ChatMessage "The thugs are down, Tiffany’s free, and she hugs Marcus *now in female form*.">>
<<ChatWithoutNPC 'Tiffany' _tiffanyImg "Brother… what did they do to you?">>
<<ChatWithoutNPC 'Marcus Bell' _marcusBellF "Damn… I’m… a woman? But… Tiffany’s safe, that’s what matters. Thank you all. Let’s get outta here.">>
<div class="btn padding-top"><<button "Continue" "Marcus_Quest3_Wait_MarcusPlace">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<DeleteCharacter $interactionNpc>>
<<set _tiffanyImg = "Media\\Characters\\QuestChars\\UFG\\Tiffany.jpg">>
<<set _clayHarper = "Media\\Characters\\QuestChars\\UFG\\Clay Harper.jpg">>
<<set _tessCarter = "Media\\Characters\\QuestChars\\UFG\\Tess Carter.jpg">>
<<ChatMessage "You’re knocked down, but Tess and Clay cover you, taking out the rest. The thugs are down, Tiffany’s free, and she hugs Marcus *now in female form*.">>
<<ChatWithoutNPC 'Tiffany' _tiffanyImg "Brother… what did they do to you?">>
<<ChatWithoutNPC 'Marcus Bell' _marcusBellF "Damn… I’m… a woman? But… Tiffany’s safe, that’s what matters. Thank you all. Let’s get outta here.">>
<div class="btn padding-top"><<button "Continue" "Marcus_Quest3_Wait_MarcusPlace">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _marcusBellF = "Media\\Characters\\QuestChars\\UFG\\Marcus Bell_F.jpg">>
<<ChatMessage "Silence fills the house, curtains sway in a light breeze, the air tinged with the sweet musk of her new perfume. Marcus *female* invites you inside, her new body - slender, with rounded hips and full breasts - radiating allure. She steps closer, her eyes gleaming with curiosity and desire.">>
<<ChatWithoutNPC 'Marcus Bell' _marcusBellF "After everything… Grant saved me, training changed me. Now this body… I feel so alive. I want you, I want you to take me. Undress me, make me yours…">>
<<if $player.gender() == 'Male'>>
<<ChatMessage "The room glows with dim lamplight, the bed creaking under your weight. Marcus unbuttons her blouse, revealing perky breasts, her nipples hard. She pushes you back onto the bed, straddling your hips, her wet folds hovering teasingly above your throbbing cock.">>
<<ChatWithoutNPC 'Marcus Bell' _marcusBellF "Take me… I need you inside me.">>
<<if CheckContentFilter('Female')>><<Video "Media\\Sex\\Quest\\FightClub\\Marcus\\Quest3\\sex_f_w.mp4">><</if>>
<<ChatMessage "You shed your clothes, your cock throbbing, as she lowers herself onto you slowly, savoring the stretch. Her moans are a symphony of desire, her hands pressing against your chest as she begins to ride you deeper.">>
<<ChatWithoutNPC 'Marcus Bell' _marcusBellF "Harder… fill me up!">>
<<ChatMessage "Her movements quicken, bouncing with increasing intensity, her nails raking your chest, and an orgasm crashes over you both, her cries blending with your groan.">>
<<elseif $player.gender() == 'Shemale'>>
<<ChatMessage "Marcus’s gaze burns with hunger as she pulls you toward the bed. Her body-curvy, with soft hips and full breasts-beckons.">>
<<ChatWithoutNPC 'Marcus Bell' _marcusBellF "I want you… take me.">>
<<if CheckContentFilter('Female')>><<Video "Media\\Sex\\Quest\\FightClub\\Marcus\\Quest3\\sex_f_s.mp4">><</if>>
<<ChatMessage "She turns around, getting on all fours, her ass raised invitingly to reveal her slick, inviting pussy. Your cock is hard, and you enter her from behind, her tightness gripping you. Her moans grow louder, her body arching back against you.">>
<<ChatWithoutNPC 'Marcus Bell' _marcusBellF "Oh, damn, deeper… yes!">>
<<ChatMessage "Your thrusts intensify, her breasts swaying beneath her, her hands clutching the sheets. The orgasm hits like a tidal wave, her cry echoing as you both shudder in ecstasy.">>
<<elseif $player.gender() == 'Female'>>
<<ChatMessage "The room hums with warmth, Marcus pulling you into a hungry kiss, her lips soft and urgent. She strips off her clothes, revealing smooth skin, firm breasts, and a glistening slit between her thighs.">>
<<ChatWithoutNPC 'Marcus Bell' _marcusBellF "I want you… touch me.">>
<<if CheckContentFilter('Female')>><<Video "Media\\Sex\\Quest\\FightClub\\Marcus\\Quest3\\69.mp4">><</if>>
<<ChatMessage "She lies back on the bed. You slide your fingers along her body, teasing her nipples, then dipping lower to stroke her clit in slow, deliberate circles.">>
<<ChatWithoutNPC 'Marcus Bell' _marcusBellF "Yes, like that… don’t stop!">>
<<ChatMessage "Your lips explore her neck, her breasts, as your fingers work her, her body trembling. She climaxes with a shuddering cry, her pleasure sparking your own as you melt into each other.">>
<</if>>
<<ChatWithoutNPC 'Marcus Bell' _marcusBellF "Whew… that was… so damn hot. Now I’ll save Tiffany for real.">>
<<ChatMessage "Marcus’s backstory revealed, quest completed with his transformation and intimate moment.">>
<div class="btn padding-top"><<button "Continue" "Underground_Fight_Gym">><<set $MarcusStoryProgress = 3>><<set $canShowStatsBtn = true>><<set $gameSettings.allowSaves = true>> <</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/Other/UFG/gang_house_tiffany_room.jpg">>
<<include "CharactersData">>
<<run _jumpThug = CreateCharacter({isPlayer:false, characterWork:"Thug", gender:"Male", sexualPreference:"Bi", clothesPreference:"men", firstName:"Thug", lastName:"", skin:'White', age:30, defense:5, agility:5, strength:5, isQuestCharacter:true, questCharID:21, currentQuestID:0, currentCharImg:"Media\\Characters\\QuestChars\\UFG\\gang3.jpg"}, true)>>
<<unset $maleNames $femaleNames $surnames>>
<<set $indexNPC = $Characters.indexOf(_jumpThug)>>
<<set $interactionNpc = $Characters[$indexNPC]>>
<<set _battleSetControls = {attack: true, seduce: false, items: false, actions: true}>>
<<StartFight $player $interactionNpc _battleSetControls 'Marcus_Quest3_JumpIn_Win' 'Marcus_Quest3_JumpIn_Lose'>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<DeleteCharacter $interactionNpc>>
<<set _marcusBell = "Media\\Characters\\QuestChars\\UFG\\Marcus Bell_M.jpg">>
<<set _clayHarper = "Media\\Characters\\QuestChars\\UFG\\Clay Harper.jpg">>
<<set _tessCarter = "Media\\Characters\\QuestChars\\UFG\\Tess Carter.jpg">>
<<set _tiffanyImg = "Media\\Characters\\QuestChars\\UFG\\Tiffany.jpg">>
<<ChatMessage "The thugs are down, Marcus is free, no one’s transformed. Tess and Clay arrive with Tiffany, finishing off any stragglers.">>
<<ChatWithoutNPC 'Marcus Bell' _marcusBell "You saved me! After the gang’s beating, Grant’s training… you’re a hero. Tiffany’s free. Thank you all-family’s safe.">>
<<ChatWithoutNPC 'Tiffany' _tiffanyImg "Brother… you’re all incredible.">>
<<ChatWithoutNPC 'Clay Harper' _clayHarper "Job’s done.">>
<<ChatWithoutNPC 'Tess Carter' _tessCarter "I’m proud of us.">>
<<ChatMessage "Marcus’s backstory revealed, quest completed without transformations or intimate moments.">>
<div class="btn padding-top"><<button "Continue" "Underground_Fight_Gym">><<set $MarcusStoryProgress = 3>><<set $canShowStatsBtn = true>><<set $gameSettings.allowSaves = true>> <</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<DeleteCharacter $interactionNpc>>
<<if $player.gender() == 'Male'>>
<<goto "Marcus_Quest3_JumpIn_Lose_Male">>
<<elseif $player.gender() == 'Shemale'>>
<<goto "Marcus_Quest3_JumpIn_Lose_Trans">>
<<elseif $player.gender() == 'Female'>>
<<goto "Marcus_Quest3_JumpIn_Lose_Female">>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<run $player.characterEvents.registerEvent($player.info.id, "PlayerFem", 1)>>
<<set _marcusBell = "Media\\Characters\\QuestChars\\UFG\\Marcus Bell_M.jpg">>
<<set _tessCarter = "Media\\Characters\\QuestChars\\UFG\\Tess Carter.jpg">>
<<set _clayHarper = "Media\\Characters\\QuestChars\\UFG\\Clay Harper.jpg">>
<<set _tiffanyImg = "Media\\Characters\\QuestChars\\UFG\\Tiffany.jpg">>
<<ChatMessage "The thugs overpower you, injecting the drug: your body transforms-breasts swell, hips round out, your voice turns soft and feminine. Shock hits, but Tess and Clay *with Tiffany* arrive, finishing off the thugs.">>
<<run $player.body.face.value = 6>>
<<run $player.body.penisSize.value = 0>>
<<run $player.body.vaginaSize.value = 1>>
<<run $player.body.breastSize.value = 4>>
<<run $player.body.buttSize.value = 4>>
<<run $player.info.clothesPreference = "women">>
<<run $player.AddCloth(true)>>
<<ChatWithoutNPC 'Tess Carter' _tessCarter "You… turned into a woman?">>
<<ChatWithoutNPC 'Clay Harper' _clayHarper "Hang in there! We took ‘em out.">>
<<ChatWithoutNPC 'Marcus Bell' _marcusBell "Damn, thank you… you risked everything. Tiffany’s free. Come to my place-let’s celebrate.">>
<div class="btn padding-top"><<button "Continue" "Marcus_Quest3_JumpIn_MarcusPlace_Male">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _marcusBell = "Media\\Characters\\QuestChars\\UFG\\Marcus Bell_M.jpg">>
<<ChatMessage "His apartment smells of whiskey and leather, dim light casting shadows. Marcus eyes your new body - slender, with enticing curves - and his gaze ignites.">>
<<ChatWithoutNPC 'Marcus Bell' _marcusBell "After Grant, the fights… I’ve changed. And you… damn, you’re gorgeous now. Lie down, baby, I’m gonna make you feel good.">>
<<ChatMessage "Marcus pulls you to the bed, his hands tearing off your clothes, exposing your new breasts and wet folds. He looms over you, his cock hard, eyes blazing.">>
<<ChatWithoutNPC 'Marcus Bell' _marcusBell "You’re mine.">>
<<if CheckContentFilter('Male')>><<Video "Media\\Sex\\Quest\\FightClub\\Marcus\\Quest3\\sex_f_b.mp4">><</if>>
<<ChatMessage "He enters you slowly, teasingly. His thrusts deepen, rhythmic, your moans filling the room.">>
<<Chat $player "Oh, Marcus… deeper… fill me!">>
<<ChatMessage "His hands pin your wrists, the bed creaking as he drives into you. The orgasm crashes over you, your cries blending with his hoarse groan.">>
<<ChatMessage "Marcus’s backstory revealed, quest completed with your transformation and intimate moment.">>
<div class="btn padding-top"><<button "Continue" "Underground_Fight_Gym">><<set $MarcusStoryProgress = 3>><<set $canShowStatsBtn = true>><<set $gameSettings.allowSaves = true>> <</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _marcusBell = "Media\\Characters\\QuestChars\\UFG\\Marcus Bell_M.jpg">>
<<set _tessCarter = "Media\\Characters\\QuestChars\\UFG\\Tess Carter.jpg">>
<<set _clayHarper = "Media\\Characters\\QuestChars\\UFG\\Clay Harper.jpg">>
<<set _tiffanyImg = "Media\\Characters\\QuestChars\\UFG\\Tiffany.jpg">>
<<ChatMessage "The thugs overpower you but don’t inject the drug, seeing your unique body. Instead, they beat you harder, but Tess and Clay *with Tiffany* arrive, finishing them off.">>
<<ChatWithoutNPC 'Tess Carter' _tessCarter "You okay? Those bastards…">>
<<ChatWithoutNPC 'Clay Harper' _clayHarper "Hang in there! We got ‘em.">>
<<ChatWithoutNPC 'Marcus Bell' _marcusBell "Damn, thank you… you risked it all. Tiffany’s free. Come to my place-let’s celebrate.">>
<div class="btn padding-top"><<button "Continue" "Marcus_Quest3_JumpIn_MarcusPlace_Trans">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _marcusBell = "Media\\Characters\\QuestChars\\UFG\\Marcus Bell_M.jpg">>
<<ChatMessage "His apartment is a warm haven, smelling of whiskey and leather. Marcus steps closer, his eyes tracing your body with admiration.">>
<<ChatWithoutNPC 'Marcus Bell' _marcusBell "After Grant, the fights… I’ve changed. And you… damn, you’re hot. Lie down, I wanna take you.">>
<<ChatMessage "Marcus pushes you onto the bed, his hands ripping off your clothes. He looms over you, his cock hard, ready.">>
<<ChatWithoutNPC 'Marcus Bell' _marcusBell "You’re mine.">>
<<if CheckContentFilter('Male')>><<Video "Media\\Sex\\Quest\\FightClub\\Marcus\\Quest3\\sex_s_b.mp4">><</if>>
<<ChatMessage "He enters you slowly, stretching you with deliberate care. His thrusts grow stronger, your moans echoing.">>
<<Chat $player "Oh, damn, deeper… finish in me!">>
<<ChatMessage "His hands grip your hips, the bed shaking as he pounds into you. The orgasm hits hard, his cry blending with yours as you both collapse in a sweaty, blissful haze.">>
<<ChatMessage "Marcus’s backstory revealed, quest completed without your transformation, with intimate moment.">>
<div class="btn padding-top"><<button "Continue" "Underground_Fight_Gym">><<set $MarcusStoryProgress = 3>><<set $canShowStatsBtn = true>><<set $gameSettings.allowSaves = true>> <</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _marcusBell = "Media\\Characters\\QuestChars\\UFG\\Marcus Bell_M.jpg">>
<<set _tessCarter = "Media\\Characters\\QuestChars\\UFG\\Tess Carter.jpg">>
<<set _clayHarper = "Media\\Characters\\QuestChars\\UFG\\Clay Harper.jpg">>
<<set _tiffanyImg = "Media\\Characters\\QuestChars\\UFG\\Tiffany.jpg">>
<<ChatMessage "The thugs overpower you but don’t inject the drug, as you’re already a woman. Instead, they beat you harder, but Tess and Clay *with Tiffany* arrive, finishing them off.">>
<<ChatWithoutNPC 'Tess Carter' _tessCarter "You okay? Those bastards…">>
<<ChatWithoutNPC 'Clay Harper' _clayHarper "Hang in there! We got ‘em.">>
<<ChatWithoutNPC 'Marcus Bell' _marcusBell "Damn, thank you… you risked everything. Tiffany’s free. Come to my place-let’s celebrate.">>
<div class="btn padding-top"><<button "Continue" "Marcus_Quest3_JumpIn_MarcusPlace_Female">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _marcusBell = "Media\\Characters\\QuestChars\\UFG\\Marcus Bell_M.jpg">>
<<ChatMessage "His apartment glows with warmth, lamplight casting a soft hue. Marcus looks at you with hunger, his hands reaching for you.">>
<<ChatWithoutNPC 'Marcus Bell' _marcusBell "After Grant, the fights… I’ve changed. And you… damn, you’re hot. Lie down, baby, I want you.">>
<<ChatMessage "Marcus pulls you to the bed, his fingers stripping your clothes, exposing your skin. He hovers over you, his cock hard, eyes burning with desire.">>
<<ChatWithoutNPC 'Marcus Bell' _marcusBell "You’re mine.">>
<<if CheckContentFilter('Male')>><<Video "Media\\Sex\\Quest\\FightClub\\Marcus\\Quest3\\sex_f_b.mp4">><</if>>
<<ChatMessage "He slides into you slowly, teasingly. His thrusts deepen, rhythmic, your moans filling the air.">>
<<Chat $player "Marcus… deeper… finish in me!">>
<<ChatMessage "His hands grip your wrists, the bed creaking as he drives into you. The orgasm surges, your cries blending with his rough groan.">>
<<ChatMessage "Marcus’s backstory revealed, quest completed without your transformation, with intimate moment.">>
<div class="btn padding-top"><<button "Continue" "Underground_Fight_Gym">><<set $MarcusStoryProgress = 3>><<set $canShowStatsBtn = true>><<set $gameSettings.allowSaves = true>> <</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if $player.characterEvents.isEventRegistered($player.info.id, "MarcusFem") == false>>
<<set _marcusBell = "Media\\Characters\\QuestChars\\UFG\\Marcus Bell_M.jpg">>
<<else>>
<<set _marcusBell = "Media\\Characters\\QuestChars\\UFG\\Marcus Bell_F.jpg">>
<</if>>
<<DrawImg _marcusBell>>
<<set _strAtMax = $player.attributes.strength.value >= $player.attributes.strength.max>>
<<if $player.characterEvents.isEventRegistered($player.info.id, "GetClayApproval") == false>>
<<ChatWithoutNPC 'Marcus Bell' _marcusBell 'Get permission from Clay first, then come on back.'>>
<<elseif $MarcusStoryProgress == 0>>
<<ChatWithoutNPC 'Marcus Bell' _marcusBell 'Hey, wanna fight?'>>
<div class="btn padding-top"><<button "Yes, I'm ready" "MarcusStartQuestFight">><</button>></div>
<<elseif $MarcusStoryProgress == 1>>
<<goto "Marcus_Quest2_Start">>
<<elseif $MarcusStoryProgress == 2>>
<<goto "Marcus_Quest3_Start">>
<<else>>
<<if _strAtMax>>
<<ChatWithoutNPC 'Marcus Bell' _marcusBell 'You\'re as strong as you\'re gonna get with me.'>>
<div class="btn padding-top non-interacting"><<button "Strength (MAX)">><</button>></div>
<<else>>
<<ChatWithoutNPC 'Marcus Bell' _marcusBell 'Need to bulk up? I can train your strength for $250.'>>
<div class="btn padding-top"><<button "Train my strength ($250)" "Marcus_TrainStrength">><</button>></div>
<</if>>
<</if>>
<div class="btn padding-top"><<button "Continue" "Underground_Fight_Gym">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if $player.characterEvents.isEventRegistered($player.info.id, "MarcusFem") == false>>
<<set _marcusBell = "Media\\Characters\\QuestChars\\UFG\\Marcus Bell_M.jpg">>
<<else>>
<<set _marcusBell = "Media\\Characters\\QuestChars\\UFG\\Marcus Bell_F.jpg">>
<</if>>
<<if $player.money < 250>>
<<ChatWithoutNPC 'Marcus Bell' _marcusBell 'You need $250 to train.'>>
<div class="btn padding-top"><<button "Back" "Marcus_Checker">><</button>></div>
<<else>>
<<set $player.money -= 250>>
<<SpendEnergy $player 20>>
<<SpendTimeWithoutUpdate 30>>
<<set _gain = Random(10,20) + $player.attributes.intelligence.value>>
<<SetCharProgression $player 'strength' _gain true>>
<<ChatWithoutNPC 'Marcus Bell' _marcusBell 'Feel that power building? Keep at it.'>>
<div class="btn padding-top"><<button "Back" "Marcus_Checker">><</button>></div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "CharactersData">>
<<run _marcusCharacter = CreateCharacter({
isPlayer: false,
characterWork: "Quest",
gender: "Male",
sexualPreference: "Bi",
clothesPreference: "men",
firstName: "Marcus",
lastName: "Bell",
skin: 'White',
age: 30,
defense: 5,
agility: 2,
strength: 6,
isQuestCharacter: true,
questCharID: 17,
currentQuestID: 0,
currentCharImg: "Media\\Characters\\QuestChars\\UFG\\Marcus Bell_M.jpg",
}, true)>>
<<unset $maleNames $femaleNames $surnames>>
<<run $player.characterEvents.registerEvent(_marcusCharacter.info.id, "knows you", 1)>>
<<set $indexNPC = $Characters.indexOf(_marcusCharacter)>>
<<set $interactionNpc = $Characters[$indexNPC]>>
<<set _battleSetControls = {attack: true, seduce: false, items: false, actions: true, noWeapons: true}>>
<<StartFight $player $interactionNpc _battleSetControls 'MarcusQuestFightWin' 'MarcusQuestFightLose'>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set $marcusFightWon = true>>
<div class="btn padding-top"><<button "Continue" "Marcus_Quest1">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set $marcusFightWon = false>>
<div class="btn padding-top"><<button "Continue" "Marcus_Quest1">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set $canShowStatsBtn = false>>
<<set $gameSettings.allowSaves = false>>
<<run $player.characterEvents.registerEvent($player.info.id, "TessQuest1", 1)>>
<<Chat $interactionNpc 'Phew, good fight. You really made me work up a sweat. Listen, tonight I\'m cleaning up here- that\'s my rent to Grant for letting me crash in the gym. Without this, I\'d still be out on the streets. Wanna help? It\'ll go faster with two of us, and… we can chat.'>>
<<Chat $player 'Alright, I\'ll come by tonight. Why do you live here anyway? Sounds like you\'ve got your own story.'>>
<<Chat $interactionNpc 'Story? I\'ll spill it tonight while we clean. I don\'t like chatting on an empty stomach… or in the ring. See you after sunset.'>>
<<ChatMessage 'Evening: The gym\'s empty, just the dim light from the lamps and the smell of cleaning supplies. Tess is already there, bucket and mop in hand. You join in, starting to scrub the floors and wipe down the mats. The conversation flows naturally as you work side by side.'>>
<<Chat $interactionNpc 'Thanks for showing up. Without help, this drags on forever. You know, my family was a total mess. Dad was an alcoholic, beat the crap out of Mom and me all the time. From when I was a kid, I got used to bruises - he\'d get wasted and flip out on us over any little thing. Mom kept saying it would pass, but it never did. I learned to hide, but inside, I was boiling with rage and fear.'>>
<<Chat $player 'Sounds rough. How\'d you deal with it?'>>
<<Chat $interactionNpc 'Survived however I could. School during the day, hiding under the bed at night. But enough of the downer stuff-let\'s hustle with these mats. You\'re holding up pretty well after our fight.'>>
<<ChatMessage 'You both reach for the same rag, and Tess slips on the wet floor, falling right onto you. Your bodies press together - her chest against yours, breaths mingling, eyes locking up close. The vibe heats up from the accidental contact.'>>
<<Chat $interactionNpc '*Blushing, but not pulling away right away* Oops, damn… sorry. The floor\'s slippery as hell. You okay?'>>
<<Chat $player 'Falling on me-is that a new cleaning technique? After that… my body\'s buzzing. Maybe we relieve some tension?'>>
<div class="btn padding-top"><<button "Joke" "Tess_Quest1_Joke">><</button>></div>
<div class="btn padding-top"><<button "Flirt" "Tess_Quest1_Flirt">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<Chat $player 'Ha, if you fall on everyone like that, the gym\'ll be spotless in five minutes. Get up, or Grant\'ll think we\'re slacking off.'>>
<<Chat $interactionNpc '*Laughs, standing up* You\'re right, we\'re a couple of lazies. Alright, let\'s wrap this up and head out. Thanks for the help - and for listening to my story.'>>
<div class="btn padding-top"><<button "Continue" "Underground_Fight_Gym">>
<<if $player.characterEvents.isEventRegistered($player.info.id, "GetTessApproval") == false>>
<<run $player.characterEvents.registerEvent($player.info.id, "GetTessApproval", 1)>>
<<set $ApprovalReceived += 1>>
<<DeleteCharacter $interactionNpc>>
<</if>>
<<set $tessStoryProgress = 1>>
<<set $canShowStatsBtn = true>>
<<set $gameSettings.allowSaves = true>>
<</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<Chat $interactionNpc '*Breath quickening, not pulling away* Tension? After the fight and this… yeah, it\'s through the roof. But it depends on who won in the ring.'>>
<<if $tessFightWon == true>>
<<Chat $interactionNpc 'You took me down during the day… now it\'s my turn to take care of you. Sit on the mat… let me handle that with my hand.'>>
<<if $player.gender() == 'Male' || $player.gender() == 'Shemale'>>
<<if CheckContentFilter('Female')>><<Video "Media\\Sex\\Quest\\FightClub\\Tess\\Quest1\\blowjob_m_s.mp4">><</if>>
<<ChatMessage 'The dim overhead lights cast flickering shadows across the sweat-slicked gym mats as Tess straddles your lap, her calloused fighter\'s hands already working their way beneath the waistband of your shorts. The scent of bleach and lemon cleaner mixes with the musky aroma of your combined exertion from earlier, creating an intoxicating atmosphere thick with sexual tension.'>>
<<ChatMessage 'Her breath comes in quick, shallow bursts against your neck as she frees your rapidly hardening cock, her fingers wrapping around the thick base with practiced ease despite the roughness of her knuckles. "Fuck… knew you\'d be packing," she murmurs, thumb swiping across the leaking tip to gather precum before spreading it down your length in slow, deliberate strokes.'>>
<<ChatMessage 'She responds by tightening her grip, using her free hand to pin your thigh to the mat as she leans closer, her sports bra barely containing the swell of her breasts as they brush against your chest.'>>
<<ChatMessage '"Gotta stay still for me, champ," she teases, her tongue darting out to wet her lips as she adjusts her rhythm, twisting her wrist on the upstroke in a way that makes your balls tighten. The sound of skin sliding against slick flesh echoes slightly in the empty gym, punctuated by her occasional soft grunts and the distant dripping of a leaky shower head down the hall.'>>
<<ChatMessage 'Tess\'s tempo increases relentlessly, her fist pistoning along your throbbing length with the same disciplined rhythm she uses in the ring - controlled violence disguised as grace. Her breathing grows ragged as she watches your abdomen tense, her dark eyes drinking in every twitch and shudder running through your body.'>>
<<ChatMessage '"That\'s it… fucking take it," she growls through clenched teeth, her thumb now circling the swollen crown with bruising pressure, smearing sticky strands of precum across the sensitive slit. The muscles in her forearm flex visibly as she applies just enough friction to border on pain, her other hand suddenly grabbing a handful of your hair to yank your head back against the mat.'>>
<<ChatMessage 'Your climax hits like a sucker punch to the gut - a white-hot detonation that has ropes of thick cum erupting in pulsing waves across Tess\'s scarred knuckles and toned stomach. She doesn\'t let up for a second, milking every last drop from you with ruthless efficiency, her grip tightening as she wrings out aftershocks that leave your thighs trembling.'>>
<<Chat $interactionNpc 'Not bad workout.'>>
<<elseif $player.gender() == 'Female'>>
<<if CheckContentFilter('Female')>><<Video "Media\\Sex\\Quest\\FightClub\\Tess\\Quest1\\fing_f.mp4">><</if>>
<<ChatMessage 'Tess finally releases her vise-like hold only when you\'re completely spent, lazily tracing patterns in the cooling mess on her abdomen with two fingers before bringing them to her mouth. "Tastes like victory," she purrs, licking her lips with deliberate slowness as she rises to her feet, leaving you sprawled and breathless on the still-damp mat.'>>
<<ChatMessage 'The humid air of the empty gym locker room hangs thick with the scent of sweat, disinfectant, and something far muskier - an undeniable arousal lingering between you and Tess as she pins you down against the wrestling mat. Her calloused fingers, hardened from years of street fighting and survival, trace teasing circles along your inner thigh, her breath hot against your neck as she leans in closer. The flickering fluorescent light above casts erratic shadows across her toned torso, still glistening from the earlier sparring session. Her tank top clings to her damp skin, the fabric stretched taut over the swell of her firm breasts with each ragged inhale.'>>
<<ChatMessage '"Fuck… you really did a number on me today," she murmurs, her free hand sliding up to palm her own nipple through the thin material, "but fair\'s fair. Winner takes all." Her knee presses firmly between your legs, applying just enough pressure to make you arch into her touch as her fingertips finally brush against your soaked panties. The damp fabric clings obscenely to your folds, and she lets out a low chuckle at how easily your body betrays your hunger for her.'>>
<<ChatMessage 'With deliberate slowness, she hooks her thumbs into the waistband of your shorts and peels them down your thighs, the sound of elastic snapping against skin echoing in the tiled room. Her nostrils flare as the heady scent of your arousal hits her - a mix of salt and sweet that makes her tongue dart out to wet her lips. "Christ, you\'re already dripping,"'>>
<<ChatMessage 'Tess growls, dragging her middle finger through your slick pussy lips with agonizing precision, collecting your juices before bringing it to her mouth. She sucks the digit clean with a filthy, exaggerated pop of her lips, amber eyes darkening as she tastes you. "Mmm… fucking addictive." Her voice drops to a husky whisper as she replaces her finger with two, spreading your glistening lips apart to expose your swollen clit to the humid air.'>>
<<ChatMessage 'The first slow circle she traces around that sensitive bud wrings a gasp from your throat - her callouses catching deliciously against your tender flesh. She watches your face intently, drinking in every twitch of your brows, every bitten lip as she teases you with featherlight strokes just shy of where you need her most. "Look at you," she pants, rolling her hips unconsciously against the mat beneath her, "all worked up from just my fingers. Bet you came imagining this when you pinned me earlier, huh?"'>>
<<ChatMessage 'Without warning, she curls those skilled fingers deep inside you, the heel of her palm grinding against your clit as she pistons into your tightening core. The squelch of your arousal is obscenely loud in the empty locker room, mixing with the slap of skin on skin as she fucks you harder, faster - her own thighs squeezing together at the sounds you\'re making. A sheen of sweat breaks out across her collarbones as she fights to keep her rhythm steady, her biceps flexing with each punishing thrust.'>>
<<ChatMessage '"That\'s it-fucking take it," Tess snarls, her breath coming in ragged bursts as she scissors her fingers inside you, stretching your walls with every brutal snap of her wrist. The muscles in her forearm cord with tension, veins standing out against her sun-kissed skin as she drives you relentlessly toward the edge. Her thumb finds your clit again, rubbing tight, frantic circles that send electric jolts straight to your trembling thighs.'>>
<<ChatMessage 'She leans down suddenly, capturing your moan with a searing kiss-all teeth and dominance-as her tongue mirrors the filthy motions of her fingers. You can taste yourself on her lips, bitter and intoxicating, as she swallows every broken whimper you offer. The bench beneath you creaks dangerously with the force of her thrusts, the metal legs scraping against tile in time with your escalating gasps.'>>
<<ChatMessage 'Tess doesn\'t let up for a second - her fingers crook just right, hitting that spongy spot inside you with military precision as her thumb grinds mercilessly against your pulsating clit. The orgasm crashes into you like a freight train, your back bowing off the mat as a scream tears from your throat. She drinks it in greedily, watching your eyelids flutter wildly, your nails carving half-moons into her shoulders as you gush around her relentless fingers.'>>
<<ChatMessage '"Fuck yes, look at you," she rasps, riding out your convulsions with slow, deep pumps-milking every last spasm from your oversensitive cunt. "So fucking pretty when you come…" Her own hips jerk involuntarily against your thigh, her denim-clad pussy leaving a dark streak of her arousal on your skin. She\'s achingly hard, her neglected clit throbbing in time with your aftershocks, but she makes no move to relieve herself-too focused on lapping up your juices as they drip down her knuckles.'>>
<<Chat $interactionNpc 'Not bad workout.'>>
<</if>>
<<else>>
<<ChatMessage 'The damp, humid air of the gym hangs thick with the scent of sweat, bleach, and something far more primal as Tess pins you beneath her, her toned thighs straddling your waist with practiced ease. Her breath comes in short, heated bursts against your neck - a mix of exertion from the earlier fight and the sudden, undeniable electricity between you. The dim overhead lights cast flickering shadows across her flushed face, emphasizing the predatory gleam in her dark eyes as she leans down, lips brushing the shell of your ear.'>>
<<Chat $interactionNpc 'You lost to me today… fair and square. That means you owe me.'>>
<<ChatMessage 'Her voice is a low purr, laced with challenge and something darker-something hungry. One calloused hand slides down your torso, fingers tracing the divots of your abs before slipping lower, past the waistband of your shorts with deliberate slowness. Her other hand grips your wrist, guiding it toward the soaked fabric between her legs.'>>
<<if $player.gender() == 'Female' || $player.gender() == 'Shemale'>>
<<if CheckContentFilter('Female')>><<Video "Media\\Sex\\Quest\\FightClub\\Tess\\Quest1\\fing_f.mp4">><</if>>
<<else>>
<<if CheckContentFilter('Female')>><<Video "Media\\Sex\\Quest\\FightClub\\Tess\\Quest1\\fing_M.mp4">><</if>>
<</if>>
<<ChatMessage 'Beneath your fingertips, the heat radiating from Tess\'s cunt is immediate, even through her leggings. The material clings obscenely to her folds, already damp with more than just sweat. She grinds down against your palm with a throaty chuckle, "Feel that? All day, thinking about our fight… about you. Now fix it."'>>
<<ChatMessage 'Her command leaves no room for refusal. Every shift of her hips, every ragged exhale against your skin is a demand - an unspoken threat wrapped in velvet. The gym fades around you; the squeak of sneakers on wet tile, the distant hum of the fridge in the breakroom-none of it matters now.'>>
<<ChatMessage 'Tess arches her back with a sharp inhale as your fingers find the slick seam of her leggings, peeling the drenched fabric aside to expose her swollen, glistening pussy. The scent of her arousal floods your senses-musky, sweet, and utterly intoxicating. Her inner thighs tremble against your hips, betraying the tension coiling tight in her core despite her dominant facade.'>>
<<ChatMessage '"Fucking-yes," she hisses, nails biting into your shoulder as you drag a fingertip along her dripping slit. The pad of your thumb circles her clit in slow, teasing strokes, drawing out a broken gasp from her throat. Her hips jerk forward, desperate for more friction, but she forces herself still, grinding her teeth. "Don\'t… don\'t you dare rush this. You\'re mine tonight-every last fucking inch of you."'>>
<<ChatMessage 'Her words drip with venomous desire, but her body tells another story - the way her cunt pulses around nothing, how her breath hitches when you slide two fingers inside without warning. The walls of her pussy clamp down greedily, sucking you deeper as she lets out a guttural moan. Sweat beads at her temples, her dark hair sticking to her skin as she rides your hand with increasing urgency.'>>
<<Chat $interactionNpc 'Not bad workout.'>>
<</if>>
<div class="btn padding-top"><<button "Continue" "Underground_Fight_Gym">>
<<if $player.characterEvents.isEventRegistered($player.info.id, "GetTessApproval") == false>>
<<run $player.characterEvents.registerEvent($player.info.id, "GetTessApproval", 1)>>
<<set $ApprovalReceived += 1>>
<</if>>
<<set $tessStoryProgress = 1>>
<<set $canShowStatsBtn = true>>
<<set $gameSettings.allowSaves = true>>
<<DeleteCharacter $interactionNpc>>
<</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground>>
<<set $canShowStatsBtn = false>>
<<set $gameSettings.allowSaves = false>>
<<include "CharactersData">>
<<set _tessCarter = "Media\\Characters\\QuestChars\\UFG\\Tess Carter.jpg">>
<<run $player.characterEvents.registerEvent($player.info.id, "TessQuest2", 1)>>
<<ChatMessage "You approach Tess, who's just finished her workout, wiping sweat off with a towel. Her eyes light up with a spark when she sees you, but a fleeting shadow of old pain lingers in them.">>
<<ChatWithoutNPC 'Tess Carter' _tessCarter "Hey, good to see you. After workouts, I usually head to the park nearby - it's quiet, helps me unwind and get back to normal. Wanna come with? It'll be nice to walk and talk without all the gym noise.">>
<<Chat $player "Alright, let's go. You seem like someone who loves spots like that. Why does the park help?">>
<<ChatWithoutNPC 'Tess Carter' _tessCarter "It reminds me of freedom - no walls, no pressure. Come on, I'll tell you on the way. You know, my dad... he didn't just beat us. When I turned 16, I decided to fight back. One time he got wasted again and went after Mom - I stepped between them, yelling, \"Enough!\" But he... damn, he beat me so bad I could barely breathe. Bruises, cracked rib. Ever since, if I see someone like him, terror paralyzes me - my body freezes up like in a nightmare. The cops? They showed up, but wouldn't arrest him: \"Family matter.\" Mom was too scared to press charges, kept saying, \"Don't make it worse.\" I felt trapped, helpless.">>
<<Chat $player "That's awful. You're brave for sharing. How'd you get out of it?">>
<<ChatWithoutNPC 'Tess Carter' _tessCarter "Survived however I could. But the park... here I breathe easy, forget the fear. With you around - it's even better.">>
<div class="btn padding-top"><<button "Continue" "Tess_Quest2_Park">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "CharactersData">>
<<set _tessCarter = "Media\\Characters\\QuestChars\\UFG\\Tess Carter.jpg">>
<<SetBackground "Media/Locations/City/Park/Park.jpg">>
<<ChatMessage "The park buzzes with life under the afternoon sun - lush green paths winding between trees, benches scattered like invitations, birds chirping melodies overhead. You're strolling side by side, Tess's posture loosening up, her steps lighter, but suddenly she stiffens like a coiled spring. A guy struts up - her ex-boyfriend, Dan, sporting a cocky, aggressive smirk. He's clearly buzzed, his eyes burning with ugly spite.">>
<<run _dan = CreateCharacter({
isPlayer: false,
characterWork: "Tess's ex",
gender: "Male",
sexualPreference: "Bi",
clothesPreference: "men",
firstName: "Dan",
lastName: "",
skin: 'White',
age: 30,
defense: 3,
agility: 2,
strength: 5,
isQuestCharacter: true,
questCharID: 13,
currentQuestID: 0,
currentCharImg: "Media\\Characters\\QuestChars\\UFG\\Tess_Ex_BF.jpg",
}, true)>>
<<set $indexNPC = $Characters.indexOf(_dan)>>
<<set $interactionNpc = $Characters[$indexNPC]>>
<<run $player.characterEvents.registerEvent(_dan.info.id, "knows you", 1)>>
<<Chat _dan "Tess? Who's this freak with you? You slumming it again?">>
<<if $player.gender() == 'Male'>>
<<Chat _dan "Hey, asshole, get lost before I bash your face in. She's mine!">>
<<else>>
<<Chat _dan "Tess, still such a whore? Who you fucking now?">>
<</if>>
<<ChatWithoutNPC 'Tess Carter' _tessCarter "*haking visibly, but clenching her fists to steady herself* Back off, Dan. We're done, just leave.">>
<<Chat _dan "*Looming closer with a nasty snarl* Shut your mouth, bitch. I decide when I go.">>
<div class="btn padding-top"><<button "Fight" >>
<<set _battleSetControls = {attack: true, seduce: false, items: false, actions: true}>>
<<StartFight $player _dan _battleSetControls 'Tess_Quest2_Win' 'Tess_Quest2_Lose'>>
<</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<DeleteCharacter $interactionNpc>>
<<set _tessCarter = "Media\\Characters\\QuestChars\\UFG\\Tess Carter.jpg">>
<<ChatMessage "The ex crumples to the ground with a pathetic thud, spitting curses as he scrambles back, clutching his busted jaw before bolting like a coward. Tess rushes over, her eyes wide and alive with a mix of gratitude and raw adrenaline pumping through her veins. She dabs at the blood on your face with a handkerchief, her trembling fingers lingering, brushing tenderly across your cheek and lips like a spark igniting dry tinder.">>
<<ChatWithoutNPC 'Tess Carter' _tessCarter "Damn, you straight-up demolished him... thanks for having my back like that. That asshole's cut from the same cloth as my dad - I keep drawing in the worst. But you? You make me feel unbreakable. And holy shit, after that rush... my whole body's on fire. Wanna duck into those bushes over there, away from prying eyes? Let me show you how grateful I really am - make you explode.">>
<div class="btn padding-top"><<button "Play it off as a joke." "Tess_Quest2_Win_Joke">><</button>></div>
<div class="btn padding-top"><<button "Agree." "Tess_Quest2_Win_Agree">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _tessCarter = "Media\\Characters\\QuestChars\\UFG\\Tess Carter.jpg">>
<<Chat $player "Ha, thanks? Coffee next time'll do. Otherwise, people might think we're filming a movie here.">>
<<ChatWithoutNPC 'Tess Carter' _tessCarter "*Laughs, her cheeks flushing pink* Alright, coffee it is. You're a total hero. Let's bounce before he slinks back.">>
<div class="btn padding-top"><<button "Continue" "Park">><</button>></div>
<<set $tessStoryProgress = 2>>
<<set $canShowStatsBtn = true>>
<<set $gameSettings.allowSaves = true>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _tessCarter = "Media\\Characters\\QuestChars\\UFG\\Tess Carter.jpg">>
<<Chat $player "Thank me? Sounds tempting. Lead the way.">>
<<ChatMessage "Tess grins wickedly, grabbing your hand and yanking you into the dense bushes, her breath coming in hot, excited bursts against your skin.">>
<<ChatWithoutNPC 'Tess Carter' _tessCarter "Fuck, it's so secluded here... strip down and get comfy. I'm gonna worship you with my mouth and hands-slow at first, then deep and filthy, making every inch of you pulse with need. Can you feel how soaked I am just thinking about it?">>
<<ChatMessage "She drops low, her voice turning into a husky whisper laced with pure lust as she starts pleasuring you.">>
<<ChatWithoutNPC 'Tess Carter' _tessCarter "Mmm, you're throbbing so hard for me... let it build, then unleash-cum hard, quietly, feed me every last drop of your hot, sticky ecstasy...">>
<<if $player.gender() == 'Male'>>
<<if CheckContentFilter('Female')>><<Video "Media\\Sex\\Quest\\FightClub\\Tess\\Quest2\\blowjob_m_s.mp4">><</if>>
<<ChatMessage "Tess lunges forward hungrily, her hot mouth engulfing your thick cock in one slick slide-sucking with greedy pulls, her tongue dancing wild circles around the shaft, throat contracting as she takes you balls-deep without mercy.">>
<<ChatWithoutNPC 'Tess Carter' _tessCarter "Feel that throb? Your veins popping, balls churning out pre-cum like crazy? Ram my skull if you want-own this throat. You're driving me wild, making my pussy drip... blast it down my gullet, drown me in your hot seed like the cum-slut I crave to be for you...">>
<<ChatMessage "Bushes sway with the rhythm, her slurps and gags mixing with rustling leaves, vibrations shooting straight to your balls. The orgasm slams into you like a freight train, pumping thick ropes of cum that she devours greedily, her eyes locked on yours, wild and satisfied, as she licks her lips clean of your cum.">>
<<ChatWithoutNPC 'Tess Carter' _tessCarter "Mmm, goddamn... that hit different. You're my savior, you stud.">>
<<elseif $player.gender() == 'Female'>>
<<if CheckContentFilter('Female')>><<Video "Media\\Sex\\Quest\\FightClub\\Tess\\Quest2\\lick_f.mp4">><</if>>
<<ChatMessage "Tess shoves you back against rough bark, diving between your thighs with feral hunger - her tongue spearing into your drenched pussy, lapping up your juices while sucking your clit like it's her lifeline, fingers pistoning deep to hammer your sweet spots.">>
<<ChatWithoutNPC 'Tess Carter' _tessCarter "Your walls gripping me, juices flooding my face like a storm? Buck wild, smear it all over me-make me your bitch. You're so fucking wet for me... gush for me, drown my tongue in your sweet nectar, let me taste every quiver...">>
<<ChatMessage "Foliage whispers secrets as her tongue lashes your cunt, your body arching in electric spasms, muffled cries piercing the air. Climax roars through you, squirting waves she laps up hungrily, her face glistening as she grins up at you, fingers still teasing your oversensitive pussy.">>
<<ChatWithoutNPC 'Tess Carter' _tessCarter "Mmm, fuck... that was pure fire. You're my savior, babe.">>
<<else>>
<<ChatMessage "Tess kneels with reverent heat, her lips wrapping your gorgeous cock in a warm, affirming embrace-stroking tenderly while sucking with building intensity, tongue exploring every sensitive ridge to make you feel seen and craved.">>
<<ChatWithoutNPC 'Tess Carter' _tessCarter "Pulsing so strong, pre-cum tasting like heaven on my lips? Guide me, let me honor you fully-take what you need. You're making me ache with desire... release into me, let me cherish your cum like the gift it is, swallowing every pulse...">>
<<ChatMessage "Bushes hide your shared passion, her mouth moving with loving fervor on your shaft, moans blending with nature's hum. Orgasm surges like a wave, spilling into her as she swallows with care, eyes shining with deep connection and desire, her hand gently stroking you through the aftershocks.">>
<<ChatWithoutNPC 'Tess Carter' _tessCarter "Mmm, that was... electric and real. You're my savior, gorgeous.">>
<</if>>
<div class="btn padding-top"><<button "Continue" "Park">><</button>></div>
<<set $tessStoryProgress = 2>>
<<set $canShowStatsBtn = true>>
<<set $gameSettings.allowSaves = true>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<DeleteCharacter $interactionNpc>>
<<set _tessCarter = "Media\\Characters\\QuestChars\\UFG\\Tess Carter.jpg">>
<<run $player.characterEvents.registerEvent($player.info.id, "TessQuest2Lose", 1)>>
<<ChatMessage "The ex slams you into the grass with brutal force, pinning you down, but fate intervenes - a cop strolling the park path catches the chaos. The ex spots the uniform, panics like a rat, and flees into the trees, hurling curses over his shoulder. The cop jogs over, badge flashing, but Tess steps in quick.">>
<<ChatWithoutNPC 'Tess Carter' _tessCarter "It was self-defense-he's already gone.">>
<<ChatMessage "The cop nods, satisfied, and moves on. Tess hauls you up with surprising strength, splashing fountain water over your cuts, her hands gentle and reassuring as they trace your arms.">>
<<ChatWithoutNPC 'Tess Carter' _tessCarter "You alright? That dickhead... after what Dad put me through, I figured everyone was poison, but you jumped in anyway. Thanks for trying to shield me. The adrenaline's still raging through me, huh? Wanna... blow off some steam? Let your touch melt it away.">>
<div class="btn padding-top"><<button "Joke about it." "Tess_Quest2_Lose_Joke">><</button>></div>
<div class="btn padding-top"><<button "Offer oral." "Tess_Quest2_Lose_OfferOral">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _tessCarter = "Media\\Characters\\QuestChars\\UFG\\Tess Carter.jpg">>
<<Chat $player "Blow it off? Only if it means ice cream. Next time, I'll bring pepper spray.">>
<<ChatWithoutNPC 'Tess Carter' _tessCarter "*Laughs, shaking her head* Ice cream it is. You're a champ, win or lose. C'mon, park's got sunnier vibes waiting.">>
<div class="btn padding-top"><<button "Continue" "Park">><</button>></div>
<<set $tessStoryProgress = 2>>
<<set $canShowStatsBtn = true>>
<<set $gameSettings.allowSaves = true>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _tessCarter = "Media\\Characters\\QuestChars\\UFG\\Tess Carter.jpg">>
<<Chat $player "After that... I wanna thank you. In the bushes? My mouth on you - I'll make you cum hard.">>
<<ChatMessage "Tess blushes fiercely, her body leaning into yours as she nods, eyes darkening with want, and leads you into the thick undergrowth.">>
<<ChatWithoutNPC 'Tess Carter' _tessCarter "Thanking me? Shit, yes... get down there. Your lips and tongue on my pussy - dive deep, suck and swirl like you mean it. Oh fuck, just like that... you're making me throb so hard, build it up - I'm gonna cum all over you...">>
<<ChatMessage "You kneel eagerly, face buried between her thighs-tongue plunging into her slick heat, lapping hungrily at her folds while sucking her swollen clit, fingers teasing and probing to amp the fire.">>
<<if $player.gender() == 'Female' || $player.gender() == 'Shemale'>>
<<if CheckContentFilter('Female')>><<Video "Media\\Sex\\Quest\\FightClub\\Tess\\Quest2\\lick_f.mp4">><</if>>
<<else>>
<<if CheckContentFilter('Female')>><<Video "Media\\Sex\\Quest\\FightClub\\Tess\\Quest2\\lick_m.mp4">><</if>>
<</if>>
<<ChatWithoutNPC 'Tess Carter' _tessCarter "Feel me dripping, clenching around your mouth? Harder, own this cunt - you're driving me insane with lust... yes, right there - explode with me, soak my face in your juices, let me grind until I'm spent...">>
<<ChatMessage "Bushes cloak your frenzy, your tongue working her relentlessly as her hips grind, stifled moans cutting through the leaves. She shatters in orgasmic bliss, body quaking and gushing waves of her arousal over your chin and lips, then drags you up for a messy, flavor-shared embrace, her fingers digging into your skin.">>
<<ChatWithoutNPC 'Tess Carter' _tessCarter "Fuck... you're a miracle worker. This seals us tight.">>
<div class="btn padding-top"><<button "Continue" "Park">><</button>></div>
<<set $tessStoryProgress = 2>>
<<set $canShowStatsBtn = true>>
<<set $gameSettings.allowSaves = true>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _tessCarter = "Media\\Characters\\QuestChars\\UFG\\Tess Carter.jpg">>
<<set $canShowStatsBtn = false>>
<<set $gameSettings.allowSaves = false>>
<<ChatWithoutNPC 'Tess Carter' _tessCarter "Hey, you... I'm tired of being scared. Every day, this terror chokes me-from my dad, from the memories. I want to end it. Help me teach him a lesson, once and for all. Let's go to his house before he gets totally wasted. You in? Without you... I might break.">>
<<Chat $player "Alright, let's go. Tell me how you got out of that hell.">>
<<ChatWithoutNPC 'Tess Carter' _tessCarter "On the way. Let's move while it's still light. When I was 16, after that beating... I couldn't take it anymore. I ran away from home - just packed my stuff and left in the middle of the night. Wandered the city for weeks: slept in parks, ate out of dumpsters, starved. It was terrifying, but better than home. I ran into Grant - he saw me outside the gym, dirty and broken. Let me crash there if I'd clean up. Mop at night, train during the day. I work out to get strong, to beat my dad and save my mom. She's still there, in that mess. With you... I feel like I can do it.">>
<<Chat $player "You're strong. We'll make this happen.">>
<div class="btn padding-top"><<button "Continue" "Tess_Quest3_Dads_House_Start">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/Other/UFG/Tess_House.jpg">>
<<set _tessCarter = "Media\\Characters\\QuestChars\\UFG\\Tess Carter.jpg">>
<<set _tessDad = "Media\\Characters\\QuestChars\\UFG\\Tess_Father.jpg">>
<<set $canShowStatsBtn = false>>
<<set $gameSettings.allowSaves = false>>
<<ChatMessage "Tess's father's house-run-down, in a rough neighborhood. You knock on the door. Footsteps inside, the door swings open: Tess's dad, drunk, bottle in hand, eyes cloudy with rage. He sees Tess and growls.">>
<<ChatWithoutNPC 'Tess\'s father' _tessDad "Tess? You little bitch, back already? After running off and leaving me with your worthless mother? I'll teach you some respect-like old times!">>
<<ChatWithoutNPC 'Tess Carter' _tessCarter "*Freezing up, voice shaking* Dad... enough. We came here to...">>
<<ChatWithoutNPC 'Tess\'s father' _tessDad "*Raising his fist* Shut up! And who the hell are you? Get out, or I'll smash you both!">>
<<ChatMessage "Tess goes into a stupor - the paralyzing fear locks her in place, standing like a statue. You decide to step in.">>
<<run _tessDadChar = CreateCharacter({
isPlayer: false,
characterWork: "Tess's Dad",
gender: "Male",
sexualPreference: "Bi",
clothesPreference: "men",
firstName: "",
lastName: "",
skin: 'White',
age: 50,
defense: 5,
agility: 2,
strength: 6,
isQuestCharacter: true,
questCharID: 14,
currentQuestID: 0,
currentCharImg: _tessDad,
}, true)>>
<<set $indexNPC = $Characters.indexOf(_tessDadChar)>>
<<set $interactionNpc = $Characters[$indexNPC]>>
<<run $player.characterEvents.registerEvent($interactionNpc.info.id, "knows you", 1)>>
<div class="btn padding-top"><<button "Fight">>
<<set _battleSetControls = {attack: true, seduce: false, items: false, actions: true}>>
<<StartFight $player $interactionNpc _battleSetControls 'Tess_Quest3_Dads_House_Win' 'Tess_Quest3_Dads_House_Lose'>>
<</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/Other/UFG/Tess_House.jpg">>
<<DeleteCharacter $interactionNpc>>
<<set _tessCarter = "Media\\Characters\\QuestChars\\UFG\\Tess Carter.jpg">>
<<set $tessDadFightWon = true>>
<<ChatMessage "Tess\'s dad hits the ground, groaning on the dirt, muttering threats but not getting up. Tess snaps out of her stupor, eyes full of tears and relief. She grabs your hand.">>
<<ChatWithoutNPC 'Tess Carter' _tessCarter "You... you did it. He's down, and I'm... alive. Let's get out of here, back to the gym! Mom... I'll get her later, when he's sobered up.">>
<div class="btn padding-top"><<button "Continue" "Tess_Quest3_Final_Start">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/Other/UFG/Tess_House.jpg">>
<<DeleteCharacter $interactionNpc>>
<<set _tessCarter = "Media\\Characters\\QuestChars\\UFG\\Tess Carter.jpg">>
<<set $tessDadFightWon = false>>
<<ChatMessage "Tess\'s dad slams you to the ground, but Tess breaks out of her stupor-rage overriding the fear. She lunges at him, pummeling with fists and kicks, knocking him out cold. He lies there groaning as she helps you up, brushing off the dirt.">>
<<ChatWithoutNPC 'Tess Carter' _tessCarter "You... tried. Thanks for standing up for me. That gave me the strength. He's down-for the first time, I beat him. Let's haul ass back to the gym before he comes to.">>
<div class="btn padding-top"><<button "Continue" "Tess_Quest3_Final_Start">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/City/SkidRow/Warehouse/Locker_Room.jpg">>
<<set _tessCarter = "Media\\Characters\\QuestChars\\UFG\\Tess Carter.jpg">>
<<set $canShowStatsBtn = false>>
<<set $gameSettings.allowSaves = false>>
<<if $tessDadFightWon == true>>
<<ChatMessage "You bolt back to the training gym, empty and quiet at night. In the locker room: dim lights, the smell of sweat and adrenaline. Tess presses against you, breathing heavy.">>
<<ChatWithoutNPC 'Tess Carter' _tessCarter "Thanks... you saved me. After everything - the escape, the wandering, Grant - I thought the fear was forever. But with you... I want you. Take off your clothes, fuck me. Deep, hard... oh yeah.">>
<<ChatMessage "In the locker room, on a bench or the floor. Her body arches against yours, sweat-slick skin sliding together as the adrenaline fuels raw, urgent passion. Moans echo softly off the lockers, her nails raking your back in ecstasy.">>
<<ChatWithoutNPC 'Tess Carter' _tessCarter "*Gasping during* Cum inside me... you're my strength now.">>
<<if $player.gender() == 'Male'>>
<<if CheckContentFilter('Female')>><<Video "Media\\Sex\\Quest\\FightClub\\Tess\\Quest3\\vaginal_m.mp4">><</if>>
<<elseif $player.gender() == 'Shemale'>>
<<if CheckContentFilter('Female')>><<Video "Media\\Sex\\Quest\\FightClub\\Tess\\Quest3\\vaginal_s.mp4">><</if>>
<<else>>
<<if CheckContentFilter('Female')>><<Video "Media\\Sex\\Quest\\FightClub\\Tess\\Quest3\\69.mp4">><</if>>
<</if>>
<<if $player.gender() == 'Male' || $player.gender() == 'Shemale'>>
<<ChatMessage "You thrust into her tight, wet pussy, pounding deep and relentless, her legs wrapping around you as she moans louder with each stroke, her walls clenching around your cock. She scratches your back, urging you faster, her tits bouncing with the rhythm until you both explode in shuddering orgasms, your hot load filling her.">>
<<elseif $player.gender() == 'Female'>>
<<ChatMessage "Fingers plunging deep into each other's dripping cunts, tongues lashing clits and folds in a frenzy, bodies grinding together in scissoring heat. She licks you voraciously while you finger-fuck her, building to mutual climaxes where you both squirt and tremble, juices mixing in shared release.">>
<</if>>
<<ChatWithoutNPC 'Tess Carter' _tessCarter "*Breathless after* Whew... that was... liberating. Now I'll get Mom out of that house, take care of her. We'll start over, her and me. You're part of this-thanks.">>
<<else>>
<<ChatMessage "You head back to the training gym. Tess sits you down on a mat, checking your bruises, her voice full of gratitude but no romance.">>
<<ChatWithoutNPC 'Tess Carter' _tessCarter "You risked it all for me... after the escape, the wandering, Grant - I've been training for this. Now I'll help Mom: get her out when he's passed out. I'll take care of her, like she couldn't for me. You're a friend, but... I need some time alone. See you at the gym.">>
<</if>>
<div class="btn padding-top"><<button "Continue" "Underground_Fight_Gym">>
<<set $canShowStatsBtn = true>>
<<set $gameSettings.allowSaves = true>>
<<set $tessStoryProgress = 3>>
<<if $player.characterEvents.isEventRegistered($player.info.id, "GetTessApproval") == false>>
<<run $player.characterEvents.registerEvent($player.info.id, "GetTessApproval", 1)>>
<<set $ApprovalReceived += 1>>
<</if>>
<</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _tessCarter = "Media\\Characters\\QuestChars\\UFG\\Tess Carter.jpg">>
<<DrawImg _tessCarter>>
<<set _defAtMax = $player.attributes.defense.value >= $player.attributes.defense.max>>
<<if $tessStoryProgress == 0>>
<<ChatWithoutNPC 'Tess Carter' _tessCarter 'Hey, wanna fight?'>>
<div class="btn padding-top"><<button "Yes, I'm ready" "TessStartQuestFight">><</button>></div>
<<if _defAtMax>>
<div class="btn padding-top non-interacting"><<button "Defense (MAX)">><</button>></div>
<<else>>
<div class="btn padding-top"><<button "Train my defense ($250)" "Tess_TrainAgility">><</button>></div>
<</if>>
<<elseif $tessStoryProgress == 1>>
<<goto "Tess_Quest2_Start">>
<<elseif $tessStoryProgress == 2>>
<<goto "Tess_Quest3_Start">>
<<else>>
<<if _defAtMax>>
<<ChatWithoutNPC 'Tess Carter' _tessCarter 'Looks like you\'re already at peak defense.'>>
<div class="btn padding-top non-interacting"><<button "Defense (MAX)">><</button>></div>
<<else>>
<<ChatWithoutNPC 'Tess Carter' _tessCarter 'Need to toughen up? I can train your defense for $250.'>>
<div class="btn padding-top"><<button "Train my defense ($250)" "Tess_TrainAgility">><</button>></div>
<</if>>
<</if>>
<div class="btn padding-top"><<button "Leave" "Underground_Fight_Gym">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _tessCarter = "Media\\Characters\\QuestChars\\UFG\\Tess Carter.jpg">>
<<if $player.money < 250>>
<<ChatWithoutNPC 'Tess Carter' _tessCarter 'Come back when you have $250.'>>
<div class="btn padding-top"><<button "Back" "Tess_Checker">><</button>></div>
<<else>>
<<set $player.money -= 250>>
<<SpendEnergy $player 20>>
<<SpendTimeWithoutUpdate 30>>
<<set _gain = Random(10,20) + $player.attributes.intelligence.value>>
<<SetCharProgression $player 'defense' _gain true>>
<<ChatWithoutNPC 'Tess Carter' _tessCarter 'Nice hustle. You\'re getting tougher.'>>
<div class="btn padding-top"><<button "Back" "Tess_Checker">><</button>></div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "CharactersData">>
<<run _tessCharacter = CreateCharacter({
isPlayer: false,
characterWork: "Quest",
gender: "Female",
sexualPreference: "Bi",
clothesPreference: "women",
firstName: "Tess",
lastName: "Carter",
skin: 'White',
age: 30,
defense: 4,
agility: 2,
strength: 2,
isQuestCharacter: true,
questCharID: 12,
currentQuestID: 0,
currentCharImg: "Media\\Characters\\QuestChars\\UFG\\Tess Carter.jpg",
}, true)>>
<<unset $maleNames $femaleNames $surnames>>
<<run $player.characterEvents.registerEvent(_tessCharacter.info.id, "knows you", 1)>>
<<set $indexNPC = $Characters.indexOf(_tessCharacter)>>
<<set $interactionNpc = $Characters[$indexNPC]>>
<<set _battleSetControls = {attack: true, seduce: false, items: false, actions: true, noWeapons: true}>>
<<StartFight $player $interactionNpc _battleSetControls 'TessQuestFightWin' 'TessQuestFightLose'>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set $tessFightWon = true>>
<div class="btn padding-top"><<button "Continue" "Tess_Quest1">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set $tessFightWon = false>>
<div class="btn padding-top"><<button "Continue" "Tess_Quest1">><</button>></div>
<</nobr>><<widget "VictorBarkerStartQuest">>
<<if $player.characterEvents.isEventRegistered($player.info.id, "victorBarker_quest_01") == false>>
<<run $player.characterEvents.registerEvent($player.info.id, "victorBarker_quest_01", 1)>>
<</if>>
<<if getQuestById("victor_barker_quest_1") == undefined>>
<<run addQuest({
id: "victor_barker_quest_1",
title: "A Dangerous Game",
description: "Victor Barker dragged you into a dangerous game at the bar.",
state: "active",
questType: "side",
startedAt: Date.now(),
questGiver: "Victor Barker"
})>>
<<elseif getQuestState("victor_barker_quest_1") == "available">>
<<run activateQuest("victor_barker_quest_1")>>
<</if>>
<</widget>>
<<widget "VictorBarkerCompleteQuest">>
<<VictorBarkerStartQuest>>
<<if $player.characterEvents.isEventRegistered($player.info.id, "victorBarker_quest_01_completed") == false>>
<<run $player.characterEvents.registerEvent($player.info.id, "victorBarker_quest_01_completed", 1)>>
<</if>>
<<run restoreTemporaryGenderChange($player, "victor_barker_quest_1")>>
<<run completeQuest("victor_barker_quest_1")>>
<</widget>><<nobr>>
<<VictorBarkerCompleteQuest>>
<<LeaveInteractionSettings>>
<<goto $player.info.currentLocation>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _victorIcon = "Media\\Characters\\QuestChars\\Bar\\VictorBarker.jpeg">>
<<DrawImage _victorIcon>>
<<ChatMessage 'The bustling city streets shine beneath the neon glow of the local bar. The smell of cheap beer fills the air as you walk in. All eyes stop and examine you as you enter. One man in particular sits alone at a corner table. He looks up, flashes a sly smile, and motions you over.'>>
<<ChatWithoutNPC "Victor" _victorIcon 'Mind joining me? *he asks*'>>
<<ChatMessage 'Something about him makes you cautious, but curiosity wins out. As you take a seat he extends a hand.'>>
<<ChatWithoutNPC "Victor" _victorIcon 'Victor Barker. And who might you be? *he asks with that same sly grin*'>>
<<Chat $player 'I\'m… $player.info.firstName'>>
<<ChatMessage 'An uneasy feeling flickers inside you, but you push it aside.'>>
<<ChatWithoutNPC "Victor" _victorIcon 'Well I\'m… $player.info.firstName, care to play a little Black Jack with me? Let\'s make this interesting - how about we play for $5,000? *he suggests, skillfully shuffling the deck between his hands; he senses your hesitation*'>>
<<ChatWithoutNPC "Victor" _victorIcon 'No no, I\'m not asking you to put up any money. I just want you to stake something else. If you lose, all you have to do is take this little pill. *He pulls out a small vial with a pink‑coloured pill.*'>>
<<Chat $player 'What does it do? *you ask, raising an eyebrow*'>>
<<ChatWithoutNPC "Victor" _victorIcon 'It… enhances your experience-makes you see and feel things in a whole new way. If you lose, it\'ll transform you, just for a little while of course. *He winks as he deals the cards.*'>>
<div class="btn padding-top"><<button "Accept (Feminization)" "VictorBarker_Quest_1_Accept">><</button>></div>
<div class="btn padding-top"><<button "Refuse" "VictorBarker_Quest_1_Exit">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _victorIcon = "Media\\Characters\\QuestChars\\Bar\\VictorBarker.jpeg">>
<<DrawImage _victorIcon>>
<<VictorBarkerStartQuest>>
<<Chat $player '*You look at the pill skeptically, but curiosity gets the better of you.* Alright, dealer\'s choice. Let\'s do this.'>>
<<ChatMessage 'The gentle hum of jazz drifts lazily through the dimly lit bar, mingling with clinks of glass and murmured conversation. At a secluded corner table you and Victor sit opposite each other, a worn deck of cards resting comfortably in his skilled hands. He shuffles with practiced ease, the cards fluttering into neat piles, then deals two apiece across the polished oak.'>>
<<ChatMessage 'You glance down-Jack ♥ and Four ♣. Victor watches, eyes sparkling with amusement.'>>
<<ChatWithoutNPC "Victor" _victorIcon 'Feeling lucky tonight? *he teases, voice smooth and relaxed*'>>
<<Chat $player 'Luck has nothing to do with it. *You tap the table lightly.* Hit me.'>>
<<ChatMessage 'Victor slides another card your way. Eight ♦-total twenty‑two. You frown, realizing the bust.'>>
<<ChatWithoutNPC "Victor" _victorIcon 'Bust. *He smiles, amused.* You know, bravery doesn\'t always pay off.'>>
<<ChatWithoutNPC "Victor" _victorIcon 'Ah‑ah‑ah-no cheating now, Kyle. We had a deal. *He slides the pill across, his hand lingering on yours, tracing your fingers.*'>>
<<Chat $player 'What happens now? *you ask, eyeing the vial*'>>
<<ChatWithoutNPC "Victor" _victorIcon 'Pop that in and let\'s see. *His mouth‑watering grin makes your whole body tingle; with a deep breath you decide to take it.*'>>
<<run prepareTemporaryGenderChange($player, "victor_barker_quest_1")>>
<<run _changePill = GetNewItem("gender_change_pills_female", 1)>>
<<run $player.useItem(_changePill, $player)>>
<<ChatMessage 'The pill melts effortlessly on your tongue. At first nothing feels unusual - then dizziness. Your head lightens, thoughts scattering. Vision blurs. You look down: hands shrink, sleeves hang loose, pants baggy. Your voice rises a register. Every sensation sharpens - fabric against skin, the bar’s cool air, Victor’s hungry stare.'>>
<<ChatMessage 'Victor stands, now towering over you. He takes your smaller hand and lifts you gently to unsteady feet.'>>
<<ChatWithoutNPC "Victor" _victorIcon 'Come now, *he says softly, guiding you to the back of the bar where a doorway hides behind a curtain.*'>>
<div class="btn padding-top"><<button "Follow him" "VictorBarker_Quest_1_Follow">><</button>></div>
<div class="btn padding-top"><<button "Run away" "VictorBarker_Quest_1_Exit">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _victorIcon = "Media\\Characters\\QuestChars\\Bar\\VictorBarker.jpeg">>
<<DrawImage _victorIcon>>
<<ChatMessage 'He leads you upstairs; each step is awkward in your clumsy new body. Every brush of cloth, every footfall is electric. Breasts-new, perky-press against your shirt. In a private room he clicks the lock behind you.'>>
<<ChatMessage 'He turns, eyes dark with lust. Heat blooms through your soft, delicate form. His gaze alone feels like a touch; moisture gathers between your thighs.'>>
<<ChatWithoutNPC "Victor" _victorIcon 'I\'m going to fuck you so good, baby… ahhh yeah… *he growls, advancing*'>>
<<ChatMessage 'His lips crash onto yours, tongue invading. Hands roam-squeezing breasts, guiding you to the bed. Clothes vanish; cool air hardens your nipples. Victor grabs your hips, pulling you onto his hard cock while kissing down your neck-biting, licking-drawing gasps and moans.'>>
<<ChatWithoutNPC "Victor" _victorIcon 'You\'re mine now, baby. All mine. My little slut. Going to fuck this tight little pussy, make you scream.'>>
<<ChatMessage 'He bends you over the bed, knee spreading your legs. A firm thrust fills you, stretching you wide.'>>
<<Video "Media\\Characters\\QuestChars\\Bar\\sex\\1.mp4">>
<<ChatMessage 'Victor\'s hips pump, driving deep. Each slap of flesh shocks you with pleasure. Hands pinch nipples, grope ass - then *Slap!* across your cheek, making you yelp and clench.'>>
<<ChatWithoutNPC "Victor" _victorIcon 'Bad girl… you\'re going to learn to take daddy\'s cock so good-gonna train this pussy up nice and tight.'>>
<<ChatMessage 'He pounds harder, faster; the bed creaks. With a final thrust he empties himself inside, groaning loudly.'>>
<<ChatWithoutNPC "Victor" _victorIcon 'Ahhh yeahhh… take it all, baby-every last drop! *He pulls out, pats your ass.* Clean up; shower’s through that door. We\'re not done yet, baby.'>>
<<ChatMessage 'Warmth pools inside you as you wobble to the bathroom. The plush carpet tickles bare feet; breasts bounce with each step. Under the shower, hot spray caresses hypersensitive skin; you replay Victor\'s words-*my little slut*-and catch yourself smiling.'>>
<<ChatMessage 'Clean and dazed, you study the mirror: a petite young woman with bright eyes and smooth curves. After exploring a moment, you slip into a tight dress Victor left - the hem flirting with your thighs, fabric straining over breasts.'>>
<<ChatMessage 'Victor waits downstairs, eyes devouring you.'>>
<<ChatWithoutNPC "Victor" _victorIcon 'Mmm, you clean up nicely, baby. Come here.'>>
<<ChatMessage 'He pulls you close, hand low on your back, fingers grazing your ass.'>>
<<ChatWithoutNPC "Victor" _victorIcon 'I want you to do something for me. I have a friend who\'s eager to join the fun. Want to meet him? *He squeezes your ass*'>>
<<Chat $player 'I think that would be lovely,'>>
<div class="btn padding-top"><<button "Follow him" "VictorBarker_Quest_1_Friend">><</button>></div>
<div class="btn padding-top"><<button "Run away" "VictorBarker_Quest_1_Exit">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _victorIcon = "Media\\Characters\\QuestChars\\Bar\\VictorBarker.jpeg">>
<<set _jasonIcon = "Media\\Characters\\QuestChars\\Bar\\Jason.jpeg">>
<<ChatMessage 'Victor kisses you hard, then guides you to his car. During the drive his hand slides up your thigh, teasing your soaked panties. You squirm; he chuckles.'>>
<<ChatMessage 'At a roadside motel he leads you into a room of dark wood and leather. A man sits waiting; his eyes widen at the sight of you.'>>
<<DrawImage _jasonIcon>>
<<ChatWithoutNPC "Jason" _jasonIcon 'Well, well. Victor, you always find the best sluts, *he chuckles.*'>>
<<ChatMessage 'Victor tightens his grip around your waist.'>>
<<ChatWithoutNPC "Victor" _victorIcon 'Ahh, she\'s special-really something else.'>>
<<ChatMessage 'The stranger rises-tall, muscular, a bulge already forming.'>>
<<ChatWithoutNPC "Jason" _jasonIcon 'Name\'s Jason. I\'ve been waiting to play with you, *he says, stroking your cheek.*'>>
<<ChatMessage 'Instinctively you kiss him; he chuckles, guiding you to the bed where you bounce on the mattress.'>>
<<ChatWithoutNPC "Jason" _jasonIcon 'Strip, *Jason orders softly.*'>>
<<ChatMessage 'You slide the dress off; cool air pebbles your nipples. Jason licks his lips, bends to suck a breast while fingers plunge into your slick heat, curling against a spot that makes you see stars.'>>
<<Chat $player 'Ahh! Ohhh!'>>
<<Video "Media\\Characters\\QuestChars\\Bar\\sex\\2.mp4">>
<<ChatMessage 'He pumps you while sucking, the world blurring into raw pleasure. When he pulls away you whimper.'>>
<<ChatWithoutNPC "Jason" _jasonIcon 'Don\'t worry, baby-*he grins*-I\'m far from done.'>>
<<ChatMessage 'Jason strips; his thick cock stands hard. He strokes it while watching your face.'>>
<<ChatWithoutNPC "Jason" _jasonIcon 'You want this inside you?' >>
<<ChatMessage 'Your mind is foggy, body screaming yes. He crawls up, kisses you, explores every curve.'>>
<<ChatWithoutNPC "Jason" _jasonIcon 'I\'m going to fuck you so good.'>>
<<ChatMessage 'He guides the tip along your folds, then pushes in, stretching you deliciously.'>>
<<ChatMessage 'Jason pounds deeper, faster; skin slaps echo. Your legs wrap around him, pulling him in.'>>
<<ChatWithoutNPC "Jason" _jasonIcon 'You like that, slut? Like daddy\'s big cock? *he growls, rhythm faltering as he nears climax*'>>
<<Chat $player 'I do! Ohhh fuck!'>>
<<ChatMessage 'With a final erratic thrust he floods you with heat, groaning while cum spills inside then drips as he withdraws.'>>
<<ChatWithoutNPC "Jason" _jasonIcon 'Thanks for the good time, slut.'>>
<<ChatMessage 'He slaps your ass and leaves with Victor. Alone, you lie in a haze until your body begins to change - breasts shrinking, hips narrowing. Moments later you are yourself again: toned, familiar. Exhausted, confused, but remembering every blissful moment, you smile to yourself - maybe next time you\'ll be ready.'>>
<<VictorBarkerCompleteQuest>>
<div class="btn padding-top"><<button "Continue" "VictorBarker_Quest_1_Exit">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateStatBars">>
<<SetBackground>>
<<set _mainCount = getQuestCountByType("main")>>
<<set _sideCount = getQuestCountByType("side")>>
<<set _completedCount = getQuestCountByType("completed")>>
<<set _failedCount = getQuestCountByType("failed")>>
<<set _totalActive = _mainCount + _sideCount>>
<<set _factionPanelHtml = getFactionReputationHtml()>>
<<set _gangPanelHtml = gangJournalHtml(getGangWorld())>>
<div class="quest-journal-container">
<div class="quest-journal-panel">
<div class="quest-journal-header">
<h2>Quest Journal</h2>
<div class="quest-journal-stats">
<span class="stat-active">Active: <<print _totalActive>></span>
<span class="stat-completed">Done: <<print _completedCount>></span>
<span class="stat-failed">Failed: <<print _failedCount>></span>
</div>
</div>
<div class="quest-journal-filters">
<button id="filter-main" class="quest-filter-btn active" onclick="setActiveQuestFilter(this); renderQuests('main')">Main <span class="filter-count"><<print _mainCount>></span></button>
<button id="filter-side" class="quest-filter-btn" onclick="setActiveQuestFilter(this); renderQuests('side')">Side <span class="filter-count"><<print _sideCount>></span></button>
<button id="filter-completed" class="quest-filter-btn" onclick="setActiveQuestFilter(this); renderQuests('completed')">Completed <span class="filter-count"><<print _completedCount>></span></button>
<button id="filter-failed" class="quest-filter-btn" onclick="setActiveQuestFilter(this); renderQuests('failed')">Failed <span class="filter-count"><<print _failedCount>></span></button>
</div>
<div id="quest-log" class="quest-journal-list"></div>
<div class="quest-journal-faction-section">
<h3 class="quest-journal-section-title">Faction Standing</h3>
_factionPanelHtml
</div>
<<if _gangPanelHtml>>
<div class="quest-journal-faction-section">
<h3 class="quest-journal-section-title">Streets</h3>
_gangPanelHtml
</div>
<</if>>
<div class="quest-journal-footer">
<div class="btn"><<button "View Available Quests" "AvailableQuests">><</button>></div>
<div class="btn"><<button "Back to Game" $player.info.currentLocation>><<set $gameSettings.allowSaves = true>><<set $canShowStatsBtn = true>><</button>></div>
</div>
</div>
</div>
<<done>><<script>>renderQuests('main')<</script>><</done>>
<</nobr>><<nobr>>
<<set $shouldHideBar = true>>
<div class="npc-gen-container">
<div class="npc-gen-title">Customize NPC Generation</div>
<div class="npc-gen-subtitle">Configure how NPCs will be generated in your game world</div>
<!-- Presets -->
<div class="npc-gen-presets">
<button class="preset-btn active" id="preset-balanced" onclick="applyPreset('balanced')">Balanced</button>
<button class="preset-btn" id="preset-realistic" onclick="applyPreset('realistic')">Realistic</button>
<button class="preset-btn" id="preset-diverse" onclick="applyPreset('diverse')">Diverse</button>
</div>
<div class="npc-gen-grid">
<!-- Population Count Card -->
<div class="npc-gen-card">
<div class="card-header" onclick="toggleCard(this)">
<h3><span class="icon">👥</span> Population Count</h3>
<button class="card-reset" onclick="event.stopPropagation(); resetSection('population')">Reset</button>
<span class="card-toggle">▼</span>
</div>
<div class="card-body">
<div class="number-input-group">
<div class="number-input-row">
<label>Residents</label>
<input type="number" id="citizens-count" value="85" min="25" max="800" onchange="OnInputLimit('citizens-count')"/>
<span class="input-hint">25 - 800</span>
</div>
<div class="number-input-row">
<label>Family Members</label>
<input type="number" id="family-count" value="20" min="0" max="200" onchange="OnInputLimit('family-count')"/>
<span class="input-hint">0 - 200</span>
</div>
</div>
</div>
</div>
<!-- Age Distribution Card -->
<div class="npc-gen-card">
<div class="card-header" onclick="toggleCard(this)">
<h3><span class="icon">📅</span> Age Distribution</h3>
<button class="card-reset" onclick="event.stopPropagation(); resetSection('age')">Reset</button>
<span class="card-toggle">▼</span>
</div>
<div class="card-body">
<div class="range-input-group">
<div class="range-row">
<label>Residents</label>
<div class="range-inputs">
<input type="number" id="citizen-age-min" value="20" min="18" max="60" onchange="validateAgeRange('citizen')"/>
<span class="range-separator">to</span>
<input type="number" id="citizen-age-max" value="50" min="18" max="60" onchange="validateAgeRange('citizen')"/>
</div>
</div>
</div>
</div>
</div>
<!-- Gender Ratio Card -->
<div class="npc-gen-card">
<div class="card-header" onclick="toggleCard(this)">
<h3><span class="icon">⚧</span> Gender Ratio</h3>
<button class="card-reset" onclick="event.stopPropagation(); resetSection('gender')">Reset</button>
<span class="card-toggle">▼</span>
</div>
<div class="card-body">
<div class="distribution-preview" id="gender-preview">
<div class="distribution-segment seg-1" style="width: 33%"></div>
<div class="distribution-segment seg-2" style="width: 33%"></div>
<div class="distribution-segment seg-3" style="width: 34%"></div>
</div>
<div class="slider-row">
<span class="slider-label">Men</span>
<input type="range" class="npc-slider slider" id="men-slider" data-slider="1" data-group="gender" value="33" min="0" max="100" oninput="updateSliders(1, this.value, 'gender')">
<span class="slider-value" data-value="1" data-group="gender">33%</span>
</div>
<div class="slider-row">
<span class="slider-label">Women</span>
<input type="range" class="npc-slider slider" id="women-slider" data-slider="2" data-group="gender" value="33" min="0" max="100" oninput="updateSliders(2, this.value, 'gender')">
<span class="slider-value" data-value="2" data-group="gender">33%</span>
</div>
<div class="slider-row">
<span class="slider-label">Trans</span>
<input type="range" class="npc-slider slider" id="trans-slider" data-slider="3" data-group="gender" value="34" min="0" max="100" oninput="updateSliders(3, this.value, 'gender')">
<span class="slider-value" data-value="3" data-group="gender">34%</span>
</div>
<div class="linked-sliders-notice">Values are linked to equal 100%</div>
</div>
</div>
<!-- Race Ratio Card -->
<div class="npc-gen-card">
<div class="card-header" onclick="toggleCard(this)">
<h3><span class="icon">🌍</span> Race Ratio</h3>
<button class="card-reset" onclick="event.stopPropagation(); resetSection('race')">Reset</button>
<span class="card-toggle">▼</span>
</div>
<div class="card-body">
<div class="distribution-preview" id="race-preview">
<div class="distribution-segment seg-1" style="width: 33%"></div>
<div class="distribution-segment seg-2" style="width: 33%"></div>
<div class="distribution-segment seg-3" style="width: 34%"></div>
</div>
<div class="slider-row">
<span class="slider-label">White</span>
<input type="range" class="npc-slider slider" id="white-slider" data-slider="1" data-group="race" value="33" min="0" max="100" oninput="updateSliders(1, this.value, 'race')">
<span class="slider-value" data-value="1" data-group="race">33%</span>
</div>
<div class="slider-row">
<span class="slider-label">Black</span>
<input type="range" class="npc-slider slider" id="black-slider" data-slider="2" data-group="race" value="33" min="0" max="100" oninput="updateSliders(2, this.value, 'race')">
<span class="slider-value" data-value="2" data-group="race">33%</span>
</div>
<div class="slider-row">
<span class="slider-label">Asian</span>
<input type="range" class="npc-slider slider" id="asian-slider" data-slider="3" data-group="race" value="34" min="0" max="100" oninput="updateSliders(3, this.value, 'race')">
<span class="slider-value" data-value="3" data-group="race">34%</span>
</div>
<div class="linked-sliders-notice">Values are linked to equal 100%</div>
</div>
</div>
<!-- Sexual Preference Card -->
<div class="npc-gen-card">
<div class="card-header" onclick="toggleCard(this)">
<h3><span class="icon">💕</span> Sexual Preference</h3>
<button class="card-reset" onclick="event.stopPropagation(); resetSection('sexpref')">Reset</button>
<span class="card-toggle">▼</span>
</div>
<div class="card-body">
<div class="distribution-preview" id="sexpref-preview">
<div class="distribution-segment seg-1" style="width: 33%"></div>
<div class="distribution-segment seg-2" style="width: 33%"></div>
<div class="distribution-segment seg-3" style="width: 34%"></div>
</div>
<div class="slider-row">
<span class="slider-label">Straight</span>
<input type="range" class="npc-slider slider" id="straight-slider" data-slider="1" data-group="sexpref" value="33" min="0" max="100" oninput="updateSliders(1, this.value, 'sexpref')">
<span class="slider-value" data-value="1" data-group="sexpref">33%</span>
</div>
<div class="slider-row">
<span class="slider-label">Bi</span>
<input type="range" class="npc-slider slider" id="bi-slider" data-slider="2" data-group="sexpref" value="33" min="0" max="100" oninput="updateSliders(2, this.value, 'sexpref')">
<span class="slider-value" data-value="2" data-group="sexpref">33%</span>
</div>
<div class="slider-row">
<span class="slider-label">Gay/Lesbian</span>
<input type="range" class="npc-slider slider" id="homo-slider" data-slider="3" data-group="sexpref" value="34" min="0" max="100" oninput="updateSliders(3, this.value, 'sexpref')">
<span class="slider-value" data-value="3" data-group="sexpref">34%</span>
</div>
<div class="linked-sliders-notice">Values are linked to equal 100%</div>
</div>
</div>
</div>
<!-- Unlock Prompt for Advanced Settings -->
<div class="npc-gen-unlock-prompt" id="npc-gen-unlock-prompt">
<h4>🔒 Advanced Settings Locked</h4>
<p>Enter the cheat code to unlock additional NPC generation options</p>
<div class="unlock-input-group">
<input type="password" id="npc-unlock-password" placeholder="Enter code..." onkeypress="if(event.key==='Enter')unlockAdvancedNpcSettings(this.value)">
<button class="unlock-btn" onclick="unlockAdvancedNpcSettings(document.getElementById('npc-unlock-password').value)">Unlock</button>
</div>
<div class="hint">Hint: Same code as the main cheats menu</div>
</div>
<div class="npc-gen-grid">
<!-- Body Type Distribution Card (LOCKED) -->
<div class="npc-gen-card locked" id="card-bodytype">
<div class="card-header" onclick="toggleCard(this)">
<h3><span class="icon">🏋️</span> Body Type Distribution</h3>
<button class="card-reset" onclick="event.stopPropagation(); resetSection('bodytype')">Reset</button>
<span class="card-toggle">▼</span>
</div>
<div class="card-body">
<div class="distribution-preview" id="bodytype-preview">
<div class="distribution-segment seg-1" style="width: 15%"></div>
<div class="distribution-segment seg-2" style="width: 35%"></div>
<div class="distribution-segment seg-3" style="width: 35%"></div>
<div class="distribution-segment seg-4" style="width: 15%"></div>
</div>
<div class="distribution-legend">
<span class="legend-item"><span class="legend-dot seg-1"></span>Skinny</span>
<span class="legend-item"><span class="legend-dot seg-2"></span>Fit</span>
<span class="legend-item"><span class="legend-dot seg-3"></span>Average</span>
<span class="legend-item"><span class="legend-dot seg-4"></span>Chubby</span>
</div>
<div class="slider-row">
<span class="slider-label">Skinny</span>
<input type="range" class="npc-slider slider" id="skinny-slider" data-slider="1" data-group="bodytype" value="15" min="0" max="100" oninput="updateSliders(1, this.value, 'bodytype')">
<span class="slider-value" data-value="1" data-group="bodytype">15%</span>
</div>
<div class="slider-row">
<span class="slider-label">Fit</span>
<input type="range" class="npc-slider slider" id="fit-slider" data-slider="2" data-group="bodytype" value="35" min="0" max="100" oninput="updateSliders(2, this.value, 'bodytype')">
<span class="slider-value" data-value="2" data-group="bodytype">35%</span>
</div>
<div class="slider-row">
<span class="slider-label">Average</span>
<input type="range" class="npc-slider slider" id="average-slider" data-slider="3" data-group="bodytype" value="35" min="0" max="100" oninput="updateSliders(3, this.value, 'bodytype')">
<span class="slider-value" data-value="3" data-group="bodytype">35%</span>
</div>
<div class="slider-row">
<span class="slider-label">Chubby</span>
<input type="range" class="npc-slider slider" id="chubby-slider" data-slider="4" data-group="bodytype" value="15" min="0" max="100" oninput="updateSliders(4, this.value, 'bodytype')">
<span class="slider-value" data-value="4" data-group="bodytype">15%</span>
</div>
<div class="linked-sliders-notice">Values are linked to equal 100%</div>
</div>
</div>
<!-- Sex Role Distribution Card (LOCKED) -->
<div class="npc-gen-card locked" id="card-sexrole">
<div class="card-header" onclick="toggleCard(this)">
<h3><span class="icon">🎭</span> Sex Role Distribution</h3>
<button class="card-reset" onclick="event.stopPropagation(); resetSection('sexrole')">Reset</button>
<span class="card-toggle">▼</span>
</div>
<div class="card-body">
<div class="checkbox-option">
<input type="checkbox" id="sexrole-link-gender" checked onchange="toggleSexRoleLinkToGender()">
<label for="sexrole-link-gender">Link to gender (use default ratios based on gender)</label>
</div>
<div id="sexrole-sliders" style="opacity: 0.5; pointer-events: none;">
<div class="distribution-preview" id="sexrole-preview">
<div class="distribution-segment seg-1" style="width: 33%"></div>
<div class="distribution-segment seg-2" style="width: 34%"></div>
<div class="distribution-segment seg-3" style="width: 33%"></div>
</div>
<div class="slider-row">
<span class="slider-label">Active</span>
<input type="range" class="npc-slider slider" id="active-slider" data-slider="1" data-group="sexrole" value="33" min="0" max="100" oninput="updateSliders(1, this.value, 'sexrole')">
<span class="slider-value" data-value="1" data-group="sexrole">33%</span>
</div>
<div class="slider-row">
<span class="slider-label">Versatile</span>
<input type="range" class="npc-slider slider" id="versatile-slider" data-slider="2" data-group="sexrole" value="34" min="0" max="100" oninput="updateSliders(2, this.value, 'sexrole')">
<span class="slider-value" data-value="2" data-group="sexrole">34%</span>
</div>
<div class="slider-row">
<span class="slider-label">Passive</span>
<input type="range" class="npc-slider slider" id="passive-slider" data-slider="3" data-group="sexrole" value="33" min="0" max="100" oninput="updateSliders(3, this.value, 'sexrole')">
<span class="slider-value" data-value="3" data-group="sexrole">33%</span>
</div>
<div class="linked-sliders-notice">Values are linked to equal 100%</div>
</div>
</div>
</div>
<!-- Dominance Range Card (LOCKED) -->
<div class="npc-gen-card locked" id="card-dominance">
<div class="card-header" onclick="toggleCard(this)">
<h3><span class="icon">👑</span> Dominance Range</h3>
<button class="card-reset" onclick="event.stopPropagation(); resetSection('dominance')">Reset</button>
<span class="card-toggle">▼</span>
</div>
<div class="card-body">
<div class="checkbox-option">
<input type="checkbox" id="dominance-link-gender" checked onchange="toggleDominanceLinkToGender()">
<label for="dominance-link-gender">Link to gender (use default ranges based on gender)</label>
</div>
<div id="dominance-sliders" style="opacity: 0.5; pointer-events: none;">
<div class="range-row">
<label>Range</label>
<div class="range-inputs">
<input type="number" id="dominance-min" value="1" min="0" max="10" onchange="validateDominanceRange()"/>
<span class="range-separator">to</span>
<input type="number" id="dominance-max" value="10" min="0" max="10" onchange="validateDominanceRange()"/>
</div>
<span class="input-hint">(0-10)</span>
</div>
</div>
</div>
</div>
<!-- Trait Settings Card (LOCKED) -->
<div class="npc-gen-card locked" id="card-traits">
<div class="card-header" onclick="toggleCard(this)">
<h3><span class="icon">⚡</span> Trait Settings</h3>
<button class="card-reset" onclick="event.stopPropagation(); resetSection('traits')">Reset</button>
<span class="card-toggle">▼</span>
</div>
<div class="card-body">
<div class="slider-row">
<span class="slider-label">Aggressive Trait <span class="tooltip-icon" data-tooltip="Chance for NPCs to have the Aggressive trait">?</span></span>
<input type="range" class="npc-slider" id="aggressive-trait-slider" value="30" min="0" max="100" oninput="updateSingleSlider('aggressive-trait')">
<span class="slider-value" id="aggressive-trait-value">30%</span>
</div>
</div>
</div>
<!-- Kink Settings Card (LOCKED) -->
<div class="npc-gen-card locked" id="card-kinks">
<div class="card-header" onclick="toggleCard(this)">
<h3><span class="icon">🔥</span> Kink Settings</h3>
<button class="card-reset" onclick="event.stopPropagation(); resetSection('kinks')">Reset</button>
<span class="card-toggle">▼</span>
</div>
<div class="card-body">
<div class="checkbox-option">
<input type="checkbox" id="kinks-enabled" checked onchange="toggleKinks()">
<label for="kinks-enabled">Enable kink generation for NPCs</label>
</div>
<div id="kinks-sliders">
<div class="slider-row">
<span class="slider-label">Kink Probability <span class="tooltip-icon" data-tooltip="Chance for each NPC to have kinks">?</span></span>
<input type="range" class="npc-slider" id="kink-probability-slider" value="30" min="0" max="100" oninput="updateSingleSlider('kink-probability')">
<span class="slider-value" id="kink-probability-value">30%</span>
</div>
</div>
</div>
</div>
<!-- Aggression Settings Card (LOCKED) -->
<div class="npc-gen-card locked" id="card-aggression">
<div class="card-header" onclick="toggleCard(this)">
<h3><span class="icon">😠</span> Aggression Settings</h3>
<button class="card-reset" onclick="event.stopPropagation(); resetSection('aggression')">Reset</button>
<span class="card-toggle">▼</span>
</div>
<div class="card-body">
<div class="checkbox-option">
<input type="checkbox" id="default-settings" checked onchange="toggleAggressionSettings()">
<label for="default-settings">Use default aggression settings</label>
</div>
<div id="aggression-sliders" style="opacity: 0.5; pointer-events: none;">
<div class="slider-row">
<span class="slider-label">Aggressive NPC Chance <span class="tooltip-icon" data-tooltip="Chance for NPCs to spawn with high aggression">?</span></span>
<input type="range" class="npc-slider" id="aggressiveapear-slider" value="33" min="0" max="100" oninput="updateSingleSlider('aggressiveapear')">
<span class="slider-value" id="aggressiveapear-value">33%</span>
</div>
<div class="slider-row">
<span class="slider-label">Attack Player Chance <span class="tooltip-icon" data-tooltip="Chance for aggressive NPCs to attack the player">?</span></span>
<input type="range" class="npc-slider" id="aggressivechance-slider" value="33" min="0" max="100" oninput="updateSingleSlider('aggressivechance')">
<span class="slider-value" id="aggressivechance-value">33%</span>
</div>
</div>
</div>
</div>
</div>
<!-- Footer -->
<div class="npc-gen-footer">
<div class="npc-gen-warning">
<strong>Note:</strong> The NPC generator does not affect your neighbor or quest NPCs.
</div>
<div class="npc-gen-actions">
<button class="btn-reset-all" onclick="resetAllSettings()">Reset All</button>
<div class="btn"><<button "Continue" "PlayerCreate">>
/* Save all settings to gameSettings */
<<run $gameSettings.defaultAggression = document.getElementById("default-settings").checked>>
<<run $gameSettings.aggressiveAppearNum = parseInt(document.getElementById("aggressiveapear-slider").value)>>
<<run $gameSettings.aggressiveChance = parseInt(document.getElementById("aggressivechance-slider").value)>>
/* Population counts */
<<run $generateNumber.students = 15>>
<<run $generateNumber.citizens = parseInt(document.getElementById("citizens-count").value)>>
<<run $generateNumber.familyMembers = parseInt(document.getElementById("family-count").value)>>
/* Age ranges */
<<run $gameSettings.ageRange = {
students: { min: 18, max: 25 },
citizens: { min: parseInt(document.getElementById("citizen-age-min").value), max: parseInt(document.getElementById("citizen-age-max").value) }
}>>
/* Gender distribution */
<<run _genderValues = ["Male", "Female", "Trans"]>>
<<run _genderDistribution = {Male: 0, Female: 0, Trans: 0}>>
<<run _genderDistribution.Male = parseInt(document.getElementById("men-slider").value)>>
<<run _genderDistribution.Female = parseInt(document.getElementById("women-slider").value)>>
<<run _genderDistribution.Trans = parseInt(document.getElementById("trans-slider").value)>>
<<run $gameSettings.genderDistribution = {Male: _genderDistribution.Male, Female: _genderDistribution.Female, Trans: _genderDistribution.Trans}>>
<<run $studentGenderArray = generateArray($generateNumber.students, _genderValues, _genderDistribution)>>
<<run $citizensGenderArray = generateArray($generateNumber.citizens + $generateNumber.familyMembers, _genderValues, _genderDistribution)>>
/* Race/Skin distribution */
<<run _skinValues = ["White", "Black", "Asian"]>>
<<run _skinDistribution = {White: 0, Black: 0, Asian: 0}>>
<<run _skinDistribution.White = parseInt(document.getElementById("white-slider").value)>>
<<run _skinDistribution.Black = parseInt(document.getElementById("black-slider").value)>>
<<run _skinDistribution.Asian = parseInt(document.getElementById("asian-slider").value)>>
<<run $studetsSkinsArray = generateArray($generateNumber.students, _skinValues, _skinDistribution)>>
<<run $citizensSkinArray = generateArray($generateNumber.citizens + $generateNumber.familyMembers, _skinValues, _skinDistribution)>>
/* Sexual orientation distribution */
<<run _sexualOrientationValues = ["Straight", "Bi", "Homo"]>>
<<run _sexualOrientationDistribution = {Straight: 0, Homo: 0, Bi: 0}>>
<<run _sexualOrientationDistribution.Straight = parseInt(document.getElementById("straight-slider").value)>>
<<run _sexualOrientationDistribution.Bi = parseInt(document.getElementById("bi-slider").value)>>
<<run _sexualOrientationDistribution.Homo = parseInt(document.getElementById("homo-slider").value)>>
<<run $studentSexPrefArray = generateArray($generateNumber.students, _sexualOrientationValues, _sexualOrientationDistribution)>>
<<run $citizensSexPrefArray = generateArray($generateNumber.citizens + $generateNumber.familyMembers, _sexualOrientationValues, _sexualOrientationDistribution)>>
/* Body type distribution */
<<run $gameSettings.bodyTypeDistribution = {
skinny: parseInt(document.getElementById("skinny-slider").value),
fit: parseInt(document.getElementById("fit-slider").value),
average: parseInt(document.getElementById("average-slider").value),
chubby: parseInt(document.getElementById("chubby-slider").value)
}>>
/* Sex role settings */
<<run $gameSettings.sexRoleLinkToGender = document.getElementById("sexrole-link-gender").checked>>
<<run $gameSettings.sexRoleDistribution = {
active: parseInt(document.getElementById("active-slider").value),
versatile: parseInt(document.getElementById("versatile-slider").value),
passive: parseInt(document.getElementById("passive-slider").value)
}>>
/* Dominance settings */
<<run $gameSettings.dominanceLinkToGender = document.getElementById("dominance-link-gender").checked>>
<<run $gameSettings.dominanceRange = {
min: parseInt(document.getElementById("dominance-min").value),
max: parseInt(document.getElementById("dominance-max").value)
}>>
/* Trait settings */
<<run $gameSettings.aggressiveTraitChance = parseInt(document.getElementById("aggressive-trait-slider").value)>>
/* Kink settings */
<<run $gameSettings.kinksEnabled = document.getElementById("kinks-enabled").checked>>
<<run $gameSettings.kinkProbability = parseInt(document.getElementById("kink-probability-slider").value)>>
<</button>></div>
</div>
</div>
</div>
<<done>>
<<script>>
/* Override updateSliders to also update preview (needs to be done after DOM is ready) */
const originalUpdateSliders = window.updateSliders;
if (originalUpdateSliders) {
window.updateSliders = function(changedSlider, newValue, groupId) {
originalUpdateSliders(changedSlider, newValue, groupId);
window.updateDistributionPreview(groupId);
/* Update value displays with % sign */
const sliders = document.querySelectorAll('.npc-slider[data-group="' + groupId + '"]');
sliders.forEach((slider, index) => {
const valueSpan = document.querySelector('.slider-value[data-group="' + groupId + '"][data-value="' + (index + 1) + '"]');
if (valueSpan) {
valueSpan.textContent = Math.round(parseFloat(slider.value)) + '%';
}
});
};
}
/* Initialize distribution previews after DOM is ready */
['gender', 'race', 'sexpref', 'bodytype', 'sexrole'].forEach(function(groupId) {
window.updateDistributionPreview(groupId);
});
<</script>>
<</done>>
<</nobr>><<nobr>>
<<set $shouldHideBar = true>>
<div class="player-create-container">
<div class="player-create-title">Create Your Character</div>
<div class="player-create-subtitle">Customize your appearance and game settings</div>
<div class="player-create-grid">
<!-- Avatar Preview Card -->
<div class="pc-card avatar-card">
<div class="avatar-preview-wrapper">
<<set _characterIcon = "Media\\Characters\\" + $skin + "\\Face\\" + $playerFaceType + "\\" + (($gender == "Male") ? 0 : 6) + ".jpeg">>
<div class="avatar-preview-frame" id="avatar-frame">
<img class="avatar-image" id="charico" @src="_characterIcon" alt="Your Character">
</div>
<div class="avatar-label">Preview</div>
<!-- Face Selection -->
<div class="avatar-face-panel">
<div class="avatar-face-header">
<div class="avatar-face-title">Face Type</div>
<<set _faceDisplayNum = $playerFaceType + 1>>
<div class="face-counter">
Face <span class="current-face" id="faceNumber"><<= _faceDisplayNum>></span> of 40
</div>
</div>
<div class="face-selector">
<button class="face-nav-btn" id="prevFace" onclick="changeFace(-1)">◀</button>
<div class="face-preview-container">
<<set _prevFace = ($playerFaceType > 0) ? $playerFaceType - 1 : 39>>
<<set _nextFace = ($playerFaceType < 39) ? $playerFaceType + 1 : 0>>
<<set _prevIcon = "Media\\Characters\\" + $skin + "\\Face\\" + _prevFace + "\\" + (($gender == "Male") ? 0 : 6) + ".jpeg">>
<<set _currentIcon = "Media\\Characters\\" + $skin + "\\Face\\" + $playerFaceType + "\\" + (($gender == "Male") ? 0 : 6) + ".jpeg">>
<<set _nextIcon = "Media\\Characters\\" + $skin + "\\Face\\" + _nextFace + "\\" + (($gender == "Male") ? 0 : 6) + ".jpeg">>
<img class="face-thumbnail" id="prevFaceThumb" @src="_prevIcon" alt="Previous face" onclick="changeFace(-1)">
<img class="face-main-preview" id="currentFacePreview" @src="_currentIcon" alt="Current face">
<img class="face-thumbnail" id="nextFaceThumb" @src="_nextIcon" alt="Next face" onclick="changeFace(1)">
</div>
<button class="face-nav-btn" id="nextFace" onclick="changeFace(1)">▶</button>
</div>
<div class="face-slider-container">
<<set _sliderValue = $playerFaceType>>
<input type="range" class="face-slider" id="faceSlider" min="0" max="39" @value="_sliderValue" oninput="setFaceFromSlider(this.value)">
</div>
</div>
</div>
</div>
<!-- Identity Card -->
<div class="pc-card">
<div class="pc-card-header">
<h3><span class="icon">👤</span> Identity</h3>
</div>
<div class="pc-card-body">
<!-- Name Inputs -->
<div class="name-input-group">
<div class="name-input-row">
<div class="name-input-wrapper">
<label>First Name</label>
<input type="text" id="firstName" name="firstName" placeholder="Enter first name" value="First Name">
</div>
<button class="random-name-btn" id="randomFirstName" title="Random Name">🎲</button>
</div>
<div class="name-input-row">
<div class="name-input-wrapper">
<label>Last Name</label>
<input type="text" id="secondName" name="secondName" placeholder="Enter last name" value="Second Name">
</div>
<button class="random-name-btn" id="randomSecondName" title="Random Name">🎲</button>
</div>
</div>
<!-- Gender Selection -->
<div class="visual-selector">
<span class="visual-selector-label">Gender</span>
<div class="visual-selector-options" id="gender-selector">
<<set _maleClass = ($gender == "Male") ? "selector-option selected" : "selector-option">>
<<set _femaleClass = ($gender == "Female") ? "selector-option selected" : "selector-option">>
<<set _transClass = ($gender == "Trans") ? "selector-option selected" : "selector-option">>
<div @class="_maleClass" data-value="Male" onclick="selectGender('Male')">
<span class="option-icon">♂️</span>
<span class="option-label">Male</span>
</div>
<div @class="_femaleClass" data-value="Female" onclick="selectGender('Female')">
<span class="option-icon">♀️</span>
<span class="option-label">Female</span>
</div>
<div @class="_transClass" data-value="Trans" onclick="selectGender('Trans')">
<span class="option-icon">⚧️</span>
<span class="option-label">Trans</span>
</div>
</div>
</div>
<!-- Skin Selection -->
<div class="visual-selector">
<span class="visual-selector-label">Skin Tone</span>
<div class="visual-selector-options" id="skin-selector">
<<set _whiteClass = ($skin == "White") ? "selector-option selected" : "selector-option">>
<<set _blackClass = ($skin == "Black") ? "selector-option selected" : "selector-option">>
<<set _asianClass = ($skin == "Asian") ? "selector-option selected" : "selector-option">>
<div @class="_whiteClass" data-value="White" onclick="selectSkin('White')">
<div class="skin-color-preview skin-white"></div>
<span class="option-label">White</span>
</div>
<div @class="_blackClass" data-value="Black" onclick="selectSkin('Black')">
<div class="skin-color-preview skin-black"></div>
<span class="option-label">Black</span>
</div>
<div @class="_asianClass" data-value="Asian" onclick="selectSkin('Asian')">
<div class="skin-color-preview skin-asian"></div>
<span class="option-label">Asian</span>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Settings Cards Row -->
<div class="player-create-grid">
<!-- Game Settings Card -->
<div class="pc-card">
<div class="pc-card-header">
<h3><span class="icon">⚙️</span> Game Settings</h3>
</div>
<div class="pc-card-body">
<div class="toggle-option">
<span class="toggle-label">
<span class="toggle-icon">👥</span>
NPC Activity
<span class="tooltip-icon" data-tooltip="NPCs will initiate interactions with you">?</span>
</span>
<label class="toggle-switch">
<<if $gameSettings.contentFilter.NPC_Activity>>
<input type="checkbox" id="npcActivity" checked>
<<else>>
<input type="checkbox" id="npcActivity">
<</if>>
<span class="toggle-slider"></span>
</label>
</div>
<div class="section-divider">Street Gangs</div>
<<if $gameSettings.gangDensity is undefined>><<set $gameSettings.gangDensity = 5>><</if>>
<div class="options-range-group">
<span class="options-range-label">Street crews in the city</span>
<input type="range" class="options-range-slider" id="pc-gangDensity"
min="4" max="6" step="1" @value="$gameSettings.gangDensity">
<span class="options-range-value" id="pc-gangDensity-value">$gameSettings.gangDensity</span>
</div>
<div class="toggle-option">
<span class="toggle-label">
<span class="toggle-icon">🕊</span>
No deaths among your crew (badly hurt instead)
</span>
<label class="toggle-switch">
<<if $gameSettings.gangNoDeaths>>
<input type="checkbox" id="gangNoDeaths" checked>
<<else>>
<input type="checkbox" id="gangNoDeaths">
<</if>>
<span class="toggle-slider"></span>
</label>
</div>
<div class="section-divider">History Navigation</div>
<div class="toggle-option">
<span class="toggle-label">
<span class="toggle-icon">⏪</span>
Enable Back / Forward Steps
</span>
<label class="toggle-switch">
<<if $gameSettings.historyEnabled>>
<input type="checkbox" id="historyEnabled" checked>
<<else>>
<input type="checkbox" id="historyEnabled">
<</if>>
<span class="toggle-slider"></span>
</label>
</div>
<div class="options-range-group" id="pc-history-range-group">
<span class="options-range-label">Number of steps</span>
<input type="range" class="options-range-slider" id="pc-historyMaxStates"
min="1" max="30" step="1" @value="$gameSettings.historyMaxStates">
<span class="options-range-value" id="pc-history-range-value">$gameSettings.historyMaxStates</span>
</div>
<div class="options-warning">
⚠️ Each step uses ~2x more RAM and may cause lag at high values.
</div>
</div>
</div>
<!-- Content Filter Card -->
<div class="pc-card">
<div class="pc-card-header">
<h3><span class="icon">🎛️</span> Content Filter</h3>
</div>
<div class="pc-card-body">
<div class="toggle-option">
<span class="toggle-label">
<span class="toggle-icon">🐂</span>
Cuckold / Hotwife content
</span>
<label class="toggle-switch">
<<if $gameSettings.contentFilter.Cuckolding !== false>>
<input type="checkbox" id="cuckolding" checked>
<<else>>
<input type="checkbox" id="cuckolding">
<</if>>
<span class="toggle-slider"></span>
</label>
</div>
<div class="section-divider">Relationship Content</div>
<div class="content-filter-grid">
<div class="toggle-option">
<span class="toggle-label">♂️ + ♂️</span>
<label class="toggle-switch">
<<if $gameSettings.contentFilter.maleXmale>>
<input type="checkbox" id="maleXmale" checked>
<<else>>
<input type="checkbox" id="maleXmale">
<</if>>
<span class="toggle-slider"></span>
</label>
</div>
<div class="toggle-option">
<span class="toggle-label">♂️ + ♀️</span>
<label class="toggle-switch">
<<if $gameSettings.contentFilter.maleXfemale>>
<input type="checkbox" id="maleXfemale" checked>
<<else>>
<input type="checkbox" id="maleXfemale">
<</if>>
<span class="toggle-slider"></span>
</label>
</div>
<div class="toggle-option">
<span class="toggle-label">♂️ + ⚧️</span>
<label class="toggle-switch">
<<if $gameSettings.contentFilter.maleXshemale>>
<input type="checkbox" id="maleXshemale" checked>
<<else>>
<input type="checkbox" id="maleXshemale">
<</if>>
<span class="toggle-slider"></span>
</label>
</div>
<div class="toggle-option">
<span class="toggle-label">♀️ + ♀️</span>
<label class="toggle-switch">
<<if $gameSettings.contentFilter.femaleXfemale>>
<input type="checkbox" id="femaleXfemale" checked>
<<else>>
<input type="checkbox" id="femaleXfemale">
<</if>>
<span class="toggle-slider"></span>
</label>
</div>
<div class="toggle-option">
<span class="toggle-label">♀️ + ⚧️</span>
<label class="toggle-switch">
<<if $gameSettings.contentFilter.femaleXshemale>>
<input type="checkbox" id="femaleXshemale" checked>
<<else>>
<input type="checkbox" id="femaleXshemale">
<</if>>
<span class="toggle-slider"></span>
</label>
</div>
<div class="toggle-option">
<span class="toggle-label">⚧️ + ⚧️</span>
<label class="toggle-switch">
<<if $gameSettings.contentFilter.shemaleXshemale>>
<input type="checkbox" id="shemaleXshemale" checked>
<<else>>
<input type="checkbox" id="shemaleXshemale">
<</if>>
<span class="toggle-slider"></span>
</label>
</div>
</div>
</div>
</div>
</div>
<!-- Action Buttons -->
<div class="player-create-actions">
<div class="btn"><<button "Start Game ➤" "backstory_1">><<include "ApplyPlayerCreateSettings">><</button>></div>
<div class="btn"><<button "Skip Intro">>
<<include "ApplyPlayerCreateSettings">>
<<set $shouldHideBar = false>>
<<SetSaveBtn true>>
<<run $(document).one(':passageend', function() { var gs = State.variables.gameSettings; Config.history.maxStates = gs.historyEnabled ? gs.historyMaxStates : 1; })>>
<<goto $player.info.currentLocation>>
<</button>></div>
</div>
</div>
<</nobr>>
<<script>>
$(document).one(":passagerender", function (event) {
/* Random name buttons */
$(event.content).find("#randomFirstName").on("click", function() {
var names = State.variables.gender === "Male"
? State.variables.maleNames
: State.variables.femaleNames;
var randomName = names[Math.floor(Math.random() * names.length)];
$("#firstName").val(randomName);
});
$(event.content).find("#randomSecondName").on("click", function() {
var surnames = State.variables.surnames;
var randomName = surnames[Math.floor(Math.random() * surnames.length)];
$("#secondName").val(randomName);
});
$(event.content).find("#npcActivity").on("change", function() {
State.variables.gameSettings.contentFilter.NPC_Activity = this.checked;
});
/* Content filter checkboxes */
$(event.content).find("#cuckolding").on("change", function() {
State.variables.gameSettings.contentFilter.Cuckolding = this.checked;
});
$(event.content).find("#maleXmale").on("change", function() {
State.variables.gameSettings.contentFilter.maleXmale = this.checked;
});
$(event.content).find("#maleXfemale").on("change", function() {
State.variables.gameSettings.contentFilter.maleXfemale = this.checked;
});
$(event.content).find("#maleXshemale").on("change", function() {
State.variables.gameSettings.contentFilter.maleXshemale = this.checked;
});
$(event.content).find("#femaleXfemale").on("change", function() {
State.variables.gameSettings.contentFilter.femaleXfemale = this.checked;
});
$(event.content).find("#femaleXshemale").on("change", function() {
State.variables.gameSettings.contentFilter.femaleXshemale = this.checked;
});
$(event.content).find("#shemaleXshemale").on("change", function() {
State.variables.gameSettings.contentFilter.shemaleXshemale = this.checked;
});
/* Street gangs */
$(event.content).find("#pc-gangDensity").on("input change", function() {
var n = parseInt(this.value, 10) || 5;
State.variables.gameSettings.gangDensity = n;
$(event.content).find("#pc-gangDensity-value").text(n);
});
$(event.content).find("#gangNoDeaths").on("change", function() {
State.variables.gameSettings.gangNoDeaths = this.checked;
});
/* History navigation */
var $pcRangeGroup = $(event.content).find("#pc-history-range-group");
var $pcSlider = $(event.content).find("#pc-historyMaxStates");
var $pcValueDisplay = $(event.content).find("#pc-history-range-value");
/* Initial state */
if (!State.variables.gameSettings.historyEnabled) {
$pcRangeGroup.addClass("disabled");
$pcSlider.prop("disabled", true);
}
$(event.content).find("#historyEnabled").on("change", function() {
State.variables.gameSettings.historyEnabled = this.checked;
if (this.checked) {
$pcRangeGroup.removeClass("disabled");
$pcSlider.prop("disabled", false);
} else {
$pcRangeGroup.addClass("disabled");
$pcSlider.prop("disabled", true);
}
});
$pcSlider.on("input", function() {
var val = parseInt(this.value, 10);
State.variables.gameSettings.historyMaxStates = val;
$pcValueDisplay.text(val);
});
if (typeof updateFaceThumbnails === "function") {
updateFaceThumbnails();
}
});
<</script>><<nobr>>
<<run $AllClothes = new Wardrobe()>>
<<run $AllClothes.registerClothes()>>
<<set $Characters = []>>
/* Apply game settings from checkboxes */
<<run $gameSettings.contentFilter.NPC_Activity = document.getElementById("npcActivity").checked>>
<<run $gameSettings.contentFilter.PlayerFeminization = true>>
<<run $gameSettings.contentFilter.maleXmale = document.getElementById("maleXmale").checked>>
<<run $gameSettings.contentFilter.maleXfemale = document.getElementById("maleXfemale").checked>>
<<run $gameSettings.contentFilter.maleXshemale = document.getElementById("maleXshemale").checked>>
<<run $gameSettings.contentFilter.femaleXfemale = document.getElementById("femaleXfemale").checked>>
<<run $gameSettings.contentFilter.femaleXshemale = document.getElementById("femaleXshemale").checked>>
<<run $gameSettings.contentFilter.shemaleXshemale = document.getElementById("shemaleXshemale").checked>>
<<run $gameSettings.historyEnabled = document.getElementById("historyEnabled").checked>>
<<run $gameSettings.gangNoDeaths = document.getElementById("gangNoDeaths").checked>>
<<run $gameSettings.gangDensity = parseInt(document.getElementById("pc-gangDensity").value, 10) || 5>>
<<run $gameSettings.historyMaxStates = parseInt(document.getElementById("pc-historyMaxStates").value, 10)>>
/* The calendar must exist before anyone is created: NPC needs, wages and jobs are
anchored to the moment of creation, and without a date that moment is 1 January,
so the first tick charged months of hunger and paid months of back wages. */
<<run $dateTime = new DateTime({
year: 2025,
month: 9,
day: 3,
hours: 7,
minutes: 5,
})>>
<<run $player = CreateCharacter({
skin: $skin,
gender: $gender,
firstName: document.getElementById("firstName").value,
secondName: document.getElementById("secondName").value,
faceType: $playerFaceType,
age: 18,
isPlayer: true,
penisSize: (($gender == "Female") ? 0 : 5),
vaginaSize: (($gender == "Female") ? 30 : 0),
face: (($gender == "Male") ? 0.0 : 6.0),
teeth: 2,
breastSize: (($gender == "Male") ? 0 : 1),
buttSize: (($gender == "Male") ? 0 : 1),
fat: 40,
clothesPreference: (($gender == "Male") ? "men" : "women"),
SexRole: "Active",
money: 100,
lockpick: 0,
sexStamina: 3,
dominance: 0,
guns: 0,
meleeWeapons: 0,
speech: 0,
performer: 0,
intelligence: 0,
corruption: 0,
strength: 0,
vitality: 0,
endurance: 0,
dexterity: 0,
defense: 0,
lust: 0,
}, false)>>
<<include "CharactersCreate">>
/* A new game: roll the street-gang world now that the calendar exists, at the chosen
density, so its opening deals, debts and grudges are dated from the first day. */
<<if typeof rerollGangWorld === "function">><<run rerollGangWorld(State.variables)>><</if>>
<<set $showPlayerStat = 1>>
<<run RelocateCharacters()>>
<<set $player.info.currentLocation = "Player_Bedroom_PHome">>
<<set $canShowStatsBtn = false>>
<<unset $gender, $genderPick, $playerFaceType, _skins, _genders>>
<<run $player.AddCloth()>>
<<run $Characters[0].AddCloth(true)>>
<<unset $maleNames $femaleNames $surnames>>
<</nobr>><<nobr>>
<div class="chat-container" style="padding-top: 5px; padding-bottom: 5px;">
<p>$interactionNpc.info.firstName $interactionNpc.info.secondName. $interactionNpc.info.age.value-year-old <<print $interactionNpc.gender()>>. With a
<<if $interactionNpc.clothes.hasClothingType(1) == false && $interactionNpc.clothes.hasClothingType(2) == false>>
__<<link $interactionNpc.getBreastText()>>
<<script>>
Dialog.create(SugarCube.State.variables.interactionNpc.getBreastText());
Dialog.wiki(SugarCube.State.variables.interactionNpc.getBreastImage());
Dialog.open();
<</script>>
<</link>>__
<<else>>
<span style="color: #fff;"><<print $interactionNpc.getBreastText()>></span> under clothing
<</if>>
and
<<if $interactionNpc.clothes.hasClothingType(0) == false && $interactionNpc.clothes.hasClothingType(3) == false>>
__<<link $interactionNpc.getButtText()>>
<<run Dialog.create(SugarCube.State.variables.interactionNpc.getButtText())>>
<<run Dialog.wiki(SugarCube.State.variables.interactionNpc.getAssImage())>>
<<run Dialog.open()>>
<</link>>__
<<else>>
<span style="color: #fff;"><<print $interactionNpc.getButtText()>></span> under clothing.
<</if>>
<<if $interactionNpc.clothes.clothingItems.size > 0>>
<<set _isHasCloth = false>>
<br><<print $interactionNpc.pronoun()>> is wearing:
<<for _i = 0; _i <= 8; _i++>>
<<capture _i>>
<<if $interactionNpc.clothes.hasClothingType(_i)>>
<<if (_i == 0 && $interactionNpc.clothes.hasClothingType(3)) || (_i == 1 && $interactionNpc.clothes.hasClothingType(2))>>
<<continue>>
<</if>>
<<if _isHasCloth == true>>
,
<</if>>
<<set _isHasCloth = true>>
__<<link $interactionNpc.clothes.getFirstClothingItemByType(_i).name>>
<<run Dialog.create($interactionNpc.clothes.getFirstClothingItemByType(_i).name)>>
<<run Dialog.wiki($interactionNpc.clothes.getFirstClothingItemByType(_i).getImg())>>
<<run Dialog.open();>>
<</link>>__
<<capture _i>>
<<if _canTakeClothOff == true>>
__<<link " (take off)" "TakeOff_clothes">>
<<set $clothID = _i>>
<</link>>__
<</if>>
<</capture>>
<</if>>
<</capture>>
<</for>>
<</if>>
<<if $interactionNpc.clothes.hasClothingType(0) == false && $interactionNpc.clothes.hasClothingType(3) == false>>
<<if $interactionNpc.genitalia() == "Penis">>
. <<print $interactionNpc.pronoun()>> have a <<print Math.trunc($interactionNpc.body.penisSize.value)>>-centimeter penis.
<<else>>
. <<print $interactionNpc.pronoun()>> have a vagina.
<</if>>
<</if>>
</p>
</div>
<</nobr>><<nobr>>
<<set $shouldHideBar = true>>
<<EachLoc>>
<fieldset>
<legend>Stats</legend>
<div id="characterCustomization">
<h2>Free Points: <span id="freePoints">10</span></h2>
<div id="attributes">
<div class="attribute">
<button class="decrease">-</button>
<label>Dominance:</label>
<span class="attributeValue" id="dominance" data-max="100" data-min="0" data-step="1">20</span>
<button class="increase">+</button>
</div>
<div class="text-center"><span>Body</span></div>
<<if $player.gender() != "Male">>
<div class="attribute">
<button class="decrease">-</button>
<label>Breast Size:</label>
<span class="attributeValue" id="breast-size" data-max="6" data-min="0" data-step="1">1</span>
<button class="increase">+</button>
</div>
<div class="attribute">
<button class="decrease">-</button>
<label>Butt Size:</label>
<span class="attributeValue" id="butt-size" data-max="6" data-min="0" data-step="1">1</span>
<button class="increase">+</button>
</div>
<</if>>
<<if $player.gender() != "Female">>
<div class="attribute">
<button class="decrease">-</button>
<label>Penis Size:</label>
<span class="attributeValue" id="penis-size" data-max="30" data-min="5" data-step="1">5</span>
<button class="increase">+</button>
</div>
<</if>>
<div class="text-center"><span>Other</span></div>
<div class="attribute">
<button class="decrease">-</button>
<label>Money:</label>
<span class="attributeValue" id="money" data-max="10000000" data-min="0" data-step="100">100</span>
<button class="increase">+</button>
</div>
</div>
</div>
</fieldset>
<<done>>
<<script>>
var freePointsElement = document.getElementById("freePoints");
let freePoints = parseInt(freePointsElement.textContent || "0");
document.querySelectorAll(".increase").forEach(button => {
button.addEventListener("click", () => {
var attributeValueElement = button.closest('.attribute').querySelector('.attributeValue');
var currentVal = parseInt(attributeValueElement.textContent);
var maxVal = parseInt(attributeValueElement.getAttribute('data-max') || "0");
var step = parseInt(attributeValueElement.getAttribute('data-step') || "0");
if (currentVal + step <= maxVal && freePoints >= 1) {
attributeValueElement.textContent = currentVal + step;
freePoints -= 1;
freePointsElement.textContent = freePoints;
}
});
});
document.querySelectorAll(".decrease").forEach(button => {
button.addEventListener("click", () => {
var attributeValueElement = button.closest('.attribute').querySelector('.attributeValue');
var currentVal = parseInt(attributeValueElement.textContent);
var minVal = parseInt(attributeValueElement.getAttribute('data-min') || "0");
var step = parseInt(attributeValueElement.getAttribute('data-step') || "0");
if (currentVal - step >= minVal) {
attributeValueElement.textContent = currentVal - step;
freePoints += 1;
freePointsElement.textContent = freePoints;
}
});
});
<</script>>
<</done>>
<div class="padding-top">
<div class="btn"><<button "Start ➤" "backstory_1">><<include "ApplyStartSettings">><</button>></div>
</div>
<div class="padding-top">
<div class="btn"><<button "Skip Intro" $player.info.currentLocation>>
<<include "ApplyStartSettings">>
<<set $shouldHideBar = false>>
<<SetSaveBtn true>>
<</button>></div>
</div>
<</nobr>><<nobr>>
<<run _CharacterCustomization = {
moneyElement: 0,
fightingSkills: 0,
dominance: 0,
breastSize: 0,
buttSize: 0,
penisSize: 0,
photoModel: 0,
pornActor: 0,
}>>
<<run _CharacterCustomization.moneyElement = parseInt(document.getElementById('money').textContent, 10)>>
<<run _CharacterCustomization.dominance = parseInt(document.getElementById('dominance').textContent, 10)>>
<<if $player.gender() != "Male">>
<<run _CharacterCustomization.breastSize = parseInt(document.getElementById('breast-size').textContent, 10)>>
<<run _CharacterCustomization.buttSize = parseInt(document.getElementById('butt-size').textContent, 10)>>
<</if>>
<<if $player.gender() != "Female">>
<<run _CharacterCustomization.penisSize = parseInt(document.getElementById('penis-size').textContent, 10)>>
<</if>>
<<run $player.money = _CharacterCustomization.moneyElement>>
<<run $player.attributes.dominance.value = _CharacterCustomization.dominance>>
<<if $player.gender() != "Male">>
<<run $player.body.breastSize.value = _CharacterCustomization.breastSize>>
<<run $player.body.buttSize.value = _CharacterCustomization.buttSize>>
<</if>>
<<if $player.gender() != "Female">>
<<run $player.body.penisSize.value = _CharacterCustomization.penisSize>>
<</if>>
<<run $player.info.reputation.photoModel.value = 0>>
<<run $player.info.reputation.pornActer.value = 0>>
<</nobr>><<nobr>>
<<if !$startQuestCreated && getQuestState("main_quest1_college") == undefined>>
<<run _questList = [
{
id: "main_quest1_college",
title: "First day",
description: "You've been accepted into college - now it's time to attend your very first class.",
state: "active",
questType: "main",
tasks: [
{ description: "Attend your first college class", completed: false }
],
}
]>>
<<CreateQuest _questList true>>
<<set $startQuestCreated = true>>
<</if>>
<</nobr>><<nobr>>
<<include "CharactersData">>
/* All widget passages carry the [widget] tag and are auto-registered at startup -
do not include them here. */
<</nobr>><<nobr>>
/* Config.history.maxStates is set after $gameSettings init below */
<<set $gender = "Male">>
<<set $skin = "White">>
<<set $genderPick = 0>>
<<set $playerFaceType = 0>>
<<set $characterID = 0>>
<<set $shouldHideBar = true>>
<<include "CharactersData">>
/* All widget passages carry the [widget] tag and are auto-registered at startup -
do not include them here. */
<<run resetQuestRuntimeState()>>
<<set $generateNumber =
{
students: 50,
citizens: 50,
familyMembers: 20,
}>>
<<set $Families = []>>
<<set $SoloHouses = []>>
<<set $currentHouseId = 0>>
<<set $gameSettings = {
version: "0.0.30",
difficulty: "Easy",
contentFilter: {PlayerFeminization: true, NPC_Activity: true, maleXmale: true, maleXfemale: true, maleXshemale: true,
femaleXfemale: true, femaleXshemale: true, shemaleXshemale: true, Cuckolding: true, nonConsent: true},
allowSaves: false,
fadeBackground: true,
defaultAggression: true,
aggressiveAppearNum: 0,
aggressiveChance: 0,
NpcCanImproveSkills: true,
battleMode: "Standard",
/* Enhanced Interaction System is now the only interaction system */
/* NPC Generation Settings */
ageRange: {
students: { min: 18, max: 25 },
citizens: { min: 20, max: 50 }
},
bodyTypeDistribution: {
skinny: 15,
fit: 35,
average: 35,
chubby: 15
},
sexRoleDistribution: {
active: 33,
versatile: 34,
passive: 33
},
sexRoleLinkToGender: true,
dominanceRange: { min: 1, max: 10 },
dominanceLinkToGender: true,
aggressiveTraitChance: 30,
kinksEnabled: true,
kinkProbability: 30,
attributeRanges: {
combat: { min: 0, max: 10 },
social: { min: 0, max: 10 },
skills: { min: 0, max: 10 }
},
historyEnabled: false,
historyMaxStates: 3,
showGameTips: true,
autoSaveEnabled: true,
sfxVolume: 50,
musicVolume: 50,
ambientVolume: 50,
sexSfxVolume: 50,
metricToastsEnabled: true,
interactiveScenes: false,
banner: {
show: false,
title: "Version 0.0.25 is available!",
text: "Get early access to the latest version on Patreon.",
link: "https://www.patreon.com/c/Viceburg"
},
}>>
<<run Config.history.maxStates = $gameSettings.historyEnabled ? $gameSettings.historyMaxStates : 1>>
<<set $PData = {
bankBalance: 0,
}>>
<<set $weather = {
isRaining: false,
rainEndMinute: 0,
nextRainCheckMinute: 0
}>>
<<set $playerBrothel = {
owned: false,
name: "Brothel",
rooms: 1,
maxRooms: 10,
clientRooms: 1,
prostitutes: [],
workerAssignments: {},
upgrades: {
advertising: false,
security: false,
bar: false,
vipZone: false,
lighting: false,
furniture: false,
trainingRoom: false,
dungeon: false,
spa: false,
medical: false,
relaxation: false,
masterRoom: false
},
dailyEarnings: 0,
uncollectedEarnings: 0,
totalEarnings: 0,
pendingWeeklyEarnings: 0,
weeklyEarnings: 0,
lastPayDay: 0,
reputation: 0,
level: 1,
maxReputation: 100,
visitedToday: false,
skillPoints: 0,
perks: {
seeStats: false,
profitBonus: 0,
energySaving: 0,
securityDiscount: false,
feminizationAttempts: false,
haggle: false,
biweeklyPay: false,
playerProfitBonus: 0,
relaxationSpeed: 0,
surgeryDiscount: false
},
prisoners: [],
dungeonCells: 1,
debtWorkers: []
}>>
<<set $playerFollowers = []>>
<<set $NpcInteractions = []>>
<<set $npcRelationSpeedMultiplier = 1>>
<<set $travelMode = "walk">>
<<set $playercars = []>>
<<set $pimp_Whores = []>>
<<set $pimp_Guards = []>>
<<set $npcEmployment = {
revision: 1,
seed: 5370206,
recordsByNpcId: {},
workplaceNpcIds: {},
professionNpcIds: {}
}>>
<<set $Locations = {
"CollegeHall": [],
"Auditorium": [],
"WomensRestroom": [],
"MensRestroom": [],
"Campus": [],
"Mall": [],
"GiftShop": [],
"Pharmacy": [],
"Grocery": [],
"FitnessClub": [],
"Park": [],
"ParkRestrooms": [],
"Clinic": [],
"ClothingStore": [],
"RedLightDistrict": [],
"SexShop": [],
"PornStudio": [],
"PhotoStudio": [],
"Villa": [],
"VillaBedroom": [],
"BrothelCorridor_Pimp": [],
"FeminizationRoom_Pimp": [],
"PimpRoom_Pimp": [],
"BrothelHall_Pimp": [],
"EntertainmentDistrict": [],
"Bar": [],
"ResidentialArea": [],
"Neighborhood": [],
"OakStreet_Neighborhood": [],
"LivingRoom_Apartments": [],
"Bedroom_Apartments": [],
"Player_Bedroom_PHome": [],
"Ethan_Bedroom_PHome": [],
"Sarah_Bedroom_PHome": [],
"Amanda_Bedroom_PHome": [],
"Bathroom_PHome": [],
"Living_Room_PHome": [],
"Kitchen_PHome": [],
"Basement_PHome": [],
"Oak_Street": [],
"ElectronicsStore": [],
"Library": [],
"Business_District": [],
"BC_Reception": [],
"BC_Open_Workspace": [],
"BC_Amanda_Office": [],
"BC_CEO_Office": [],
"BC_Restroom": [],
"SR_SkidRow": [],
"SR_Warehouse": [],
"SR_Shop": [],
"SR_Motel": [],
"SR_BlackMarket": [],
"SR_BarRow": [],
"SR_Alleys": [],
"SR_Tenements": [],
"SR_Courtyard": [],
"SR_Rooftops": [],
"SR_PawnRow": [],
"SR_PawnShop": [],
"SR_StreetDoc": [],
"SR_RailYard": [],
"SC_StripClub": [],
"SC_Bar": [],
"NC_DanceFloor": [],
"NC_Bar": [],
"NC_VIP_Lounge": [],
"NC_Restroom": [],
"SR_Motel_Room": [],
"Bank": [],
"Downtown": [],
"CarDealership": [],
"ConstructionSite": [],
"TechCompany": [],
"FireStation": [],
"Factory": [],
"PowerPlant": [],
"PostOffice": [],
"LogisticsCenter": [],
"CityHall": [],
"NewsOffice": [],
"AutoRepairShop": [],
"TaxiDepot": [],
"WasteDepot": [],
"LawOffice": [],
"PoliceStation": [],
"HoldingCell": [],
"PoliceRoom": [],
"Prison_Intake": [],
"Prison_Block": [],
"Prison_Yard": [],
"Prison_Chow": [],
"Prison_Showers": [],
"Prison_Commissary": [],
"Prison_GuardStation": [],
"Prison_Infirmary": [],
"Prison_Chapel": [],
"Prison_Solitary": [],
"Prison_OtherBlock": [],
"Underground_Fight_Gym": [],
"UFG_Locker_Room": [],
"UFG_Shower_Room": [],
"Diner": [],
"DinerBackRoom": [],
"PlayerBrothel_Main": [],
"PlayerBrothel_Office": [],
"PlayerBrothel_Rooms": [],
"NPC_House_Kitchen": [],
"NPC_House_Bathroom": [],
"NPC_House_MasterBedroom": [],
"NPC_House_ChildBedroom": [],
"NPC_House_Bedroom": [],
"Bus": [],
"Port": [],
"Port_Pier": [],
"Ship_Gangway": [],
"Ship_MainHall": [],
"Ship_Bar": [],
"Ship_Cabins": [],
"Ship_UpperDeck": [],
"Ship_LowerDeck": [],
"Ship_Restroom": [],
"Ship_Bridge": [],
"Ship_RadioRoom": [],
"Ship_OwnerCabin": [],
"Ship_EngineRoom": [],
"Ship_Galley": [],
}>>
/* Cruise Tournament - voyage state ($ship). Default = ashore.
Lifecycle managed by src/scripts/Tournament/cruise.ts. */
<<set $ship = {
onBoard: false,
departed: false,
boardDay: 0,
returnDay: 0,
deadlineDay: 0,
heldMoney: 0,
loanTier: null,
loan: 0,
corr: 0,
}>>
/* Cruise Tournament - lightweight NPC roster (generated on boarding, wiped on
disembark). Managed by src/scripts/Characters/cruiseRoster.ts. */
<<set $cruiseRoster = []>>
<<set $cruiseAlliances = []>>
<<set $cruiseSkills = { tokens: 0, stealth: 0, persuasion: 0, trade: 0, crafting: 0, lockpick: 0, endurance: 0 }>>
<<set $cruiseDirector = { ticksSinceEvent: 0, winStreak: 0, lossStreak: 0 }>>
<<set $cruiseInventory = {}>>
<<set $cruiseBlueprints = []>>
<<set $cruiseMissions = { offers: [], active: [], offerDay: 0, claimedCount: 0 }>>
<<set $cruisePlayerHand = { Rock: 5, Scissors: 5, Paper: 5 }>>
/* Prison content 0.0.28 - police/law front-end ($police, doc 19) and prison
stint state ($prison, doc 02/13). Default = free and clean. Lifecycle in
src/scripts/Systems/policeSystem.ts and src/scripts/Prison/prison.ts. */
<<set $police = {
wanted: 0,
notoriety: 0,
warrants: [],
dayPass: false,
districtHeat: {},
lastCrimeDay: 0,
fugitive: false,
}>>
<<set $policeDayPass = false>>
<<set $prison = {
inside: false,
block: "M",
cell: "",
arrestDay: 0,
sentenceDays: 0,
releaseDay: 0,
goodTime: 0,
priors: 0,
heldMoney: 0,
heldItems: [],
scrip: 0,
rep: 30,
heat: 0,
intakeDone: false,
}>>
/* Prison content - lightweight inmate roster (generated at intake, wiped on
release). Managed by src/scripts/Prison/prisonRoster.ts. */
<<set $prisonRoster = []>>
<<set $prisonMorningReport = []>>
<<set $activeInmateId = null>>
<<set $inmateLine = "">>
<<set $inmateRead = false>>
/* Save-safe state for the phase-by-phase consensual prison intimacy flow. */
<<set $prisonSexSession = null>>
<<set $prisonSexPartner = null>>
<<set $prisonSexAction = null>>
<<set $prisonSexLastApply = null>>
<<set $prisonSexLastPace = null>>
<<set $prisonSexClimaxChoice = null>>
<<set $prisonSexClimaxPlacement = null>>
<<set $prisonSexLine = "">>
<<set $prisonScheduleName = "">>
<<set $prisonScheduleHours = "">>
<<set $prisonScheduleKind = "">>
<<set $prisonScheduleDestination = "">>
<<set $prisonScheduleMessage = "">>
<<set $prisonScheduleVideo = "">>
<<set $prisonScheduleContent = null>>
<<set $segMsg = "">>
<<set $workMsg = "">>
<<set $commissaryMsg = "">>
<<set $commissaryVideo = "">>
<<set $commissaryContent = null>>
<<set $carMsg = "">>
<<set $carVideo = "">>
<<set $moveVideo = "">>
<<set $nightRetaliationMsg = "">>
<<set $nightThreatVideo = "">>
<<set $showerVoyeurMsg = "">>
<<set $showerVoyeurVideo = "">>
<<set $showerVoyeurContent = null>>
<<set $chowMsg = "">>
<<set $chowVideo = "">>
<<set $chowContent = null>>
<<set $guardMsg = "">>
<<set $guardVideo = "">>
<<set $cellMsg = "">>
<<set $cellVideo = "">>
<<set $protectMsg = "">>
<<set $protectVideo = "">>
<<set $gangJobMsg = "">>
<<set $businessMsg = "">>
<<set $businessReturnLocation = "">>
<<set $infirmaryMsg = "">>
<<set $infirmaryVideo = "">>
<<set $infirmaryContent = null>>
<<set $crossMsg = "">>
<<set $crossVideo = "">>
<<set $crossContent = null>>
<<set $eventOutcome = "">>
<<set $eventOutcomeKey = "">>
<<set $eventVideo = "">>
<<set $diceMsg = "">>
<<set $diceVideo = "">>
<<set $diceContent = null>>
<<set $diceRound = null>>
<<set $diceRoll = null>>
<<set $chapelMsg = "">>
<<set $holeMsg = "">>
<<set $kitchenMsg = "">>
<<set $kitchenVideo = "">>
<<set $kitchenContent = null>>
<<set $laundryMsg = "">>
<<set $laundryVideo = "">>
<<set $laundryContent = null>>
<<set $lawMsg = "">>
<<set $recMsg = "">>
<<set $recVideo = "">>
<<set $recContent = null>>
<<set $salonMsg = "">>
<<set $salonVideo = "">>
<<set $showerMsg = "">>
<<set $showerVideo = "">>
<<set $showerContent = null>>
<<set $stashMsg = "">>
<<set $weightsMsg = "">>
<<set $weightsVideo = "">>
<<set $weightsContent = null>>
<<set $yardMsg = "">>
<<set $yardVideo = "">>
<<set $yardContent = null>>
<<set $nightThreatMsg = "">>
<<set $runBlockMsg = "">>
<<set $runBlockVideo = "">>
<<set $runBlockContent = null>>
<<set $policeStopCrime = "">>
<<set $policeStopMsg = "">>
<<set $policeNakedStop = null>>
<<set $policeFightSource = null>>
<<set $policeBookingAuthority = null>>
<<set $policeCrimeAuthority = null>>
<<set $rps = null>>
<<set $ecard = null>>
<<set $allIn = null>>
<<set $endure = null>>
<<set $activeRival = null>>
<<set $rivalMsg = "">>
<<set $activeChain = null>>
<<set $chainMsg = "">>
<<set $nessaMsg = "">>
<<set $nessaSceneRole = "">>
<<set $mirrorMsg = "">>
<<set $brandtMsg = "">>
/* Cruise reputation - persists ACROSS voyages (incremented in boardShip,
never wiped on disembark). The only meta that carries over besides the body. */
<<set $cruiseReputation = { voyages: 0 }>>
<<set $activeNpcId = null>>
<<set $npcLine = "">>
/* The third-person beat from the player's last social-web move on an NPC
(cruiseScheme: side with / talk down / poison / vouch). Shown once in the
dossier, then cleared when stepping away or approaching another man. */
<<set $schemeBeat = "">>
/* Who initiated the climax scene: "player" (a successful Make a move - the NPC
feminizes, the player reclaims) or "npc" (a recovery-seeker's proposition the
player accepted - the player feminizes, the NPC reclaims). Reset after each scene. */
<<set $climaxInitiator = "player">>
/* True when the next climax is a wanted, mutual encounter (cruiseDesire) or a night
with a regular - drives the warm afterglow register instead of the predatory one.
Reset after each scene. */
<<set $climaxDesire = false>>
/* The depicted bodies for the next climax, snapshotted BEFORE its stage-transfer
runs, so the video matches the bodies during the act (a stage-6 player reads
Female/no-penis) rather than the post-transfer body. Reset after each scene. */
<<set $climaxScene = null>>
/* The two partners + snapshotted bodies for a pending threesome (cruiseThreesome),
set by the "Take them both" choice and consumed by Ship_Threesome. */
<<set $threesome = null>>
<<set $wheelResult = null>>
<<set $nightResult = null>>
/* Debt-workoff parlor handoff (cruiseIndenture): the served-patron result +
scene prose, set by the Service button and consumed by Port_IndentureService;
the one-shot refusal line shown on the next parlor render. */
<<set $indentureServe = null>>
<<set $indentureScene = null>>
<<set $indentureRefused = null>>
<<set $shopMsg = "">>
<<set $restMsg = "">>
<<set $rpsSqueezeMsg = "">>
<<set $staminaMsg = "">>
<<set $wankResult = "">>
<<set $wankCaught = null>>
<<set $maidService = null>>
<<set $maidClientScene = null>>
<<set $missionMsg = "">>
<<set $betrayMsg = "">>
<<set $betrayer = null>>
<<set $betrayReaction = "">>
<<set $feudPair = null>>
<<set $feudResult = "">>
<<set $suitorResult = "">>
<<set $jealousResult = "">>
<<set $jealousVideo = "">>
<<set $craftMsg = "">>
<<set $morningReport = null>>
<<run bootstrapAppRuntime()>>
<<set $statHistory = []>>
<<SetBackground "Media/Story/Intro/NightCity.jpg">>
<div class="start-screen">
<div class="start-screen__shell">
<div class="start-screen__meta">
<div class="start-screen__brand">
<div class="start-screen__eyebrow">Interactive Story</div>
<h1 class="start-screen__title">Viceburg</h1>
</div>
<div class="start-screen__version">v$gameSettings.version</div>
</div>
<section class="start-screen__hero" aria-labelledby="start-screen-warning">
<div class="start-screen__hero-accent">Adults Only</div>
<h2 class="start-screen__headline" id="start-screen-warning">Disclaimer</h2>
<div class="start-screen__warnings" aria-label="Content warnings">
<span class="start-screen__warning-pill">18+</span>
<span class="start-screen__warning-pill">Sexual content</span>
/* <span class="start-screen__warning-pill">Violence</span> */
</div>
<div class="start-screen__copy">
<p>Viceburg is intended only for players who are of legal age in their country.</p>
<p>The story may include explicit sexual material, suggestive imagery, coercive themes, and graphic violence.</p>
<p>If you are easily offended or are not legally allowed to view this content, exit now. Continue only if you understand and accept this warning.</p>
</div>
</section>
<<if $gameSettings.banner.show>>
<div class="start-screen__banner">
<div class="start-screen__banner-content">
<div class="start-screen__banner-text">
<strong>$gameSettings.banner.title</strong>
<span>$gameSettings.banner.text</span>
</div>
<a class="start-screen__banner-link" @href="$gameSettings.banner.link" target="_blank" rel="noopener noreferrer">Patreon ↗</a>
</div>
</div>
<</if>>
<div class="start-screen__cta">
<div class="start-screen__cta-col">
<div class="btn">
<<button "New Game" "Customize_NPC_Generation">>
<<run document.body.classList.remove('start-screen-active')>>
<<run UpdateSaveAllow()>>
<</button>>
</div>
<div class="btn">
<<button "Load Game">>
<<run openSavePanel()>>
<</button>>
</div>
</div>
<div class="start-screen__cta-col start-screen__cta-col--links">
<div class="btn">
<a class="start-screen__link-btn" href="https://viceburg.net/" target="_blank" rel="noopener noreferrer">Play Online</a>
</div>
<div class="btn">
<a class="start-screen__link-btn" href="https://www.patreon.com/c/Viceburg" target="_blank" rel="noopener noreferrer">Patreon</a>
</div>
</div>
</div>
</div>
</div>
<div class="start-screen__legacy" hidden>
<h1 style="text-align: center;">Viceburg v$gameSettings.version</h1>
<h1 style="text-align: center; color: red;">Disclaimer!</h1>
<<ChatMessage '<p>This game may contain content of an adult nature. If you are easily offended or are not yet of legal age in your country, please exit now. The game within are intended for adults only and may include scenes of sexual content, suggestive pictures, or graphic violence. Reader discretion is advised.</p>'>>
<div class="padding-top">
<div class="btn">
<<button "Load Game">><<run openSavePanel()>><</button>>
</div>
<div class="btn">
<<button "I'm of legal age in my country 🔞 ➤" "Customize_NPC_Generation">> <<run UpdateSaveAllow()>><</button>>
</div>
</div>
</div>
<</nobr>>
<<script>>
$(document).one(":passagerender", function () {
document.body.classList.add("start-screen-active");
$("#ui-bar").hide();
$(document).one(":passagestart.startScreenCleanup", function () {
document.body.classList.remove("start-screen-active");
});
});
$(document).one(":passagedisplay.startScreenScroll", function () {
function scrollStartScreenToMiddle() {
var scrollEl = document.scrollingElement || document.documentElement;
var shell = document.querySelector(".start-screen__shell");
if (!scrollEl || !shell) return;
var shellTop = shell.getBoundingClientRect().top + window.scrollY;
var shellHeight = shell.scrollHeight;
var maxScroll = Math.max(0, scrollEl.scrollHeight - window.innerHeight);
var target = Math.max(
0,
Math.min(maxScroll, Math.round(shellTop + (shellHeight / 2) - (window.innerHeight / 2)))
);
scrollEl.scrollTop = target;
window.scrollTo(0, target);
}
/* Run after SugarCube's own scroll-to-top has finished */
setTimeout(function () {
scrollStartScreenToMiddle();
}, 100);
setTimeout(function () {
scrollStartScreenToMiddle();
}, 300);
if (document.fonts && document.fonts.ready) {
document.fonts.ready.then(function () {
setTimeout(scrollStartScreenToMiddle, 50);
});
}
});
<</script>><<nobr>>
/* D6: bootstrapAppRuntime is idempotent - safe to call from a passage that re-renders. */
<<run bootstrapAppRuntime()>>
<div class="sidebar-shell">
<<if $showPlayerStat == 1>>
<<set _characterIcon = $player.getPhotoImage()>>
<section class="sidebar-card sidebar-profile-card">
<div class="sidebar-profile-hero">
<div class="sidebar-avatar-link"><img class="leftside-avatar-pic" @src="_characterIcon" alt="Avatar" id="player-icon"></div>
<div class="sidebar-profile-copy">
<div class="sidebar-card-eyebrow">Player Profile</div>
<div class="leftside-char-name" id="player-name">$player.info.firstName $player.info.secondName</div>
<div class="sidebar-money-pill" id="player-money" data-metric="money"></div>
</div>
</div>
</section>
<section class="sidebar-card sidebar-status-card">
<div class="sidebar-card-header">
<div class="sidebar-card-eyebrow">Session</div>
<div class="sidebar-card-title">Time & Status</div>
</div>
<div class="time-display sidebar-time-display">
<div id="current-date"></div>
<div id="current-time"></div>
<div id="current-day-of-week"></div>
</div>
<<if isOnBoard()>>
<<set _vp = getVoyageProgress()>>
<div class="sidebar-voyage">⚓ Voyage · Day <<= _vp.day>>/<<= _vp.total>> · <<= _vp.daysLeft>> left</div>
<div class="sidebar-voyage sidebar-voyage--state">Fem <<= femStage($player)>>/6 · Corr <<= $ship.corr>>/6 · Debt <<= $ship.loan>><<if $ship.caged>> · 🔒<</if>><<if $ship.disguised>> · 🥷<</if>></div>
/* The day's dealt hand: what is still in the player's fist, card by
card - unplayed cards are named at the ten o'clock tally. Spent
types dim so the fist reads at a glance. */
<<if $cruisePlayerHand>>
<<set _shRock = $cruisePlayerHand.Rock || 0>>
<<set _shScis = $cruisePlayerHand.Scissors || 0>>
<<set _shPap = $cruisePlayerHand.Paper || 0>>
<<set _shRockCls = "sidebar-cards__item" + (_shRock > 0 ? "" : " sidebar-cards__item--spent")>>
<<set _shScisCls = "sidebar-cards__item" + (_shScis > 0 ? "" : " sidebar-cards__item--spent")>>
<<set _shPapCls = "sidebar-cards__item" + (_shPap > 0 ? "" : " sidebar-cards__item--spent")>>
<div class="sidebar-voyage sidebar-voyage--cards" title="Your hand for the day - unplayed cards are named at the ten o'clock tally">
<span @class="_shRockCls"><img class="sidebar-cards__img" src="Media/Cruise/Items/rps_rock_card.png" alt="Rock"><b><<= _shRock>></b></span>
<span @class="_shScisCls"><img class="sidebar-cards__img" src="Media/Cruise/Items/rps_scissors_card.png" alt="Scissors"><b><<= _shScis>></b></span>
<span @class="_shPapCls"><img class="sidebar-cards__img" src="Media/Cruise/Items/rps_paper_card.png" alt="Paper"><b><<= _shPap>></b></span>
</div>
<</if>>
<<if isFullyFallen(femStage($player), $ship.corr)>><<run unlockCruiseAchievement("fullyFallen")>><</if>>
<</if>>
<div class="sidebar-alert-list">
/* City police heat only matters in the city: aboard the «Sirena»
the sheet is frozen (no decay), and in prison the intake already
zeroed it - showing the alert there is noise at a stuck value. */
<<set _sidebarWanted = getWanted($police)>>
<<if _sidebarWanted gte 15 and not isOnBoard() and not isInside()>>
<<set _sidebarWantedTier = wantedTier(_sidebarWanted)>>
<div class="sidebar-alert sidebar-alert--danger sidebar-alert--wanted">🚨 <<= _sidebarWantedTier.label>> · Heat <<= _sidebarWanted>>/100</div>
<</if>>
<<if $player.characterEvents.isEventRegistered($player.info.id, "InfectedByEfirium") == true>>
<div class="sidebar-alert sidebar-alert--danger">You're infected with Etherium.</div>
<</if>>
<<if $playerlock == true>>
<div class="sidebar-alert sidebar-alert--danger">You're locked in a chastity cage.</div>
<</if>>
</div>
</section>
<<PrisonSidebarStatus>>
<</if>>
<<if $player != undefined>>
<<if getQuestState("mad_dog_quest1") == "active" && getTaskState("mad_dog_quest1", $debtTaskName) != 'completed'>>
<<if $daysToCompleteDebt > 0>>
<div class="sidebar-note sidebar-note--quest">Days Left to Collect: <<= $daysToCompleteDebt>><<if isOnBoard() || isInside()>> (paused)<</if>></div>
<<else>>
<div class="sidebar-note sidebar-note--quest">Days Left to Collect: 0</div>
<</if>>
<<set _debtor = getCharacterByID($debtorID)>>
<<if _debtor>>
<div class="sidebar-note sidebar-note--quest">Debtor's Current Location: <<print _debtor.info.currentLocation>></div>
<</if>>
<</if>>
<section class="sidebar-card sidebar-vitals-card">
<div class="sidebar-card-header">
<div class="sidebar-card-eyebrow">Vitals</div>
<div class="sidebar-card-title">Player Condition</div>
</div>
<div class="leftbar-menu-resources">
<div class="leftbar-menu-attribute" data-metric="health">
<div class="leftbar-menu-attribute-topline">
<span class="leftbar-menu-attribute-name">Health</span>
<span class="leftbar-menu-attribute-value" id="health-value"></span>
</div>
<div class="leftbar-menu-progress-bar">
<div class="leftbar-menu-progress-fill" id="health-bar"></div>
</div>
</div>
<div class="leftbar-menu-attribute" data-metric="energy">
<div class="leftbar-menu-attribute-topline">
<span class="leftbar-menu-attribute-name">Energy</span>
<span class="leftbar-menu-attribute-value" id="energy-value"></span>
</div>
<div class="leftbar-menu-progress-bar">
<div class="leftbar-menu-progress-fill" id="energy-bar"></div>
</div>
</div>
<div class="leftbar-menu-attribute" data-metric="horny">
<div class="leftbar-menu-attribute-topline">
<span class="leftbar-menu-attribute-name">Horny</span>
<span class="leftbar-menu-attribute-value" id="horny-value"></span>
</div>
<div class="leftbar-menu-progress-bar">
<div class="leftbar-menu-progress-fill" id="horny-bar"></div>
</div>
</div>
<div class="leftbar-menu-attribute">
<div class="leftbar-menu-attribute-topline">
<span class="leftbar-menu-attribute-name">Sex Stamina</span>
<span class="leftbar-menu-attribute-value" id="sex-stamina-value"></span>
</div>
<div class="leftbar-menu-progress-bar">
<div class="leftbar-menu-progress-fill" id="sex-stamina-bar"></div>
</div>
</div>
<div class="leftbar-menu-attribute">
<div class="leftbar-menu-attribute-topline">
<span class="leftbar-menu-attribute-name">Drunkenness</span>
<span class="leftbar-menu-attribute-value" id="drunkenness-value"></span>
</div>
<div class="leftbar-menu-progress-bar">
<div class="leftbar-menu-progress-fill" id="drunkenness-bar"></div>
</div>
</div>
<div class="leftbar-menu-attribute">
<div class="leftbar-menu-attribute-topline">
<span class="leftbar-menu-attribute-name">Hygiene</span>
<span class="leftbar-menu-attribute-value" id="hygiene-value"></span>
</div>
<div class="leftbar-menu-progress-bar">
<div class="leftbar-menu-progress-fill" id="hygiene-bar"></div>
</div>
</div>
</div>
</section>
<section class="sidebar-card sidebar-control-card">
<div class="sidebar-card-header">
<div class="sidebar-card-eyebrow">Control Center</div>
<div class="sidebar-card-title">Actions & Travel</div>
</div>
<<if $canShowStatsBtn == true>>
<div class="sidebar-section">
<div class="sidebar-section-label">Main Actions</div>
<div class="player-stats-view-btn-container player-stats-view-btn-container--primary">
<div class="player-stats-view-btn"><<button "Quests" "Quests">><<set $canShowStatsBtn = false>><</button>></div>
<div class="player-stats-view-btn" id="skills-panel-btn"><<button "Stats">>
<<run Dialog.create("Info")>>
<<run Dialog.wiki('<<CharacterStatsView $player true>>')>>
<<run Dialog.open();>>
<</button>></div>
<div class="player-stats-view-btn"><<button "Inventory" "Inventory">><<set $canShowStatsBtn = false>><<set $filterType = "All">><</button>></div>
<div class="player-stats-view-btn"><<button "Wardrobe" "Wardrobe">><<set $canShowStatsBtn = false>><</button>></div>
<<if !$prison || !$prison.inside>>
<<set _phoneLabel = ($pendingPhoneCall || ($npcTextsUnread != undefined && $npcTextsUnread > 0)) ? "📱 Phone" : "Phone">>
<div class="player-stats-view-btn"><<button _phoneLabel>>
/* Re-check custody when the click executes so a stale sidebar cannot open the city phone. */
<<if !$prison || !$prison.inside>>
<<set $canShowStatsBtn = false>>
<<goto "Phone">>
<</if>>
<</button>></div>
<</if>>
<<if (!$prison || !$prison.inside) && (!$ship || !$ship.onBoard)>>
<div class="player-stats-view-btn"><<button "Streets" "GangHub">><<set $canShowStatsBtn = false>><</button>></div>
<</if>>
<div class="player-stats-view-btn player-stats-view-btn--full"><<button "Achievements" "Achievements">><<set $canShowStatsBtn = false>><</button>></div>
</div>
</div>
<div class="sidebar-section sidebar-section--tight">
<div class="sidebar-section-label">Utilities</div>
<div class="player-stats-view-btn-container player-stats-view-btn-container--utility">
<div class="player-stats-view-btn player-stats-view-btn--secondary"><<button "Cheats">><<ShowCheats $player>><</button>></div>
</div>
</div>
<</if>>
<div class="sidebar-section sidebar-section--tight">
<div class="sidebar-section-label">Support</div>
<div class="player-stats-view-btn-container player-stats-view-btn-container--utility">
<div class="player-stats-view-btn faq-btn player-stats-view-btn--secondary"><<button "FAQ">>
<<run Dialog.create("FAQ - Game Tips", "faq-dialog")>>
<<run Dialog.wiki('<<include "FAQDialog">>')>>
<<run Dialog.open()>>
<</button>></div>
<div class="player-stats-view-btn emergency-btn player-stats-view-btn--secondary"><<button "Emergency Return">>
<<run Dialog.create("Warning")>>
<<run Dialog.wiki('<<include "EmergencyReturnDialog">>')>>
<<run Dialog.open()>>
<</button>></div>
</div>
</div>
<div class="sidebar-section sidebar-section--tight sidebar-section-restart">
<div class="sidebar-section-label">Restart</div>
<div class="player-stats-view-btn-container player-stats-view-btn-container--utility">
<div class="player-stats-view-btn player-stats-view-btn--secondary"><<button "⟳ Restart">>
<<run UI.restart()>>
<</button>></div>
</div>
</div>
/* City movement is meaningless aboard the cruise or while in custody. The
walk/bus/car modes and pins only apply during ordinary city free-roam. */
<<if not isOnBoard() && (!$prison || !$prison.inside)>>
<div class="sidebar-control-divider"></div>
<div class="sidebar-section sidebar-section--movement">
<div class="sidebar-section-label">Movement</div>
<<if $player.money < 10 && $travelMode == 'bus'>>
<<set $travelMode = 'walk'>>
<</if>>
<div class="btn-container sidebar-movement-grid">
<div class="btn" id="walk-btn"></div>
<div class="btn" id="bus-btn"></div>
<div class="btn" id="car-btn"></div>
</div>
<<done>>
<<include "Update_Travel_Mode_Buttons">>
<</done>>
<<if setup.canQuickTravelToPlayerBedroom && setup.canQuickTravelToPlayerBedroom(passage())>>
<div class="sidebar-movement-return">
<<Travel "Return to Bedroom" "Player_Bedroom_PHome" "sidebar-movement-return-btn">>
</div>
<</if>>
<div class="sidebar-quick-travel">
<<TravelPinsPanel>>
</div>
</div>
<</if>>
</section>
<</if>>
</div>
<</nobr>><<nobr>>
<a href="https://www.patreon.com/Viceburg/" target="_blank">
Patreon <img src="Media/Other/patreon.png" alt="Patreon" width="16" height="16">
</a>
<<if $canShowStatsBtn == true>>
[[Options]]
<</if>>
<</nobr>><<nobr>>
<<set $canShowStatsBtn = false>>
<<set $gameSettings.allowSaves = false>>
<<include "UpdateAll">>
/* Checkbox checked-state is rendered inline via <<if>> below. Do NOT use the
@checked="_temp" directive: SugarCube's @-directive calls setAttribute()
unconditionally, and `checked` is a boolean attribute (present == on), so
@checked="" / @checked="false" still render the box as checked. That made the
Content Filter toggles snap back to ON every time Options was reopened. */
<div class="options-container">
<h1 class="options-title">Options</h1>
<!-- Tabs switch in place (no passage change, no history step); see the script below. -->
<div class="options-tabs" role="tablist">
<button type="button" class="options-tab is-active" role="tab" data-options-tab="game" aria-selected="true">🎮 Game</button>
<button type="button" class="options-tab" role="tab" data-options-tab="ai" aria-selected="false">🤖 AI</button>
</div>
<div class="options-tab-panel" data-options-panel="game" role="tabpanel">
<!-- Content Filter Card -->
<div class="options-card">
<div class="options-card-header">
<h3><span class="icon">🎛️</span> Content Filter</h3>
</div>
<div class="options-card-body">
<div class="toggle-option">
<span class="toggle-label">
<span class="toggle-icon">👥</span>
NPC Activity
</span>
<label class="toggle-switch">
<<if $gameSettings.contentFilter.NPC_Activity>>
<input type="checkbox" id="opt-npcActivity" checked>
<<else>>
<input type="checkbox" id="opt-npcActivity">
<</if>>
<span class="toggle-slider"></span>
</label>
</div>
<div class="section-divider">Relationship Content</div>
<div class="options-grid">
<div class="toggle-option">
<span class="toggle-label">♂️ + ♂️</span>
<label class="toggle-switch">
<<if $gameSettings.contentFilter.maleXmale>>
<input type="checkbox" id="opt-maleXmale" checked>
<<else>>
<input type="checkbox" id="opt-maleXmale">
<</if>>
<span class="toggle-slider"></span>
</label>
</div>
<div class="toggle-option">
<span class="toggle-label">♂️ + ♀️</span>
<label class="toggle-switch">
<<if $gameSettings.contentFilter.maleXfemale>>
<input type="checkbox" id="opt-maleXfemale" checked>
<<else>>
<input type="checkbox" id="opt-maleXfemale">
<</if>>
<span class="toggle-slider"></span>
</label>
</div>
<div class="toggle-option">
<span class="toggle-label">♂️ + ⚧️</span>
<label class="toggle-switch">
<<if $gameSettings.contentFilter.maleXshemale>>
<input type="checkbox" id="opt-maleXshemale" checked>
<<else>>
<input type="checkbox" id="opt-maleXshemale">
<</if>>
<span class="toggle-slider"></span>
</label>
</div>
<div class="toggle-option">
<span class="toggle-label">♀️ + ♀️</span>
<label class="toggle-switch">
<<if $gameSettings.contentFilter.femaleXfemale>>
<input type="checkbox" id="opt-femaleXfemale" checked>
<<else>>
<input type="checkbox" id="opt-femaleXfemale">
<</if>>
<span class="toggle-slider"></span>
</label>
</div>
<div class="toggle-option">
<span class="toggle-label">♀️ + ⚧️</span>
<label class="toggle-switch">
<<if $gameSettings.contentFilter.femaleXshemale>>
<input type="checkbox" id="opt-femaleXshemale" checked>
<<else>>
<input type="checkbox" id="opt-femaleXshemale">
<</if>>
<span class="toggle-slider"></span>
</label>
</div>
<div class="toggle-option">
<span class="toggle-label">⚧️ + ⚧️</span>
<label class="toggle-switch">
<<if $gameSettings.contentFilter.shemaleXshemale>>
<input type="checkbox" id="opt-shemaleXshemale" checked>
<<else>>
<input type="checkbox" id="opt-shemaleXshemale">
<</if>>
<span class="toggle-slider"></span>
</label>
</div>
</div>
</div>
</div>
<!-- Other Settings Card -->
<div class="options-card">
<div class="options-card-header">
<h3><span class="icon">⚙️</span> Other</h3>
</div>
<div class="options-card-body">
<div class="toggle-option">
<span class="toggle-label">
<span class="toggle-icon">📈</span>
NPC Can Improve Their Skills
</span>
<label class="toggle-switch">
<<if $gameSettings.NpcCanImproveSkills>>
<input type="checkbox" id="opt-npcSkills" checked>
<<else>>
<input type="checkbox" id="opt-npcSkills">
<</if>>
<span class="toggle-slider"></span>
</label>
</div>
<div class="toggle-option">
<span class="toggle-label">
<span class="toggle-icon">💡</span>
Show Game Tips
</span>
<label class="toggle-switch">
<<if $gameSettings.showGameTips !== false>>
<input type="checkbox" id="opt-gameTips" checked>
<<else>>
<input type="checkbox" id="opt-gameTips">
<</if>>
<span class="toggle-slider"></span>
</label>
</div>
<div class="toggle-option">
<span class="toggle-label">
<span class="toggle-icon">💾</span>
Daily Autosave
</span>
<label class="toggle-switch">
<<if $gameSettings.autoSaveEnabled !== false>>
<input type="checkbox" id="opt-autoSave" checked>
<<else>>
<input type="checkbox" id="opt-autoSave">
<</if>>
<span class="toggle-slider"></span>
</label>
</div>
<div class="toggle-option">
<span class="toggle-label">
<span class="toggle-icon">🎓</span>
Replay onboarding tutorial
</span>
<button type="button" class="options-action-btn" id="opt-startTutorial">Show now</button>
</div>
<div class="toggle-option">
<span class="toggle-label">
<span class="toggle-icon">✨</span>
Interactive Sex Scenes <span style="font-size: 0.85em; color: #ffbe45; font-style: italic; opacity: 0.85;">(experimental)</span>
</span>
<label class="toggle-switch">
<<if $gameSettings.interactiveScenes === true>>
<input type="checkbox" id="opt-interactiveScenes" checked>
<<else>>
<input type="checkbox" id="opt-interactiveScenes">
<</if>>
<span class="toggle-slider"></span>
</label>
</div>
</div>
</div>
<!-- Audio Settings Card -->
<div class="options-card">
<div class="options-card-header">
<h3><span class="icon">🔊</span> Audio</h3>
</div>
<div class="options-card-body">
<div class="options-range-group">
<span class="options-range-label">Rain Volume</span>
<input type="range" class="options-range-slider" id="opt-ambientVolume"
min="0" max="100" step="1" value="$gameSettings.ambientVolume">
<span class="options-range-value" id="ambient-volume-value">$gameSettings.ambientVolume</span>
</div>
</div>
</div>
<!-- History Navigation Card -->
<div class="options-card">
<div class="options-card-header">
<h3><span class="icon">🕘</span> History Navigation</h3>
</div>
<div class="options-card-body">
<div class="toggle-option">
<span class="toggle-label">
<span class="toggle-icon">⏪</span>
Enable Back / Forward Steps
</span>
<label class="toggle-switch">
<<if $gameSettings.historyEnabled>>
<input type="checkbox" id="opt-historyEnabled" checked>
<<else>>
<input type="checkbox" id="opt-historyEnabled">
<</if>>
<span class="toggle-slider"></span>
</label>
</div>
<div class="options-range-group" id="history-range-group">
<span class="options-range-label">Number of steps</span>
<input type="range" class="options-range-slider" id="opt-historyMaxStates"
min="1" max="30" step="1" @value="$gameSettings.historyMaxStates">
<span class="options-range-value" id="history-range-value">$gameSettings.historyMaxStates</span>
</div>
<div class="options-warning">
⚠️ Each step uses ~2x more RAM and may cause lag at high values.
</div>
</div>
</div>
<!-- DevTestLab moved to the cheat panel (Cheats → 🧪 System Test Lab). -->
</div>
<div class="options-tab-panel ai-settings" data-options-panel="ai" role="tabpanel" hidden>
<div id="ai-settings-root"><div class="options-warning">The AI settings could not load. Try reloading the page.</div></div>
</div>
<!-- Back Button -->
<div class="options-actions">
<<BackButton "<<set $canShowStatsBtn = true>> <<set $gameSettings.allowSaves = true>>">>
</div>
</div>
<</nobr>>
<<script>>
$(document).one(":passagerender", function(event) {
/* Options tabs: switch in place and remember the last one in this browser. */
var $tabs = $(event.content).find(".options-tab");
var $panels = $(event.content).find(".options-tab-panel");
var aiRendered = false;
function showOptionsTab(name) {
if (name !== "game" && name !== "ai") name = "game";
$tabs.each(function () {
var on = this.getAttribute("data-options-tab") === name;
$(this).toggleClass("is-active", on).attr("aria-selected", on ? "true" : "false");
});
$panels.each(function () {
this.hidden = this.getAttribute("data-options-panel") !== name;
});
if (name === "ai" && !aiRendered && typeof renderAiSettings === "function") {
aiRendered = true;
renderAiSettings($(event.content).find("#ai-settings-root").get(0));
}
try { localStorage.setItem("viceburg.options.tab", name); } catch (e) {}
}
$tabs.on("click", function () { showOptionsTab(this.getAttribute("data-options-tab")); });
var savedTab = "game";
try { savedTab = localStorage.getItem("viceburg.options.tab") || "game"; } catch (e) {}
showOptionsTab(savedTab);
/* Content Filter toggles */
$(event.content).find("#opt-npcActivity").on("change", function() {
State.variables.gameSettings.contentFilter.NPC_Activity = this.checked;
});
$(event.content).find("#opt-maleXmale").on("change", function() {
State.variables.gameSettings.contentFilter.maleXmale = this.checked;
});
$(event.content).find("#opt-maleXfemale").on("change", function() {
State.variables.gameSettings.contentFilter.maleXfemale = this.checked;
});
$(event.content).find("#opt-maleXshemale").on("change", function() {
State.variables.gameSettings.contentFilter.maleXshemale = this.checked;
});
$(event.content).find("#opt-femaleXfemale").on("change", function() {
State.variables.gameSettings.contentFilter.femaleXfemale = this.checked;
});
$(event.content).find("#opt-femaleXshemale").on("change", function() {
State.variables.gameSettings.contentFilter.femaleXshemale = this.checked;
});
$(event.content).find("#opt-shemaleXshemale").on("change", function() {
State.variables.gameSettings.contentFilter.shemaleXshemale = this.checked;
});
/* Other settings toggles */
$(event.content).find("#opt-npcSkills").on("change", function() {
State.variables.gameSettings.NpcCanImproveSkills = this.checked;
});
$(event.content).find("#opt-gameTips").on("change", function() {
State.variables.gameSettings.showGameTips = this.checked;
});
$(event.content).find("#opt-autoSave").on("change", function() {
State.variables.gameSettings.autoSaveEnabled = this.checked;
});
/* D5: replay tutorial button */
$(event.content).find("#opt-startTutorial").off('click').on('click', function() {
if (typeof startTutorial === 'function') startTutorial();
});
/* A5: interactive sex scenes toggle */
$(event.content).find("#opt-interactiveScenes").on("change", function() {
State.variables.gameSettings.interactiveScenes = this.checked;
});
/* Audio mixer - wires Rain (ambient) slider to gameSettings + live update */
function bindVolumeSlider(sliderId, valueId, settingKey, channel) {
var $s = $(event.content).find("#" + sliderId);
var $v = $(event.content).find("#" + valueId);
var current = State.variables.gameSettings[settingKey];
if (typeof current !== "number") current = 50;
$s.val(current);
$v.text(current);
$s.on("input", function() {
var val = parseInt(this.value, 10);
State.variables.gameSettings[settingKey] = val;
$v.text(val);
if (typeof updateChannelVolume === 'function') updateChannelVolume(channel, val);
});
}
bindVolumeSlider("opt-ambientVolume", "ambient-volume-value", "ambientVolume", "ambient");
/* History navigation */
var $rangeGroup = $(event.content).find("#history-range-group");
var $slider = $(event.content).find("#opt-historyMaxStates");
var $valueDisplay = $(event.content).find("#history-range-value");
function applyHistoryState(enabled) {
var gs = State.variables.gameSettings;
Config.history.maxStates = enabled ? gs.historyMaxStates : 1;
$('#custom-history-nav').toggle(enabled);
if (enabled) {
$rangeGroup.removeClass("disabled");
$slider.prop("disabled", false);
} else {
$rangeGroup.addClass("disabled");
$slider.prop("disabled", true);
}
}
applyHistoryState(State.variables.gameSettings.historyEnabled);
$(event.content).find("#opt-historyEnabled").on("change", function() {
State.variables.gameSettings.historyEnabled = this.checked;
applyHistoryState(this.checked);
});
$slider.on("input", function() {
var val = parseInt(this.value, 10);
State.variables.gameSettings.historyMaxStates = val;
$valueDisplay.text(val);
if (State.variables.gameSettings.historyEnabled) {
Config.history.maxStates = val;
}
});
});
<</script>>
/* :: StoryInterface
<!-- Фиксированный фоновый слой -->
<div id="bg" style="position:fixed;inset:0;z-index:-1">
<img id="bg-img"
alt=""
src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="
style="width:100%;height:100%;object-fit:cover;
filter:brightness(.2);transition:opacity .6s">
</div>
<!-- Обязательный контейнер, куда SugarCube будет рендерить все пассажи -->
<div id="passages"></div> */<<nobr>>
<<if $player.money < 10 && $travelMode == 'bus'>>
<<set $travelMode = 'walk'>>
<</if>>
<<if $travelMode == 'walk'>>
<<replace "#walk-btn">><div id="walk-btn" class="btn non-interacting"><<button '<img src="Media/Other/Walk.jpg" alt="Walk" width="32" height="32">'>><</button>></div><</replace>>
<<else>>
<<replace "#walk-btn">><div id="walk-btn" class="btn"><<button '<img src="Media/Other/Walk.jpg" alt="Walk" width="32" height="32">'>><<set $travelMode = 'walk'>><<include "Update_Travel_Mode_Buttons">><</button>></div><</replace>>
<</if>>
<<run addHoverTooltip('walk-btn', 'Travel time: 30 min. Cost: $0.')>>
<<if $player.money >= 10>>
<<if $travelMode == 'bus'>>
<<replace "#bus-btn">><div id="bus-btn" class="btn non-interacting"><<button '<img src="Media/Other/Bus.jpg" alt="Bus" width="32" height="32">'>><</button>></div><</replace>>
<<else>>
<<replace "#bus-btn">><div id="bus-btn" class="btn"><<button '<img src="Media/Other/Bus.jpg" alt="Bus" width="32" height="32">'>><<set $travelMode = 'bus'>><<include "Update_Travel_Mode_Buttons">><</button>></div><</replace>>
<</if>>
<<else>>
<<replace "#bus-btn">><div id="bus-btn" class="btn non-interacting"><<button '<img src="Media/Other/Bus.jpg" alt="Bus" width="32" height="32">'>><</button>></div><</replace>>
<</if>>
<<run addHoverTooltip('bus-btn', 'Travel time: 10 min. Cost: $10.')>>
<<if $playercars && $playercars.length>>
<<if $travelMode == 'car'>>
<<replace "#car-btn">><div id="car-btn" class="btn non-interacting"><<button '<img src="Media/Other/Car.jpg" alt="Car" width="32" height="32">'>><</button>></div><</replace>>
<<else>>
<<replace "#car-btn">><div id="car-btn" class="btn"><<button '<img src="Media/Other/Car.jpg" alt="Car" width="32" height="32">'>><<set $travelMode = 'car'>><<include "Update_Travel_Mode_Buttons">><</button>></div><</replace>>
<</if>>
<<set _gasPaid = $carGasDay === getCurrentAbsoluteDay()>>
<<run addHoverTooltip('car-btn', _gasPaid ? 'Travel time: 5 min. Gas paid for today.' : 'Travel time: 5 min. Cost: $12 for gas, once a day.')>>
<<else>>
<<if $travelMode == 'car'>>
<<set $travelMode = 'walk'>>
<</if>>
<<replace "#car-btn">><div id="car-btn" class="btn non-interacting"><<button '<img src="Media/Other/Car.jpg" alt="Car" width="32" height="32">'>><</button>></div><</replace>>
<<run addHoverTooltip('car-btn', 'Requires a car.')>>
<</if>>
<</nobr>><<nobr>>
<<set $shouldHideBar = true>>
<<EachLoc>>
<<SetBackground "Media/Story/Intro/NightCity.jpg">>
<<set _fatherIcon = "Media\\Characters\\QuestChars\\Parents\\" + $skin + "\\face\\1.png">>
<<set _motherIcon = "Media\\Characters\\QuestChars\\Parents\\" + $skin + "\\face\\2.png">>
<<ChatMessage 'The night in Viceburg was always something special. The city glowed with thousands of lights, but none of them brought warmth. They masked the darkness of the streets and the secrets best left unknown. This was the city where you lived - just an ordinary child, destined to face horrors hidden behind the facade of progress.'>>
<<ChatMessage "You (8 years old) sit on the windowsill in your room, looking at the city. Behind the door, you hear your parents' voices.">>
<<ChatWithoutNPC "Mother" _motherIcon "We can't stay silent any longer.">>
<<ChatWithoutNPC "Father" _fatherIcon "If we do this, they'll find us. They're already close.">>
<<ChatWithoutNPC "Father" _fatherIcon "But maybe we still have a chance...">>
<<ChatMessage "You didn’t understand what they were talking about, but the fear in their voices made you tense up. That night, you couldn’t sleep.">>
<div class="padding-top">
<div class="btn"><<button "Continue" "backstory_2">><</button>></div>
</div>
<</nobr>><<nobr>>
<<set $shouldHideBar = true>>
<<EachLoc>>
<<SetBackground "Media/Locations/Neighborhood/OakStreet/PlayerHome/player_House.jpg">>
<<set _ethanIcon = "Media\\Characters\\QuestChars\\Ethan\\face\\1.png">>
<<set _sarahIcon = "Media\\Characters\\QuestChars\\Sarah\\face\\1.png">>
<<set _amandaIcon = "Media\\Characters\\QuestChars\\Amanda\\face\\1.png">>
<<set _robertIcon = "Media\\Characters\\QuestChars\\Robert\\face\\1.png">>
<<ChatMessage "After your parents' disappearance, the Ashford family took you in. Robert and Amanda had been friends with your parents, and despite the tragic situation, they gladly welcomed you into their home.">>
<<ChatMessage 'You stand at the entrance, with Ethan beside you - a boy with messy brown hair and a wide grin'>>
<<DrawImg _ethanIcon>>
<<ChatWithoutNPC "Ethan" _ethanIcon "Welcome home!">>
<<ChatMessage 'Ethan said, clapping you on the shoulder'>>
<<ChatWithoutNPC 'Ethan' _ethanIcon 'You\'re one of us now!'>>
<<ChatMessage 'Sarah, Ethan\'s older sister, frowns slightly'>>
<<DrawImg _sarahIcon>>
<<ChatWithoutNPC 'Sarah' _sarahIcon 'I hope you’re not too noisy'>>
<<ChatMessage 'Sarah muttered, crossing her arms'>>
<<ChatMessage 'You tried to smile, but inside, you felt empty. Your parents were gone. Only questions and a deep, gnawing fear remained'>>
<div class="padding-top">
<div class="btn"><<button "Continue" "backstory_3">><</button>></div>
</div>
<</nobr>><<nobr>>
<<set $shouldHideBar = true>>
<<EachLoc>>
<<SetBackground "Media/Story/Intro/abandoned.jpg">>
<<ChatMessage 'Years passed, and you gradually got used to your new life. Ethan became your best friend, and Sarah… well, over time, she started to warm up to you too.'>>
<<ChatMessage 'Life in Viceburg was never boring. You often got into trouble-exploring abandoned districts, sneaking into old BioGenesis labs, hoping to find anything that could explain your parents\' disappearance.'>>
<<ChatMessage 'But no answers ever came. Only more questions'>>
<div class="padding-top">
<div class="btn"><<button "Continue" "backstory_Final">><</button>></div>
</div>
<</nobr>><<nobr>>
<<set $shouldHideBar = true>>
<<EachLoc>>
<<SetBackground "Media/Story/Intro/Night.jpg">>
<<ChatMessage 'Ten years had passed, and you still hadn’t found the truth. BioGenesis kept growing, swallowing everything in its path. You felt like something was coming-something big. Something that would change your life forever.'>>
<<Chat $player 'Tomorrow marks ten years since they vanished. Maybe it\'s finally time to find out the truth.'>>
<<ChatMessage 'you said to yourself'>>
<<ChatMessage 'Recently, you and Ethan managed to enroll in a college closely tied to BioGenesis. Perhaps there, you can finally find some answers'>>
<div class="padding-top">
<div class="btn"><<button "Continue" $player.info.currentLocation>>
<<set $shouldHideBar = false>>
<<SetSaveBtn true>>
<<set $gameSettings.allowSaves = true>>
<<set $canShowStatsBtn = true>>
<<set $isPlayer = true>>
<<run $(document).one(':passageend', function() { var gs = State.variables.gameSettings; Config.history.maxStates = gs.historyEnabled ? gs.historyMaxStates : 1; })>>
<<unset $questType $skin>>
<</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if $isPlayer == true>>
<<ShowNpcIcon $player>>
<<include "PlayerAppearance">>
<<set _char = $player>>
<<else>>
<<ShowNpcIcon $interactionNpc>>
<<set _canTakeClothOff = false>>
<div class="btn padding-top"><<button "Stats">>
<<run Dialog.create("Info")>>
<<run Dialog.wiki('<<CharacterStatsView $interactionNpc true>>')>>
<<run Dialog.open();>>
<</button>></div>
<<set _char = $interactionNpc>>
<</if>>
<<run _dominane = _char.attributes.dominance>>
<<run _lust = _char.attributes.lust>>
<<run _corruption = _char.attributes.corruption>>
<<run _submission = _char.attributes.submission>>
<<run _sexStamina = _char.attributes.sexStamina>>
<<run _face = _char.body.face>>
<<run _breast = _char.body.breastSize>>
<<run _ass = _char.body.buttSize>>
<<run _fat = _char.body.fat>>
<<run _photoModelRep = $player.info.reputation.photoModel>>
<<run _PornActerRep = $player.info.reputation.pornActer>>
<<set _attrBars = [
{key: "strength", label: "Strength", metric: "strength"},
{key: "vitality", label: "Vitality", metric: "vitality"},
{key: "endurance", label: "Endurance", metric: "endurance"},
{key: "dexterity", label: "Dexterity", metric: "dexterity"},
{key: "defense", label: "Pain Threshold", metric: "defense"},
{key: "intelligence", label: "Intelligence", metric: "intelligence"},
{key: "speech", label: "Speech", metric: "speech"},
{key: "performer", label: "Performer", metric: "performer"},
{key: "lockpick", label: "Lockpick", metric: "lockpick"},
{key: "firearmProficiency", label: "Firearms", metric: "guns"},
{key: "meleeWeapons", label: "Melee Weapons", metric: "meleeWeapons"}
]>>
<<if $isPlayer == false>>
<fieldset>
<legend>Relationships</legend>
<div class="progress-bars-container-narrow">
<<ShowRelationsBar $player $interactionNpc "Both">>
</div>
</fieldset>
<</if>>
<fieldset>
<legend>Stats</legend>
<div class="progress-bars-container-narrow">
<div class="progress-container-narrow">
<div class="progress-title" data-metric="dominance">Dominance</div>
<div class="progress-bar-narrow" id="progress-dominance">
<div class="progress" id="dominance-id"></div>
</div>
<div class="progress-value" id="dominance-id-text"></div>
</div>
<div class="progress-container-narrow">
<div class="progress-title" data-metric="lust">Lust</div>
<div class="progress-bar-narrow" id="progress-lust">
<div class="progress" id="lust-id"></div>
</div>
<div class="progress-value" id="lust-id-text"></div>
</div>
<<if $isPlayer == true>>
<div class="progress-container-narrow">
<div class="progress-title" data-metric="corruption">Corruption</div>
<div class="progress-bar-narrow" id="progress-corruption">
<div class="progress" id="corruption-id"></div>
</div>
<div class="progress-value" id="corruption-id-text"></div>
</div>
<div class="progress-container-narrow">
<div class="progress-title" data-metric="submission">Submission</div>
<div class="progress-bar-narrow" id="progress-submission">
<div class="progress" id="submission-id"></div>
</div>
<div class="progress-value" id="submission-id-text"></div>
</div>
<div class="progress-container-narrow">
<div class="progress-title" data-metric="sexStamina">Sex Stamina</div>
<div class="progress-bar-narrow" id="progress-sexstamina">
<div class="progress" id="sexstamina-id"></div>
</div>
<div class="progress-value" id="sexstamina-id-text"></div>
</div>
<</if>>
</div>
</fieldset>
<<if $isPlayer == true>>
<fieldset>
<legend>Attributes</legend>
<div class="progress-bars-container-narrow">
<div class="progress-container-narrow">
<div class="progress-title" data-metric="strength">Strength</div>
<div class="progress-bar-narrow"><div class="progress" id="strength-attr-id"></div></div>
<div class="progress-value" id="strength-attr-id-text"></div>
</div>
<div class="progress-container-narrow">
<div class="progress-title" data-metric="vitality">Vitality</div>
<div class="progress-bar-narrow"><div class="progress" id="vitality-attr-id"></div></div>
<div class="progress-value" id="vitality-attr-id-text"></div>
</div>
<div class="progress-container-narrow">
<div class="progress-title" data-metric="endurance">Endurance</div>
<div class="progress-bar-narrow"><div class="progress" id="endurance-attr-id"></div></div>
<div class="progress-value" id="endurance-attr-id-text"></div>
</div>
<div class="progress-container-narrow">
<div class="progress-title" data-metric="dexterity">Dexterity</div>
<div class="progress-bar-narrow"><div class="progress" id="dexterity-attr-id"></div></div>
<div class="progress-value" id="dexterity-attr-id-text"></div>
</div>
<div class="progress-container-narrow">
<div class="progress-title" data-metric="defense">Pain Threshold</div>
<div class="progress-bar-narrow"><div class="progress" id="defense-attr-id"></div></div>
<div class="progress-value" id="defense-attr-id-text"></div>
</div>
<div class="progress-container-narrow">
<div class="progress-title" data-metric="intelligence">Intelligence</div>
<div class="progress-bar-narrow"><div class="progress" id="intelligence-attr-id"></div></div>
<div class="progress-value" id="intelligence-attr-id-text"></div>
</div>
<div class="progress-container-narrow">
<div class="progress-title" data-metric="speech">Speech</div>
<div class="progress-bar-narrow"><div class="progress" id="speech-attr-id"></div></div>
<div class="progress-value" id="speech-attr-id-text"></div>
</div>
<div class="progress-container-narrow">
<div class="progress-title" data-metric="performer">Performer</div>
<div class="progress-bar-narrow"><div class="progress" id="performer-attr-id"></div></div>
<div class="progress-value" id="performer-attr-id-text"></div>
</div>
<div class="progress-container-narrow">
<div class="progress-title" data-metric="lockpick">Lockpick</div>
<div class="progress-bar-narrow"><div class="progress" id="lockpick-attr-id"></div></div>
<div class="progress-value" id="lockpick-attr-id-text"></div>
</div>
<div class="progress-container-narrow">
<div class="progress-title" data-metric="guns">Firearms</div>
<div class="progress-bar-narrow"><div class="progress" id="firearmProficiency-attr-id"></div></div>
<div class="progress-value" id="firearmProficiency-attr-id-text"></div>
</div>
<div class="progress-container-narrow">
<div class="progress-title" data-metric="meleeWeapons">Melee Weapons</div>
<div class="progress-bar-narrow"><div class="progress" id="meleeWeapons-attr-id"></div></div>
<div class="progress-value" id="meleeWeapons-attr-id-text"></div>
</div>
</div>
</fieldset>
<</if>>
<fieldset>
<legend>Body</legend>
<div class="progress-bars-container-narrow">
<div class="progress-container-narrow">
<div class="progress-title">Face femininity</div>
<div class="progress-bar-narrow" id="progress-feminity">
<div class="progress" id="face-id"></div>
</div>
<div class="progress-value" id="face-id-text"></div>
</div>
<div class="progress-container-narrow">
<div class="progress-title">Breast size</div>
<div class="progress-bar-narrow" id="progress-feminity">
<div class="progress" id="breast-id"></div>
</div>
<div class="progress-value" id="breast-id-text"></div>
</div>
<div class="progress-container-narrow">
<div class="progress-title">Ass size</div>
<div class="progress-bar-narrow" id="progress-feminity">
<div class="progress" id="ass-id"></div>
</div>
<div class="progress-value" id="ass-id-text"></div>
</div>
<div class="progress-container-narrow">
<div class="progress-title">Weight</div>
<div class="progress-bar-narrow" id="progress-feminity">
<div class="progress" id="fat-id"></div>
</div>
<div class="progress-value" id="fat-id-text"></div>
</div>
</div>
</fieldset>
<<if $isPlayer == true>>
<fieldset>
<legend>Reputation</legend>
<div class="progress-bars-container-narrow">
<div class="progress-container-narrow">
<div class="progress-title" data-metric="photo-model-rep">Photo model</div>
<div class="progress-bar-narrow" id="progress-PhotoModelRep">
<div class="progress" id="PhotoModelRep-id"></div>
</div>
<div class="progress-value" id="PhotoModelRep-id-text"></div>
</div>
<div class="progress-container-narrow">
<div class="progress-title" data-metric="porn-actor-rep">Porn actor</div>
<div class="progress-bar-narrow" id="progress-PornActorRep">
<div class="progress" id="PornActorRep-id"></div>
</div>
<div class="progress-value" id="PornActorRep-id-text"></div>
</div>
</div>
</fieldset>
<</if>>
<<if $fromPhone == true>>
<div class="btn" style="margin: 10px;"><<button "Back" "Phone">><<unset $fromPhone>><</button>></div>
<<elseif $fromInteractions == true>>
<div class="btn" style="margin: 10px;"><<button "Back" "CharacterInteractions">><<unset $fromInteractions $isPlayer>><</button>></div>
<<else>>
<div class="btn" style="margin: 10px;"><<button "Back" $player.info.currentLocation>><<unset $interactionNpc $indexNPC>> <<set $canShowStatsBtn = true>> <<set $gameSettings.allowSaves = true>><</button>></div>
<</if>>
<<if $isPlayer == true>>
<div class="padding-up">
<<linkreplace "All Characters">>
<<set _chars = []>>
<<for _i = 0; _i < $Characters.length; _i++>>
<<run _chars.push(_i)>>
<</for>>
<<DisplayCharacters _chars "compact">>
<</linkreplace>>
</div>
<</if>>
<<done>>
<<set _dp = getAttributeProgress(_char, "dominance")>>
<<run UpdateProgressBar("dominance-id", _dp.fillRatio, 1)>>
<<run DisplayText("dominance-id-text", _dp.level + "/" + _dp.max)>>
<<set _lp = getAttributeProgress(_char, "lust")>>
<<run UpdateProgressBar("lust-id", _lp.fillRatio, 1)>>
<<run DisplayText("lust-id-text", _lp.level + "/" + _lp.max)>>
<<if $isPlayer == true>>
<<set _cp = getAttributeProgress(_char, "corruption")>>
<<run UpdateProgressBar("corruption-id", _cp.fillRatio, 1)>>
<<run DisplayText("corruption-id-text", _cp.level + "/" + _cp.max)>>
<<set _smp = getAttributeProgress(_char, "submission")>>
<<run UpdateProgressBar("submission-id", _smp.fillRatio, 1)>>
<<run DisplayText("submission-id-text", _smp.level + "/" + _smp.max)>>
<<set _ssp = getAttributeProgress(_char, "sexStamina")>>
<<run UpdateProgressBar("sexstamina-id", _ssp.fillRatio, 1)>>
<<run DisplayText("sexstamina-id-text", _ssp.level + "/" + _ssp.max)>>
<<for _ab range _attrBars>>
<<set _ap = getAttributeProgress(_char, _ab.key)>>
<<run UpdateProgressBar(_ab.key + "-attr-id", _ap.fillRatio, 1)>>
<<run DisplayText(_ab.key + "-attr-id-text", _ap.level + "/" + _ap.max)>>
<</for>>
<</if>>
<<run UpdateProgressBar("face-id", _face.value, _face.max)>>
<<run DisplayText("face-id-text", Math.trunc(_face.value) + "/" + _face.max)>>
<<run UpdateProgressBar("breast-id", _breast.value, _breast.max)>>
<<run DisplayText("breast-id-text", Math.trunc(_breast.value) + "/" + _breast.max)>>
<<run UpdateProgressBar("ass-id", _ass.value, _ass.max)>>
<<run DisplayText("ass-id-text", Math.trunc(_ass.value) + "/" + _ass.max)>>
<<run UpdateProgressBar("fat-id", _fat.value, _fat.max)>>
<<run DisplayText("fat-id-text", Math.trunc(_fat.value) + "/" + _fat.max)>>
<<if $isPlayer == true>>
<<run UpdateProgressBar("PhotoModelRep-id", _photoModelRep.value, _photoModelRep.max)>>
<<run DisplayText("PhotoModelRep-id-text", Math.trunc(_photoModelRep.value) + "/" + _photoModelRep.max)>>
<<run UpdateProgressBar("PornActorRep-id", _PornActerRep.value, _PornActerRep.max)>>
<<run DisplayText("PornActorRep-id-text", Math.trunc(_PornActerRep.value) + "/" + _PornActerRep.max)>>
<</if>>
<</done>>
<</nobr>><<nobr>>
<div class="chat-container">
<p>$player.info.firstName $player.info.secondName. $player.info.age.value-year-old <<print $player.gender()>>. With a
<<if $player.clothes.hasClothingType(1) == false && $player.clothes.hasClothingType(2) == false>>
__<<link $player.getBreastText()>>
<<script>>
Dialog.create(SugarCube.State.variables.player.getBreastText());
Dialog.wiki(SugarCube.State.variables.player.getBreastImage());
Dialog.open();
<</script>>
<</link>>__
<<else>>
<span style="color: #fff;"><<print $player.getBreastText()>></span> under clothing
<</if>>
and
<<if $player.clothes.hasClothingType(0) == false && $player.clothes.hasClothingType(3) == false>>
__<<link $player.getButtText()>>
<<script>>
Dialog.create(SugarCube.State.variables.player.getButtText());
Dialog.wiki(SugarCube.State.variables.player.getAssImage());
Dialog.open();
<</script>>
<</link>>__
<<else>>
<span style="color: #fff;"><<print $player.getButtText()>></span> under clothing.
<</if>>
<<if $player.clothes.clothingItems.size > 0>>
<<set _isHasCloth = false>>
<br><<print $player.pronoun()>> is wearing:
<<for _i = 0; _i <= 8; _i++>>
<<capture _i>>
<<if $player.clothes.hasClothingType(_i)>>
<<if (_i == 0 && $player.clothes.hasClothingType(3)) || (_i == 1 && $player.clothes.hasClothingType(2))>>
<<continue>>
<</if>>
<<if _isHasCloth == true>>
,
<</if>>
<<set _isHasCloth = true>>
__<<link $player.clothes.getFirstClothingItemByType(_i).name>>
<<run Dialog.create($player.clothes.getFirstClothingItemByType(_i).name)>>
<<run Dialog.wiki($player.clothes.getFirstClothingItemByType(_i).getImg())>>
<<run Dialog.open();>>
<</link>>__
<<capture _i>>
__<<link " (take off)" $player.info.currentLocation>>
<<run $player.takeOffClothing($player.clothes.getFirstClothingItemByType(_i))>>
<</link>>__
<</capture>>
<</if>>
<</capture>>
<</for>>
<</if>>
/* Equipped Weapon - inline with clothing */
<<if $player.equippedWeapon != null && $player.equippedWeapon != undefined>>
<br><span style="color: #ff6b35;">Equipped weapon:</span>
__<<link $player.equippedWeapon.name>>
<<script>>
var w = SugarCube.State.variables.player.equippedWeapon;
var content = "<div style='padding: 10px;'>";
content += "<h3 style='color: #ff6b35; margin-bottom: 10px;'>" + w.name + "</h3>";
content += "<p><strong>Type:</strong> " + getWeaponTypeName(w.weaponType) + "</p>";
content += "<p><strong>Damage:</strong> <span style='color: #ff4444;'>" + w.baseDamage + "</span></p>";
content += "<p><strong>Accuracy:</strong> <span style='color: #44ff44;'>" + w.accuracyBonus + "%</span></p>";
if (w.ammoType) {
var ammoCount = 0;
var player = SugarCube.State.variables.player;
if (player.inventory.hasItem(w.ammoType)) {
ammoCount = player.inventory.getItemByName(w.ammoType).quantity;
}
content += "<p><strong>Ammo Type:</strong> " + w.ammoType + "</p>";
content += "<p><strong>Ammo per Shot:</strong> " + (w.ammoPerShot || 1) + "</p>";
content += "<p><strong>Current Ammo:</strong> <span style='color: #ffcc00;'>" + ammoCount + "</span></p>";
}
if (w.effects && w.effects.length > 0) {
content += "<p><strong>Effects:</strong></p><ul style='margin-left: 15px;'>";
for (var i = 0; i < w.effects.length; i++) {
var e = w.effects[i];
content += "<li style='color: #ff88ff;'>" + e.type + " (" + e.chance + "% chance, " + e.duration + " turns)</li>";
}
content += "</ul>";
}
var skillName = w.requiredSkill === "firearmProficiency" ? "Firearm Proficiency" : "Strength";
content += "<p><strong>Required Skill:</strong> " + skillName + " Lvl " + w.minSkillLevel + "</p>";
content += "</div>";
Dialog.create(w.name);
Dialog.wiki(content);
Dialog.open();
<</script>>
<</link>>__
__<<link " (unequip)" $player.info.currentLocation>>
<<run $player.unequipWeapon()>>
<</link>>__
<span style="color: #aaa;"> (Dmg: <<print $player.equippedWeapon.baseDamage>><<if $player.equippedWeapon.ammoType != undefined>>, Ammo: <<if $player.inventory.hasItem($player.equippedWeapon.ammoType)>><<print $player.inventory.getItemByName($player.equippedWeapon.ammoType).quantity>><<else>>0<</if>><</if>>)</span>
<<else>>
<br><span style="color: #888;">No weapon equipped</span>
<</if>>
<<if $player.clothes.hasClothingType(0) == false && $player.clothes.hasClothingType(3) == false>>
<<if $player.genitalia() == "Penis">>
. You have a <<print Math.trunc($player.body.penisSize.value)>>-centimeter penis.
<<else>>
. You have a vagina.
<</if>>
<</if>>
</p>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<include "PlayerAppearance">>
<<if $isPlayerStats == true>>
<<DisplayCharStats $player>>
<<else>>
<<DisplayCharStats $interactionNpc>>
<</if>>
<div class="padding-top">
<div class="btn" style="margin: 10px;"><<button "Back" $player.info.currentLocation>><<unset $interactionNpc $indexNPC>> <<set $canShowStatsBtn = true>> <<set $gameSettings.allowSaves = true>><</button>></div>
</div>
<div class="padding-top">
<<if $isPlayer == true>>
<div class="padding-up">
<<linkreplace "All Characters">>
<<set _chars = []>>
<<for _i = 0; _i < $Characters.length; _i++>>
<<run _chars.push(_i)>>
<</for>>
<<DisplayCharacters _chars "compact">>
<</linkreplace>>
</div>
<</if>>
</div>
<</nobr>><<nobr>>
<<include "UpdateStatBars">>
<<SetBackground>>
<div id="achievements-container"></div>
<<done>>
<<run renderAchievementsPanel('achievements-container', 'all')>>
<</done>>
<div class="padding-top">
<<BackButton "<<set $canShowStatsBtn = true>>">>
</div>
<</nobr>><<widget "AggressiveEvent">>
<<if CanTriggerNpcInitiatedEvent($player, $dateTime)>>
<<run _locationKeys = Object.keys($Locations);>>
<<if _locationKeys.includes(passage())>>
<<set _chars = []>>
<<run _chars = $Locations[passage()].filter(
(id) => $Characters[id].info.characterWork != "Hooker" &&
$Characters[id].dailyEvents.isEventRegistered($player.info.id, "AggresiveEvent") == false
&& $Characters[id].info.questInfo.isQuestCharacter == false && $Characters[id].info.characterWork != "Etheriant")>>
<<if _chars.length > 0>>
<<set $indexNPC = _chars[Math.floor(Math.random() * _chars.length)]>>
<<set $interactionNpc = $Characters[$indexNPC]>>
<<run _contentAllow = CheckContentFilter($interactionNpc)>>
<<if (_contentAllow == true)>>
<<if shouldNpcStartAggressiveEvent($interactionNpc, $player)>>
<<run $interactionNpc.dailyEvents.registerEvent($player.info.id, "AggresiveEvent", 1)>>
<<run MarkNpcInitiatedEventTriggered($player, $dateTime)>>
<<goto "AggressiveEvent_SuccessApear">>
<</if>>
<</if>>
<</if>>
<</if>>
<</if>>
<</widget>><<nobr>>
<<include "UpdateAll">>
<<set $interaction = ["Touch Ass", "Touch Boobs", "Insult"].random()>>
<<if $player.gender() == "Male" && $interaction == "Touch Boobs">>
<<set $interaction = ["Touch Ass", "Insult"].random()>>
<</if>>
<<if ($interaction == "Touch Ass" || $interaction == "Touch Boobs")
&& (($player.gender() == "Male" && $interactionNpc.info.sexualPreference == "Feminine")
|| $player.gender() != "Male" && $interactionNpc.info.sexualPreference == "Manly")>>
<<set $interaction = "Insult">>
<</if>>
<div class="npc-event-panel">
<<NpcEventHeader $interactionNpc>>
<<if $FromInteraction != true>>
<<run $interactionNpc.dailyEvents.registerEvent($interactionNpc.info.id, "WalkEventDone", 1)>>
<</if>>
<<switch $interaction>>
<<case "Touch Ass">>
<<set _msg = $interactionNpc.info.firstName + " tries to touch your ass.">>
<<NpcEventDialogue _msg>>
<<case "Touch Boobs">>
<<set _msg = $interactionNpc.info.firstName + " tries to touch your tits">>
<<NpcEventDialogue _msg>>
<<case "Insult">>
<<NpcEventDialogue $interactionNpc "Hey you, get out of my way.">>
<</switch>>
<div class="npc-event-actions">
<<if $interaction != "Insult">>
<div class="btn"><<button "Stay indifferent" "AggressiveEventAction">>
<<set _rand = Random(1, 10) * -1>>
<<SetCharProgression $player 'dominance' _rand true>>
<</button>></div>
<<else>>
<<if $FromInteraction == true>>
<div class="btn"><<button "Stay indifferent" "CharacterInteractions">>
<<set _rand = Random(1, 10) * -1>>
<<SetCharProgression $player 'dominance' _rand true>>
<<unset $interactionType $interaction $FromInteraction>><</button>></div>
<<else>>
<div class="btn"><<button "Stay indifferent" $player.info.currentLocation>>
<<set _rand = Random(1, 10) * -1>>
<<SetCharProgression $player 'dominance' _rand true>>
<<set $gameSettings.allowSaves = true>><<set $canShowStatsBtn = true>><<unset $interactionType $interactionNpc $indexNPC $interaction $FromInteraction>><</button>></div>
<</if>>
<</if>>
<<ChanceButton 'Try to resolve the situation' 'TryResolveSituation' $player $interactionNpc '{Friend: 40, Love: 0, Fear: 40, Lust: 0, CheckResistance: true, CheckSexPref: false}' 'TryResolveSituation'>>
<div class="btn aggressive"><<button "Fight">>
<<unset $interactionType $interaction $FromInteraction>>
<<set _battleSetControls = {attack: true, seduce: true, items: true, actions: true}>>
<<StartFight $player $interactionNpc _battleSetControls undefined undefined>><</button>></div>
</div>
</div><!-- /npc-event-panel -->
<</nobr>><<nobr>>
<<include "UpdateAll">>
<div class="npc-event-panel">
<<NpcEventHeader $interactionNpc>>
<<CheckChance 'TryResolveSituation_Succes' 'TryResolveSituation_Failed' 'TryResolveSituation_Failed' 'LocationEvent' 'TryResolveSituation' '{createBackButton: false, createTwiceBackButton: false}'>>
</div><!-- /npc-event-panel -->
<</nobr>><<nobr>>
<<NpcEventDialogue "You were unable to resolve the situation.">>
<<SpendTime 15>>
<div class="npc-event-actions">
<<if $interaction != "Insult">>
<div class="btn"><<button "Stay indifferent" "AggressiveEventAction">>
<<set _rand = Random(1, 10) * -1>>
<<SetCharProgression $player 'dominance' _rand true>>
<</button>></div>
<<else>>
<<if $FromInteraction == true>>
<div class="btn"><<button "Stay indifferent" "CharacterInteractions">>
<<set _rand = Random(1, 10) * -1>>
<<SetCharProgression $player 'dominance' _rand true>>
<<unset $interactionType $interaction $FromInteraction>><</button>></div>
<<else>>
<div class="btn"><<button "Stay indifferent" $player.info.currentLocation>>
<<set _rand = Random(1, 10) * -1>>
<<SetCharProgression $player 'dominance' _rand true>>
<<set $gameSettings.allowSaves = true>><<set $canShowStatsBtn = true>><<unset $interactionType $interactionNpc $indexNPC $interaction $FromInteraction>><</button>></div>
<</if>>
<</if>>
<div class="btn aggressive"><<button "Fight">>
<<unset $interactionType $interaction $FromInteraction>>
<<set _battleSetControls = {attack: true, seduce: true, items: true, actions: true}>>
<<StartFight $player $interactionNpc _battleSetControls undefined undefined>><</button>></div>
</div>
<</nobr>><<nobr>>
<<SpendTime 15>>
<<set _rand = Random(5, 8)>>
<<SetCharProgression $player 'dominance' _rand true>>
<<NpcEventDialogue "You were able to successfully resolve the situation.">>
<div class="npc-event-actions">
<<if $FromInteraction == true>>
<div class="btn"><<button "Continue" "CharacterInteractions">>
<<unset $interactionType $interaction $FromInteraction>><</button>></div>
<<else>>
<div class="btn"><<button "Continue" $player.info.currentLocation>>
<<set $gameSettings.allowSaves = true>><<set $canShowStatsBtn = true>><<unset $interactionType $interactionNpc $indexNPC $interaction $FromInteraction>><</button>></div>
<</if>>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<div class="npc-event-panel">
<<NpcEventHeader $interactionNpc>>
<<SpendTime 15>>
<<switch $interaction>>
<<case "Touch Ass">>
<<set $interactionType = "Touch Ass">>
<<Interaction $interactionNpc $player>>
<<run _msg = $interactionNpc.info.firstName + " is touching your ass">>
<<case "Touch Boobs">>
<<set $interactionType = "Touch boobs">>
<<Interaction $interactionNpc $player>>
<<run _msg = $interactionNpc.info.firstName + " is touching your boobs">>
<</switch>>
<<if _msg>>
<<NpcEventDialogue _msg>>
<</if>>
<div class="npc-event-actions">
<div class="btn"><<button "Back" $player.info.currentLocation>><<set $gameSettings.allowSaves = true>><<set $canShowStatsBtn = true>><<unset $indexNPC $interactionNpc $interaction $interactType>><</button>></div>
</div>
</div><!-- /npc-event-panel -->
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set $canShowStatsBtn = false>>
<<set $gameSettings.allowSaves = false>>
/* Define all available quests in the game */
<<set _availableQuestsList = []>>
/* ==================== SARAH QUESTS ==================== */
/* Sarah Quest 1 - Purchase Concert Tickets */
<<if getQuestState("sarah_quest_01") == undefined>>
<<run _availableQuestsList.push({
id: "sarah_quest_01",
name: "Purchase Concert Tickets",
questGiver: "Sarah",
questGiverIcon: "Media\\Characters\\QuestChars\\Sarah\\face\\1.png",
location: "Player Home - Sarah's Room",
locationId: "Sarah_Bedroom_PHome",
questType: "side",
requirements: [],
requirementsMet: true
})>>
<</if>>
/* Sarah Quest 2 */
<<if getQuestState("sarah_quest_2") == undefined && getQuestState("sarah_quest_01") == "completed">>
<<run _availableQuestsList.push({
id: "sarah_quest_2",
name: "Sarah's Second Quest",
questGiver: "Sarah",
questGiverIcon: "Media\\Characters\\QuestChars\\Sarah\\face\\1.png",
location: "Player Home - Sarah's Room",
locationId: "Sarah_Bedroom_PHome",
questType: "side",
requirements: [],
requirementsMet: true
})>>
<<elseif getQuestState("sarah_quest_2") == undefined && getQuestState("sarah_quest_01") != "completed">>
<<run _availableQuestsList.push({
id: "sarah_quest_2",
name: "Sarah's Second Quest",
questGiver: "Sarah",
questGiverIcon: "Media\\Characters\\QuestChars\\Sarah\\face\\1.png",
location: "Player Home - Sarah's Room",
locationId: "Sarah_Bedroom_PHome",
questType: "side",
requirements: ["Complete 'Purchase Concert Tickets' quest"],
requirementsMet: false
})>>
<</if>>
/* ==================== ETHAN QUESTS ==================== */
/* Ethan Quest 1 - Buy a Game Console */
<<if getQuestState("ethan_quest_01") == undefined>>
<<run _availableQuestsList.push({
id: "ethan_quest_01",
name: "Buy a Game Console (NovaGear X)",
questGiver: "Ethan",
questGiverIcon: "Media\\Characters\\QuestChars\\Ethan\\face\\1.png",
location: "Player Home - Ethan's Room",
locationId: "Ethan_Bedroom_PHome",
questType: "side",
requirements: [],
requirementsMet: true
})>>
<</if>>
/* Ethan Quest 2 - Sleepover */
<<set _ethanSleepoverWindow = $dateTime.getDayOfWeek() == "Saturday" && $dateTime.hours >= 18>>
<<if getQuestState("ethan_quest_02") == undefined && getQuestState("ethan_quest_01") == "completed" && _ethanSleepoverWindow>>
<<run _availableQuestsList.push({
id: "ethan_quest_02",
name: "Ethan's Sleepover",
questGiver: "Ethan",
questGiverIcon: "Media\\Characters\\QuestChars\\Ethan\\face\\1.png",
location: "Player Home - Ethan's Room",
locationId: "Ethan_Bedroom_PHome",
questType: "side",
requirements: [],
requirementsMet: true
})>>
<<elseif getQuestState("ethan_quest_02") == undefined && getQuestState("ethan_quest_01") == "completed">>
<<run _availableQuestsList.push({
id: "ethan_quest_02",
name: "Ethan's Sleepover",
questGiver: "Ethan",
questGiverIcon: "Media\\Characters\\QuestChars\\Ethan\\face\\1.png",
location: "Player Home - Ethan's Room",
locationId: "Ethan_Bedroom_PHome",
questType: "side",
requirements: ["Visit Ethan on Saturday after 18:00"],
requirementsMet: false
})>>
<<elseif getQuestState("ethan_quest_02") == undefined && getQuestState("ethan_quest_01") != "completed">>
<<run _availableQuestsList.push({
id: "ethan_quest_02",
name: "Ethan's Sleepover",
questGiver: "Ethan",
questGiverIcon: "Media\\Characters\\QuestChars\\Ethan\\face\\1.png",
location: "Player Home - Ethan's Room",
locationId: "Ethan_Bedroom_PHome",
questType: "side",
requirements: ["Complete 'Buy a Game Console' quest"],
requirementsMet: false
})>>
<</if>>
/* ==================== AMANDA QUESTS ==================== */
<<set _amandaOfficeOpen = $dateTime.hours >= 9 && $dateTime.hours < 18 && $dateTime.getDayOfWeek() != "Saturday" && $dateTime.getDayOfWeek() != "Sunday">>
<<set _amandaQuestLocation = "Business Center - Amanda's Office">>
<<set _amandaQuestLocationId = "BC_Amanda_Office">>
<<set _amandaQuestAvailabilityRequirement = "Talk to Amanda at her office on weekdays from 09:00 to 18:00">>
/* Amanda Quest 1 */
<<if $player.characterEvents.isEventRegistered($player.info.id, "AmandaQuest1") == false>>
<<set _amandaQuest1Reqs = []>>
<<set _amandaQuest1Met = true>>
<<if !_amandaOfficeOpen>>
<<run _amandaQuest1Reqs.push(_amandaQuestAvailabilityRequirement)>>
<<set _amandaQuest1Met = false>>
<</if>>
<<run _availableQuestsList.push({
id: "amanda_quest_1",
name: "Amanda's First Quest",
questGiver: "Amanda",
questGiverIcon: "Media\\Characters\\QuestChars\\Amanda\\face\\1.png",
location: _amandaQuestLocation,
locationId: _amandaQuestLocationId,
questType: "side",
requirements: _amandaQuest1Reqs,
requirementsMet: _amandaQuest1Met
})>>
<</if>>
/* Amanda Picnic Quest */
<<set _hasAmandaQuest1 = $player.characterEvents.isEventRegistered($player.info.id, "AmandaQuest1")>>
<<set _hasPicnicEvent = $player.characterEvents.isEventRegistered($player.info.id, "AmandaPicnicEvent")>>
<<set _hasCar = $playercars && $playercars.length > 0>>
<<if _hasPicnicEvent == false>>
<<set _picnicReqs = []>>
<<set _picnicMet = true>>
<<if !_hasAmandaQuest1>>
<<run _picnicReqs.push("Complete Amanda's First Quest")>>
<<set _picnicMet = false>>
<</if>>
<<if !_hasCar>>
<<run _picnicReqs.push("Own a car")>>
<<set _picnicMet = false>>
<</if>>
<<if !_amandaOfficeOpen>>
<<run _picnicReqs.push(_amandaQuestAvailabilityRequirement)>>
<<set _picnicMet = false>>
<</if>>
<<run _availableQuestsList.push({
id: "amanda_picnic",
name: "Beach Picnic with Amanda",
questGiver: "Amanda",
questGiverIcon: "Media\\Characters\\QuestChars\\Amanda\\face\\1.png",
location: _amandaQuestLocation,
locationId: _amandaQuestLocationId,
questType: "side",
requirements: _picnicReqs,
requirementsMet: _picnicMet
})>>
<</if>>
/* ==================== ALICE QUESTS ==================== */
/* Alice Quest 1 */
<<if $player.characterEvents.isEventRegistered($player.info.id, "AliceQuest1") == false>>
<<run _availableQuestsList.push({
id: "alice_quest_1",
name: "Meeting Alice",
questGiver: "Alice",
questGiverIcon: "Media\\Characters\\QuestChars\\Alice\\Alice.png",
location: "Player Home - Sarah's Room",
locationId: "Sarah_Bedroom_PHome",
questType: "side",
requirements: [],
requirementsMet: true
})>>
<</if>>
/* Alice Quest 2 */
<<set _hasAliceQuest1 = $player.characterEvents.isEventRegistered($player.info.id, "AliceQuest1")>>
<<set _hasCanTrainNPC = $player.characterEvents.isEventRegistered($player.info.id, "CanTrainNPC")>>
<<if _hasAliceQuest1 == true && _hasCanTrainNPC == false>>
<<run _availableQuestsList.push({
id: "alice_quest_2",
name: "Training with Alice",
questGiver: "Alice",
questGiverIcon: "Media\\Characters\\QuestChars\\Alice\\Alice.png",
location: "Player Home - Sarah's Room",
locationId: "Sarah_Bedroom_PHome",
questType: "side",
requirements: [],
requirementsMet: true
})>>
<<elseif _hasAliceQuest1 == false && _hasCanTrainNPC == false>>
<<run _availableQuestsList.push({
id: "alice_quest_2",
name: "Training with Alice",
questGiver: "Alice",
questGiverIcon: "Media\\Characters\\QuestChars\\Alice\\Alice.png",
location: "Player Home - Sarah's Room",
locationId: "Sarah_Bedroom_PHome",
questType: "side",
requirements: ["Complete 'Meeting Alice' quest"],
requirementsMet: false
})>>
<</if>>
/* ==================== DAMIAN QUESTS ==================== */
/* Damian Quest 3 */
<<set _hasNightclubVipAccess = $player.characterEvents.isEventRegistered($player.info.id, "MeetDamian")>>
<<set _hasElevatorAccess = $player.characterEvents.isEventRegistered($player.info.id, "NightClubElevatorAccess")>>
<<if getQuestState("damian_quest3") == undefined && !_hasElevatorAccess>>
<<set _damianReqs = []>>
<<set _damianMet = true>>
<<if !_hasNightclubVipAccess>>
<<run _damianReqs.push("Nightclub VIP access")>>
<<set _damianMet = false>>
<</if>>
<<run _availableQuestsList.push({
id: "damian_quest3",
name: "Damian's Job Offer",
questGiver: "Damian",
questGiverIcon: "Media\\Characters\\QuestChars\\Damian King\\0.jpeg",
location: "Nightclub - VIP Lounge",
locationId: "NC_VIP_Lounge",
questType: "side",
requirements: _damianReqs,
requirementsMet: _damianMet
})>>
<</if>>
/* Damian Quest 4 */
<<if getQuestState("damian_quest4") == undefined && getQuestState("damian_quest3") == "completed">>
<<run _availableQuestsList.push({
id: "damian_quest4",
name: "Damian's Next Assignment",
questGiver: "Damian",
questGiverIcon: "Media\\Characters\\QuestChars\\Damian King\\0.jpeg",
location: "Nightclub - VIP Lounge",
locationId: "NC_VIP_Lounge",
questType: "side",
requirements: [],
requirementsMet: true
})>>
<<elseif getQuestState("damian_quest4") == undefined && getQuestState("damian_quest3") != "completed">>
<<run _availableQuestsList.push({
id: "damian_quest4",
name: "Damian's Next Assignment",
questGiver: "Damian",
questGiverIcon: "Media\\Characters\\QuestChars\\Damian King\\0.jpeg",
location: "Nightclub - VIP Lounge",
locationId: "NC_VIP_Lounge",
questType: "side",
requirements: ["Complete 'Damian's Job Offer' quest"],
requirementsMet: false
})>>
<</if>>
/* Mad Dog Quest */
<<set _nightclubRep = $player.info.reputation.nightclub ? $player.info.reputation.nightclub.value : 0>>
<<if getQuestState("meet_mad_dog") == undefined>>
<<set _madDogReqs = []>>
<<set _madDogMet = true>>
<<if _nightclubRep < 70>>
<<run _madDogReqs.push("70+ Nightclub Reputation (Current: " + _nightclubRep + ")")>>
<<set _madDogMet = false>>
<</if>>
<<run _availableQuestsList.push({
id: "meet_mad_dog",
name: "Meet Mad Dog",
questGiver: "Damian",
questGiverIcon: "Media\\Characters\\QuestChars\\Damian King\\0.jpeg",
location: "Nightclub - VIP Lounge",
locationId: "NC_VIP_Lounge",
questType: "side",
requirements: _madDogReqs,
requirementsMet: _madDogMet
})>>
<</if>>
/* ==================== LANA QUEST ==================== */
/* Lana Quest - Car Dealership */
<<if $player.characterEvents.isEventRegistered($player.info.id, "LanaQuest1") == false
&& $player.characterEvents.isEventRegistered($player.info.id, "LanaQuest1Failed") == false>>
<<set _lanaReqs = []>>
<<set _lanaMet = true>>
/* The supercar, then dinner: $500 at the restaurant (a buyer who owns one only needs dinner money). */
<<set _lanaHasCar = $playercars && $playercars.includes("Supercar")>>
<<set _lanaNeed = _lanaHasCar ? 500 : 100500>>
<<if Number($player.money) < _lanaNeed>>
<<if _lanaHasCar>>
<<run _lanaReqs.push("$500 for dinner with Lana (Current: $" + $player.money + ")")>>
<<else>>
<<run _lanaReqs.push("$100,000 for the supercar and $500 for dinner (Current: $" + $player.money + ")")>>
<</if>>
<<set _lanaMet = false>>
<</if>>
<<run _availableQuestsList.push({
id: "lana_quest_1",
name: "Lana's Date",
questGiver: "Lana Monroe",
questGiverIcon: "Media\\Characters\\QuestChars\\Other\\Lana.jpg",
location: "Car Dealership",
locationId: "CarDealership",
questType: "side",
requirements: _lanaReqs,
requirementsMet: _lanaMet
})>>
<</if>>
/* ==================== VICTOR BARKER QUEST ==================== */
<<set _victorBarkerQuestState = getQuestState("victor_barker_quest_1")>>
<<set _victorBarkerQuestResolved = $player.characterEvents.isEventRegistered($player.info.id, "victorBarker_quest_01_completed")>>
<<if $player.gender() == 'Male'
&& $player.characterEvents.isEventRegistered($player.info.id, "victorBarker_quest_01") == false
&& _victorBarkerQuestResolved == false
&& _victorBarkerQuestState != "active"
&& _victorBarkerQuestState != "completed">>
<<run _availableQuestsList.push({
id: "victor_barker_quest_1",
name: "A Dangerous Game",
questGiver: "Victor Barker",
questGiverIcon: "Media\\Characters\\QuestChars\\Bar\\VictorBarker.jpeg",
location: "Entertainment District - Bar",
locationId: "EntertainmentDistrict",
questType: "side",
requirements: [],
requirementsMet: true
})>>
<</if>>
/* ==================== SKETCHY GUY QUEST ==================== */
<<if getQuestState("sarah_quest_01") == "active" && $player.characterEvents.isEventRegistered($player.info.id, "Concert ticket") == false>>
<<run _availableQuestsList.push({
id: "sketchy_guy_quest",
name: "Get Concert Tickets",
questGiver: "Sketchy Guy",
questGiverIcon: "Media\\Characters\\QuestChars\\Other\\SketchyGuy\\SketchyGuy.jpeg",
location: "Skid Row",
locationId: "SR_SkidRow",
questType: "side",
requirements: [],
requirementsMet: true
})>>
<</if>>
/* ==================== UFG QUESTS - TESS CARTER ==================== */
<<set _hasGrantMeet = $player.characterEvents.isEventRegistered($player.info.id, "GrantMeet")>>
<<set _hasTessApproval = $player.characterEvents.isEventRegistered($player.info.id, "GetTessApproval")>>
/* Tess Quest 1 - initial contact */
<<if !_hasTessApproval>>
<<set _tessReqs = []>>
<<set _tessMet = true>>
<<if !_hasGrantMeet>>
<<run _tessReqs.push("Meet Grant Maddox first")>>
<<set _tessMet = false>>
<</if>>
<<run _availableQuestsList.push({
id: "tess_quest_1",
name: "Meet Tess Carter",
questGiver: "Tess Carter",
questGiverIcon: "Media\\Characters\\QuestChars\\UFG\\Tess Carter.jpg",
location: "Underground Fight Gym",
locationId: "Underground_Fight_Gym",
questType: "side",
requirements: _tessReqs,
requirementsMet: _tessMet
})>>
<</if>>
/* Tess Quest 2 */
<<if _hasTessApproval && $tessStoryProgress == 1>>
<<run _availableQuestsList.push({
id: "tess_quest_2",
name: "Tess's Second Challenge",
questGiver: "Tess Carter",
questGiverIcon: "Media\\Characters\\QuestChars\\UFG\\Tess Carter.jpg",
location: "Underground Fight Gym",
locationId: "Underground_Fight_Gym",
questType: "side",
requirements: [],
requirementsMet: true
})>>
<<elseif !_hasTessApproval>>
<<run _availableQuestsList.push({
id: "tess_quest_2",
name: "Tess's Second Challenge",
questGiver: "Tess Carter",
questGiverIcon: "Media\\Characters\\QuestChars\\UFG\\Tess Carter.jpg",
location: "Underground Fight Gym",
locationId: "Underground_Fight_Gym",
questType: "side",
requirements: ["Complete 'Meet Tess Carter' quest"],
requirementsMet: false
})>>
<</if>>
/* ==================== UFG QUESTS - CLAY HARPER ==================== */
/* Clay Quest 1 */
<<if $ClayStoryProgress == undefined || $ClayStoryProgress == 0>>
<<set _clayReqs = []>>
<<set _clayMet = true>>
<<if !_hasTessApproval>>
<<run _clayReqs.push("Get Tess Carter's approval first")>>
<<set _clayMet = false>>
<</if>>
<<run _availableQuestsList.push({
id: "clay_quest_1",
name: "Fight Clay Harper",
questGiver: "Clay Harper",
questGiverIcon: "Media\\Characters\\QuestChars\\UFG\\Clay Harper.jpg",
location: "Underground Fight Gym",
locationId: "Underground_Fight_Gym",
questType: "side",
requirements: _clayReqs,
requirementsMet: _clayMet
})>>
<</if>>
/* Clay Quest 2 */
<<if $ClayStoryProgress == 1>>
<<run _availableQuestsList.push({
id: "clay_quest_2",
name: "Clay's Next Fight",
questGiver: "Clay Harper",
questGiverIcon: "Media\\Characters\\QuestChars\\UFG\\Clay Harper.jpg",
location: "Underground Fight Gym",
locationId: "Underground_Fight_Gym",
questType: "side",
requirements: [],
requirementsMet: true
})>>
<<elseif $ClayStoryProgress == undefined || $ClayStoryProgress == 0>>
<<run _availableQuestsList.push({
id: "clay_quest_2",
name: "Clay's Next Fight",
questGiver: "Clay Harper",
questGiverIcon: "Media\\Characters\\QuestChars\\UFG\\Clay Harper.jpg",
location: "Underground Fight Gym",
locationId: "Underground_Fight_Gym",
questType: "side",
requirements: ["Complete 'Fight Clay Harper' quest"],
requirementsMet: false
})>>
<</if>>
/* ==================== UFG QUESTS - MARCUS BELL ==================== */
<<set _hasClayApproval = $player.characterEvents.isEventRegistered($player.info.id, "GetClayApproval")>>
/* Marcus Quest 1 */
<<if $MarcusStoryProgress == undefined || $MarcusStoryProgress == 0>>
<<set _marcusReqs = []>>
<<set _marcusMet = true>>
<<if !_hasClayApproval>>
<<run _marcusReqs.push("Get Clay Harper's approval first")>>
<<set _marcusMet = false>>
<</if>>
<<run _availableQuestsList.push({
id: "marcus_quest_1",
name: "Meet Marcus Bell",
questGiver: "Marcus Bell",
questGiverIcon: "Media\\Characters\\QuestChars\\UFG\\Marcus Bell_M.jpg",
location: "Underground Fight Gym",
locationId: "Underground_Fight_Gym",
questType: "side",
requirements: _marcusReqs,
requirementsMet: _marcusMet
})>>
<</if>>
/* Marcus Quest 2 */
<<if $MarcusStoryProgress == 1>>
<<run _availableQuestsList.push({
id: "marcus_quest_2",
name: "Marcus's Assignment",
questGiver: "Marcus Bell",
questGiverIcon: "Media\\Characters\\QuestChars\\UFG\\Marcus Bell_M.jpg",
location: "Underground Fight Gym",
locationId: "Underground_Fight_Gym",
questType: "side",
requirements: [],
requirementsMet: true
})>>
<<elseif $MarcusStoryProgress == undefined || $MarcusStoryProgress == 0>>
<<run _availableQuestsList.push({
id: "marcus_quest_2",
name: "Marcus's Assignment",
questGiver: "Marcus Bell",
questGiverIcon: "Media\\Characters\\QuestChars\\UFG\\Marcus Bell_M.jpg",
location: "Underground Fight Gym",
locationId: "Underground_Fight_Gym",
questType: "side",
requirements: ["Complete 'Meet Marcus Bell' quest"],
requirementsMet: false
})>>
<</if>>
/* ==================== UFG QUESTS - GRANT MADDOX ==================== */
<<if $grantTournamentCompleted != true>>
<<set _hasMarcusApproval = $player.characterEvents.isEventRegistered($player.info.id, "GetMarcusApproval")>>
<<set _ufgApprovalCount = (_hasTessApproval ? 1 : 0) + (_hasClayApproval ? 1 : 0) + (_hasMarcusApproval ? 1 : 0)>>
<<set _grantReqs = []>>
<<set _grantMet = true>>
<<if _hasGrantMeet && _ufgApprovalCount < 3>>
<<run _grantReqs.push("Get approval from Tess, Clay, and Marcus (" + _ufgApprovalCount + "/3)")>>
<<set _grantMet = false>>
<</if>>
<<run _availableQuestsList.push({
id: "grant_quest_1",
name: _hasGrantMeet ? "Grant's Tournament" : "Meet Grant Maddox",
questGiver: "Grant Maddox",
questGiverIcon: "Media\\Characters\\QuestChars\\UFG\\Grant Maddox.jpg",
location: "Underground Fight Gym",
locationId: "Underground_Fight_Gym",
questType: "side",
requirements: _grantReqs,
requirementsMet: _grantMet
})>>
<</if>>
/* ==================== ROBERT QUEST ==================== */
<<if getQuestState("robert_quest_1") == undefined>>
<<run _availableQuestsList.push({
id: "robert_quest_1",
name: "Robert's Request",
questGiver: "Robert",
questGiverIcon: "Media\\Characters\\QuestChars\\Robert\\face\\1.png",
location: "Random Event",
locationId: "",
questType: "side",
requirements: ["Triggered by random event"],
requirementsMet: false
})>>
<</if>>
/* Count available quests */
<<set _availableCount = 0>>
<<set _unavailableCount = 0>>
<<for _i = 0; _i < _availableQuestsList.length; _i++>>
<<if _availableQuestsList[_i].requirementsMet>>
<<set _availableCount++>>
<<else>>
<<set _unavailableCount++>>
<</if>>
<</for>>
/* UI Display */
<div class="available-quests-container">
<div class="available-quests-panel">
<div class="available-quests-header">
<h2>Available Quests</h2>
<div class="available-quests-stats">
<span class="stat-available">Ready: <<print _availableCount>></span>
<span class="stat-locked">Locked: <<print _unavailableCount>></span>
</div>
</div>
<div class="available-quests-filters">
<button id="filter-all" class="filter-btn active">All</button>
<button id="filter-available" class="filter-btn">Available</button>
<button id="filter-locked" class="filter-btn">Locked</button>
</div>
<div class="available-quests-list">
<<if _availableQuestsList.length == 0>>
<div class="no-quests-message">
<p>No quests available at the moment.</p>
<p>Explore the city and talk to people to discover new adventures!</p>
</div>
<<else>>
<<for _i = 0; _i < _availableQuestsList.length; _i++>>
<<set _quest = _availableQuestsList[_i]>>
<<capture _quest>>
<<set _questIcon = _quest.questGiverIcon>>
<<set _questName = _quest.name>>
<<set _questGiverName = _quest.questGiver>>
<<set _questLocation = _quest.location>>
<<set _questReqs = _quest.requirements>>
<<set _isMet = _quest.requirementsMet>>
<<set _cardClass = _isMet ? "quest-card available" : "quest-card locked">>
<<set _statusClass = _isMet ? "status-available" : "status-locked">>
<<set _statusText = _isMet ? "AVAILABLE" : "LOCKED">>
<<set _dataAvailable = _isMet ? "true" : "false">>
<div @class="_cardClass" @data-available="_dataAvailable">
<div class="quest-card-left">
<div class="quest-giver-icon">
<img @src="_questIcon" alt="Quest Giver">
</div>
</div>
<div class="quest-card-center">
<div class="quest-name"><<print _questName>></div>
<div class="quest-giver">
<span class="label">Quest Giver:</span> <<print _questGiverName>>
</div>
<div class="quest-location">
<span class="label">Location:</span> <<print _questLocation>>
</div>
<<if _questReqs.length > 0>>
<div class="quest-requirements">
<span class="label">Requirements:</span>
<ul>
<<for _j = 0; _j < _questReqs.length; _j++>>
<li><<print _questReqs[_j]>></li>
<</for>>
</ul>
</div>
<<else>>
<div class="quest-requirements met">
<span class="label">Requirements:</span> None
</div>
<</if>>
</div>
<div class="quest-card-right">
<span @class="_statusClass"><<print _statusText>></span>
</div>
</div>
<</capture>>
<</for>>
<</if>>
</div>
<div class="available-quests-footer">
<div class="btn"><<button "Back to Quest Journal" "Quests">><<set $gameSettings.allowSaves = true>><<set $canShowStatsBtn = true>><</button>></div>
<div class="btn"><<button "Back to Game" $player.info.currentLocation>><<set $gameSettings.allowSaves = true>><<set $canShowStatsBtn = true>><</button>></div>
</div>
</div>
</div>
<<done>>
<<script>>
(function() {
function filterQuests(filter) {
const cards = document.querySelectorAll('.quest-card');
const buttons = document.querySelectorAll('.filter-btn');
buttons.forEach(btn => btn.classList.remove('active'));
document.getElementById('filter-' + filter).classList.add('active');
cards.forEach(card => {
const isAvailable = card.dataset.available === 'true';
if (filter === 'all') {
card.style.display = 'flex';
} else if (filter === 'available' && isAvailable) {
card.style.display = 'flex';
} else if (filter === 'locked' && !isAvailable) {
card.style.display = 'flex';
} else {
card.style.display = 'none';
}
});
}
document.getElementById('filter-all').addEventListener('click', function() { filterQuests('all'); });
document.getElementById('filter-available').addEventListener('click', function() { filterQuests('available'); });
document.getElementById('filter-locked').addEventListener('click', function() { filterQuests('locked'); });
})();
<</script>>
<</done>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
/* Pool of bar-shift events, gated like Diner_Events: the drunk and the owner are
male and the flirty patron is female (player content filter), and the owner's
lines are written for a girl/trans body. The rush and the quiet night always fit. */
<<set _pool = ["Bartender_Event_Group", "Bartender_Event_Private"]>>
<<if CheckContentFilter('Male')>>
<<run _pool.push("Bartender_Event_Drunk")>>
<<if $player.gender() == "Female" || $player.gender() == "Shemale">>
<<run _pool.push("Bartender_Event_Boss")>>
<</if>>
<</if>>
<<if CheckContentFilter('Female')>>
<<run _pool.push("Bartender_Event_Flirt")>>
<</if>>
<<set _pick = _pool[Random(0, _pool.length - 1)]>>
<<include _pick>>
<</nobr>><<nobr>>
<<set $npcType = Random(1,2)>>
<<if $npcType == 1>>
<<set $npc = {name:'Dominant customer', gender:'Male', photo:'Media\\Characters\\QuestChars\\Other\\Unknown.jpg', type:'dominant'}>>
<<else>>
<<set $npc = {name:'Submissive customer', gender:'Male', photo:'Media\\Characters\\QuestChars\\Other\\Unknown.jpg', type:'submissive'}>>
<</if>>
<<ChatMessage 'A drunk customer stumbles up to the bar, his eyes glazed but hungry, leaning in too close as he slurs his order, his breath reeking of cheap booze.'>>
<<set _msg = ($npc.type == 'dominant' ? 'Hey, gorgeous, pour me another... and maybe pour yourself into my lap while you\'re at it. I\'ll make it worth your while.' : 'Uh, bartender? Can I get a refill? And... if you\'re not busy, maybe we could... you know, hang out?')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<div class="npc-event-actions">
<div class="btn"><<button "Refuse politely" "Bartender_Drunk_Refuse">><</button>></div>
<div class="btn"><<button "Flirt back" "Bartender_Drunk_Flirt">><</button>></div>
<<if $player.attributes.corruption.value >= 2>>
<div class="btn"><<button "Let him touch" "Bartender_Drunk_Touch">><</button>></div>
<<else>>
<div class="btn non-interacting" id='let-touch-drunk'><<button "Let him touch">><</button>></div>
<<done>>
<<run addHoverTooltip('let-touch-drunk', 'Requires corruption level 2 or higher')>>
<</done>>
<</if>>
<<if $player.attributes.corruption.value >= 4>>
<div class="btn"><<button "Go to private room">>
<<goto "Bartender_Drunk_Private">>
<</button>></div>
<<else>>
<div class="btn non-interacting" id='private-drunk'><<button "Go to private room">><</button>></div>
<<done>>
<<run addHoverTooltip('private-drunk', 'Requires corruption level 4 or higher')>>
<</done>>
<</if>>
<<if $player.attributes.dominance.value >= 2>>
<div class="btn"><<button "Dominate him" "Bartender_Drunk_Dominate">><</button>></div>
<<else>>
<div class="btn non-interacting" id='dominate-drunk'><<button "Dominate him">><</button>></div>
<<done>>
<<run addHoverTooltip('dominate-drunk', 'Requires dominance level 2 or higher')>>
<</done>>
<</if>>
</div>
<</nobr>><<nobr>>
<<Chat $player 'Sorry, buddy, I\'m cutting you off. You\'ve had enough, and I\'m not risking my job for your sloppy advances. Time to call it a night.'>>
<<set _msg = ($npc.type == 'dominant' ? 'Tch, you\'re no fun... But I\'ll remember this, sweetheart. Next time, you\'ll be begging.' : 'Aw, come on... I was just having fun. Fine, I\'ll go, but you\'re missing out.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<SpendEnergy $player 5>>
<<set $player.money -= 5>>
<<ChatMessage 'You paid 5 to get rid of the drunk creep.'>>
<<set _salary = Random(80,250)>>
<<set $player.money += _salary>>
<<set _salaryMSG = 'You got your daily salary of ' + _salary + ', keeping you afloat.'>>
<<ChatMessage _salaryMSG>>
<div class="npc-event-actions">
<div class="btn"><<button "Continue" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
</div>
<</nobr>><<nobr>>
<<Chat $player 'Alright, one more drink... but only if you promise to behave. *You wink and lean in just enough to tease.*'>>
<<set _msg = ($npc.type == 'dominant' ? 'Behave? Where\'s the fun in that? Keep teasing, and I\'ll show you how I really drink.' : 'I\'ll try... but your flirting is making it hard. Pour slow, let\'s chat.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<set _randomValueChange = Random(1,3)>>
<<SetCharProgression $player "corruption" _randomValueChange true>>
<<SpendEnergy $player 5>>
<<set $player.money += 15>>
<<ChatMessage 'You scored 15 for that flirty pour.'>>
<<set _salary = Random(80,250)>>
<<set $player.money += _salary>>
<<set _salaryMSG = 'You got your daily salary of ' + _salary + ', keeping you afloat.'>>
<<ChatMessage _salaryMSG>>
<div class="npc-event-actions">
<div class="btn"><<button "Continue" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
</div>
<</nobr>><<nobr>>
<<Chat $player 'Fine, you can touch a little... but keep it discreet, or we\'re both in trouble. *You guide his hand to your waist.*'>>
<<set _msg = ($npc.type == 'dominant' ? 'That\'s more like it. I\'ll take what I want, feel you shiver under my fingers.' : 'Oh, wow... I\'ll be gentle, but damn, you feel amazing.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<set _randomValueChange = Random(3,7)>>
<<SetCharProgression $player "corruption" _randomValueChange true>>
<<SpendEnergy $player 10>>
<<set $player.money += 25>>
<<ChatMessage 'You pocketed 25 for letting him get handsy.'>>
<<set _salary = Random(80,250)>>
<<set $player.money += _salary>>
<<set _salaryMSG = 'You got your daily salary of ' + _salary + ', keeping you afloat.'>>
<<ChatMessage _salaryMSG>>
<div class="npc-event-actions">
<div class="btn"><<button "Continue" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
</div>
<</nobr>><<nobr>>
<<ChatMessage 'You slip into the back room with the drunk. He shoves you face-first against the wall, drags your clothes down and fucks you rough and sloppy, his cock pounding into you while the thumping bass from the bar swallows your moans, until he grunts and cums inside you.'>>
<<set _randomValueChange = Random(5,10)>>
<<SetCharProgression $player "corruption" _randomValueChange true>>
<<SpendEnergy $player 20>>
<<set $player.money += 40>>
<<ChatMessage 'You raked in 40 for that wild backroom romp.'>>
<<set _salary = Random(80,250)>>
<<set $player.money += _salary>>
<<set _salaryMSG = 'You got your daily salary of ' + _salary + ', keeping you afloat.'>>
<<ChatMessage _salaryMSG>>
<div class="npc-event-actions">
<div class="btn"><<button "Continue" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
</div>
<</nobr>><<nobr>>
<<Chat $player 'Back off, you pathetic drunk. I\'m not your plaything-touch me again, and I\'ll have security throw you out on your ass.'>>
<<set _msg = ($npc.type == 'dominant' ? 'Feisty, huh? I like that... but you\'ll break eventually.' : 'Sorry, I didn\'t mean to... I\'ll go, just don\'t be mad.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<SpendEnergy $player 5>>
<<set _salary = Random(80,250)>>
<<set $player.money += _salary>>
<<set _salaryMSG = 'You got your daily salary of ' + _salary + ', keeping you afloat.'>>
<<ChatMessage _salaryMSG>>
<div class="npc-event-actions">
<div class="btn"><<button "Continue" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
</div>
<</nobr>><<nobr>>
<<set $npcType = Random(1,2)>>
<<if $npcType == 1>>
<<set $npc = {name:'Dominant patron', gender:'Female', photo:'Media\\Characters\\QuestChars\\Other\\Unknown.jpg', type:'dominant'}>>
<<else>>
<<set $npc = {name:'Submissive patron', gender:'Female', photo:'Media\\Characters\\QuestChars\\Other\\Unknown.jpg', type:'submissive'}>>
<</if>>
<<ChatMessage 'A stunning patron slides onto a barstool, her gaze locking onto yours with a sultry smile, ordering a cocktail with a voice like velvet.'>>
<<set _msg = ($npc.type == 'dominant' ? 'Make it strong, bartender. And if you\'re good, maybe I\'ll let you taste it off my lips.' : 'Something sweet, please... and if you\'re free later, maybe we could share a drink?')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<div class="npc-event-actions">
<div class="btn"><<button "Keep it professional" "Bartender_Flirt_Professional">><</button>></div>
<div class="btn"><<button "Flirt back" "Bartender_Flirt_Back">><</button>></div>
<<if $player.attributes.corruption.value >= 2>>
<div class="btn"><<button "Kiss her" "Bartender_Flirt_Kiss">><</button>></div>
<<else>>
<div class="btn non-interacting" id='kiss-flirt'><<button "Kiss her">><</button>></div>
<<done>>
<<run addHoverTooltip('kiss-flirt', 'Requires corruption level 2 or higher')>>
<</done>>
<</if>>
<<if $player.attributes.corruption.value >= 3>>
<div class="btn"><<button "Offer more" "Bartender_Flirt_Offer">><</button>></div>
<<else>>
<div class="btn non-interacting" id='offer-flirt'><<button "Offer more">><</button>></div>
<<done>>
<<run addHoverTooltip('offer-flirt', 'Requires corruption level 3 or higher')>>
<</done>>
<</if>>
<<if $player.attributes.dominance.value >= 2>>
<div class="btn"><<button "Turn the tables" "Bartender_Flirt_Dominate">><</button>></div>
<<else>>
<div class="btn non-interacting" id='dominate-flirt'><<button "Turn the tables">><</button>></div>
<<done>>
<<run addHoverTooltip('dominate-flirt', 'Requires dominance level 2 or higher')>>
<</done>>
<</if>>
</div>
<</nobr>><<nobr>>
<<Chat $player 'Here\'s your drink, enjoy. Let me know if you need anything else.'>>
<<set _msg = ($npc.type == 'dominant' ? 'Boring... but I\'ll be back when you loosen up.' : 'Thanks... maybe next time you\'ll join me?')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<SpendEnergy $player 5>>
<<set _salary = Random(80,250)>>
<<set $player.money += _salary>>
<<set _salaryMSG = 'You got your daily salary of ' + _salary + ', keeping you afloat.'>>
<<ChatMessage _salaryMSG>>
<div class="npc-event-actions">
<div class="btn"><<button "Continue" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
</div>
<</nobr>><<nobr>>
<<Chat $player 'Strong and sweet, just like you. *You mix the drink with a wink.*'>>
<<set _msg = ($npc.type == 'dominant' ? 'Flattery will get you everywhere... keep it up.' : 'Oh, you\'re sweet too. Maybe we can chat more?')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<set _randomValueChange = Random(1,3)>>
<<SetCharProgression $player "corruption" _randomValueChange true>>
<<SpendEnergy $player 5>>
<<set $player.money += 20>>
<<ChatMessage 'You earned 20 for that charming service.'>>
<<set _salary = Random(80,250)>>
<<set $player.money += _salary>>
<<set _salaryMSG = 'You got your daily salary of ' + _salary + ', keeping you afloat.'>>
<<ChatMessage _salaryMSG>>
<div class="npc-event-actions">
<div class="btn"><<button "Continue" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
</div>
<</nobr>><<nobr>>
<<Chat $player 'The drink\'s on me... if I can have a taste first. *You lean over the bar for a quick, heated kiss.*'>>
<<set _msg = ($npc.type == 'dominant' ? 'Bold... I like it. Don\'t stop there.' : 'Mmm, sweet... can we do that again?')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<set _randomValueChange = Random(3,7)>>
<<SetCharProgression $player "corruption" _randomValueChange true>>
<<SpendEnergy $player 10>>
<<set $player.money += 30>>
<<ChatMessage 'You scored 30 for that stolen kiss.'>>
<<set _salary = Random(80,250)>>
<<set $player.money += _salary>>
<<set _salaryMSG = 'You got your daily salary of ' + _salary + ', keeping you afloat.'>>
<<ChatMessage _salaryMSG>>
<div class="npc-event-actions">
<div class="btn"><<button "Continue" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
</div>
<</nobr>><<nobr>>
<<Chat $player 'Want something stronger? Like me... *You press close, offering more than just drinks.*'>>
<<set _msg = ($npc.type == 'dominant' ? 'Yes, I do. Let\'s find somewhere private.' : 'Oh, wow... I\'m in, show me what you mean.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<set _randomValueChange = Random(5,10)>>
<<SetCharProgression $player "corruption" _randomValueChange true>>
<<SpendEnergy $player 15>>
<<set $player.money += 40>>
<<ChatMessage 'You pocketed 40 for offering yourself.'>>
<<set _salary = Random(80,250)>>
<<set $player.money += _salary>>
<<set _salaryMSG = 'You got your daily salary of ' + _salary + ', keeping you afloat.'>>
<<ChatMessage _salaryMSG>>
<div class="npc-event-actions">
<div class="btn"><<button "Continue" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
</div>
<</nobr>><<nobr>>
<<Chat $player 'I\'m the one mixing drinks here, not you. Behave, or I\'ll cut you off.'>>
<<set _msg = ($npc.type == 'dominant' ? 'Feisty bartender... I\'ll break you yet.' : 'Sorry, I didn\'t mean to overstep.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<SpendEnergy $player 5>>
<<set _salary = Random(80,250)>>
<<set $player.money += _salary>>
<<set _salaryMSG = 'You got your daily salary of ' + _salary + ', keeping you afloat.'>>
<<ChatMessage _salaryMSG>>
<div class="npc-event-actions">
<div class="btn"><<button "Continue" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
</div>
<</nobr>><<nobr>>
<<ChatMessage 'The bar owner pulls you aside during a slow moment, his eyes roaming your body with that familiar hunger, suggesting ways to \'boost your tips\'.'>>
<<set $npcType = Random(1,2)>>
<<if $npcType == 1>>
<<set $npc = {name:'Bar Owner', gender:'Male', photo:'Media\\Characters\\QuestChars\\Other\\Unknown.jpg', type:'dominant'}>>
<<else>>
<<set $npc = {name:'Bar Owner', gender:'Male', photo:'Media\\Characters\\QuestChars\\Other\\Unknown.jpg', type:'submissive'}>>
<</if>>
<<set _msg = ($npc.type == 'dominant' ? 'You\'re my best bartender... how about earning a bonus on your knees?' : 'You\'re doing great... if you\'re up for it, I could give you extra for some fun.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<div class="npc-event-actions">
<div class="btn"><<button "Refuse" "Bartender_Boss_Refuse">><</button>></div>
<div class="btn"><<button "Flirt" "Bartender_Boss_Flirt">><</button>></div>
<<if $player.attributes.corruption.value >= 2>>
<div class="btn"><<button "Handjob" "Bartender_Boss_Handjob">><</button>></div>
<<else>>
<div class="btn non-interacting" id='handjob-boss'><<button "Handjob">><</button>></div>
<<done>>
<<run addHoverTooltip('handjob-boss', 'Requires corruption level 2 or higher')>>
<</done>>
<</if>>
<<if $player.attributes.corruption.value >= 3 && $playerlock != true>>
<div class="btn"><<button "Blowjob" "Bartender_Boss_Blowjob">><</button>></div>
<<elseif $player.attributes.corruption.value >= 3 && $playerlock == true>>
<div class="btn non-interacting" id='blowjob-boss'><<button "Blowjob">><</button>></div>
<<done>>
<<run addHoverTooltip('blowjob-boss', 'You are locked and cannot perform active sex')>>
<</done>>
<<else>>
<div class="btn non-interacting" id='blowjob-boss'><<button "Blowjob">><</button>></div>
<<done>>
<<run addHoverTooltip('blowjob-boss', 'Requires corruption level 3 or higher')>>
<</done>>
<</if>>
<<if $player.attributes.corruption.value >= 4 && $playerlock != true>>
<div class="btn"><<button "Sex">>
<<goto "Bartender_Boss_Sex">>
<</button>></div>
<<elseif $player.attributes.corruption.value >= 4 && $playerlock == true>>
<div class="btn non-interacting" id='sex-boss'><<button "Sex">><</button>></div>
<<done>>
<<run addHoverTooltip('sex-boss', 'You are locked and cannot perform active sex')>>
<</done>>
<<else>>
<div class="btn non-interacting" id='sex-boss'><<button "Sex">><</button>></div>
<<done>>
<<run addHoverTooltip('sex-boss', 'Requires corruption level 4 or higher')>>
<</done>>
<</if>>
<<if $player.attributes.dominance.value >= 2>>
<div class="btn"><<button "Dominate" "Bartender_Boss_Dominate">><</button>></div>
<<else>>
<div class="btn non-interacting" id='dominate-boss'><<button "Dominate">><</button>></div>
<<done>>
<<run addHoverTooltip('dominate-boss', 'Requires dominance level 2 or higher')>>
<</done>>
<</if>>
</div>
<</nobr>><<nobr>>
<<Chat $player 'No way, boss. I\'m here to mix drinks, not mix with you. Keep your hands and offers to yourself.'>>
<<set _msg = ($npc.type == 'dominant' ? 'You\'ll regret turning me down... but I\'ll wait.' : 'Alright, I get it... but the offer stands.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<SpendEnergy $player 10>>
<<set $player.money -= 10>>
<<ChatMessage 'You paid 10 for refusing the boss.'>>
<<set _salary = Random(80,250)>>
<<set $player.money += _salary>>
<<set _salaryMSG = 'You got your daily salary of ' + _salary + ', keeping you afloat.'>>
<<ChatMessage _salaryMSG>>
<div class="npc-event-actions">
<div class="btn"><<button "Continue" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
</div>
<</nobr>><<nobr>>
<<Chat $player 'A bonus, huh? Maybe if you buy me a drink first... *You smile coyly.*'>>
<<set _msg = ($npc.type == 'dominant' ? 'Deal. But I expect more than flirting.' : 'Sure, let\'s have that drink... and see where it goes.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<set _randomValueChange = Random(1,3)>>
<<SetCharProgression $player "corruption" _randomValueChange true>>
<<SpendEnergy $player 5>>
<<set $player.money += 20>>
<<ChatMessage 'You earned 20 for flirting with the boss.'>>
<<set _salary = Random(80,250)>>
<<set $player.money += _salary>>
<<set _salaryMSG = 'You got your daily salary of ' + _salary + ', keeping you afloat.'>>
<<ChatMessage _salaryMSG>>
<div class="npc-event-actions">
<div class="btn"><<button "Continue" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
</div>
<</nobr>><<nobr>>
<<Chat $player 'Alright, boss... *You slip your hand under the bar, into his fly, and wrap your fingers around his hard cock, stroking him where nobody can see.*'>>
<<set _msg = ($npc.type == 'dominant' ? 'Good girl... faster, make me cum.' : 'Oh, fuck... that feels amazing.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<set _randomValueChange = Random(3,7)>>
<<SetCharProgression $player "corruption" _randomValueChange true>>
<<SpendEnergy $player 10>>
<<set $player.money += 35>>
<<ChatMessage 'You scored 35 for that sneaky handjob.'>>
<<set _salary = Random(80,250)>>
<<set $player.money += _salary>>
<<set _salaryMSG = 'You got your daily salary of ' + _salary + ', keeping you afloat.'>>
<<ChatMessage _salaryMSG>>
<div class="npc-event-actions">
<div class="btn"><<button "Continue" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
</div>
<</nobr>><<nobr>>
<<Chat $player 'Want me to take care of that? *You drop to your knees behind the bar.*'>>
<<set _msg = ($npc.type == 'dominant' ? 'Yes, suck my cock, take it deep... earn your bonus.' : 'God, yes... be gentle at first.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<set _randomValueChange = Random(3,7)>>
<<SetCharProgression $player "corruption" _randomValueChange true>>
<<SpendEnergy $player 15>>
<<set $player.money += 45>>
<<ChatMessage 'You pocketed 45 for the blowjob.'>>
<<set _salary = Random(80,250)>>
<<set $player.money += _salary>>
<<set _salaryMSG = 'You got your daily salary of ' + _salary + ', keeping you afloat.'>>
<<ChatMessage _salaryMSG>>
<div class="npc-event-actions">
<div class="btn"><<button "Continue" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
</div>
<</nobr>><<nobr>>
<<ChatMessage 'You and the boss sneak into the storage room. He bends you over a stack of beer crates, yanks your clothes down and fucks you hard, his cock slamming into you while the bar\'s music drowns out your cries, until he cums deep inside you.'>>
<<set _randomValueChange = Random(5,10)>>
<<SetCharProgression $player "corruption" _randomValueChange true>>
<<SpendEnergy $player 20>>
<<set $player.money += 60>>
<<ChatMessage 'You raked in 60 for fucking the boss.'>>
<<set _salary = Random(80,250)>>
<<set $player.money += _salary>>
<<set _salaryMSG = 'You got your daily salary of ' + _salary + ', keeping you afloat.'>>
<<ChatMessage _salaryMSG>>
<div class="npc-event-actions">
<div class="btn"><<button "Continue" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
</div>
<</nobr>><<nobr>>
<<Chat $player 'Listen, boss, I\'m not your whore. Keep your sleazy offers to yourself, or I\'ll quit and tell everyone what you\'re like.'>>
<<set _msg = ($npc.type == 'dominant' ? 'You\'ve got guts... but I own this place.' : 'Fine, I won\'t push... but don\'t say I didn\'t offer.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<SpendEnergy $player 10>>
<<set _salary = Random(80,250)>>
<<set $player.money += _salary>>
<<set _salaryMSG = 'You got your daily salary of ' + _salary + ', keeping you afloat.'>>
<<ChatMessage _salaryMSG>>
<div class="npc-event-actions">
<div class="btn"><<button "Continue" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
</div>
<</nobr>><<nobr>>
<<ChatMessage 'A group of rowdy patrons surrounds the bar, shouting orders and eyeing you hungrily, the air thick with the crowd\'s collective desire.'>>
<<set _inc = Random(30,70)>>
<<SpendEnergy $player 15>>
<<set $player.money += _inc>>
<<set _tipsMsg = 'You handled the rush like a pro, earning ' + _inc + ' in tips.'>>
<<ChatMessage _tipsMsg>>
<<set _salary = Random(80,250)>>
<<set $player.money += _salary>>
<<set _salaryMSG = 'You got your daily salary of ' + _salary + ', keeping you afloat.'>>
<<ChatMessage _salaryMSG>>
<div class="npc-event-actions">
<div class="btn"><<button "Continue" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
</div>
<</nobr>><<nobr>>
<<ChatMessage 'It\'s a quiet night, and you find yourself alone with a mysterious stranger who slips you a note with a private invitation.'>>
<<set _salary = Random(80,250)>>
<<set $player.money += _salary>>
<<set _salaryMSG = 'You got your daily salary of ' + _salary + ', keeping you afloat.'>>
<<ChatMessage _salaryMSG>>
<div class="npc-event-actions">
<div class="btn"><<button "Continue" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<EachLoc>>
<<SetBackground "Media/Locations/Other/bus_Interior.jpg">>
<<timed 0.2s>>
<div class="centre-text">City Bus</div>
<div class="single-column">
<fieldset>
<legend>Navigation</legend>
<div class="btn-container">
<<if $busNextLocation>>
<div class="btn"><<button "Exit Bus">>
<<set $player.money -= 10>>
<<SpendTime 10>>
<<set _dest = $busNextLocation>>
<<set $busNextLocation = "">>
<<goto _dest>>
<</button>></div>
<<else>>
<div class="btn"><<button "Exit Bus" $player.info.currentLocation>><</button>></div>
<</if>>
</div>
</fieldset>
</div>
<<PeopleAround>>
<</timed>>
<</nobr>><<nobr>>
<<if $busNextLocation>>
<<goto "Bus">>
<<else>>
<<goto $player.info.currentLocation>>
<</if>>
<</nobr>><<nobr>>
<<if getQuestState("ethan_quest_01") == "active" && $player.inventory.hasItem("NovaGear X") && getTaskState("ethan_quest_01", "Purchase a game console")>>
<<run completeTaskByQuestID("ethan_quest_01", "Purchase a game console")>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set $gameSettings.allowSaves = false>>
<<set $canShowStatsBtn = false>>
<div class="btn-container padding-top">
<<HiddenCamFeedButton>>
<<if $player.money >= 250 && $player.attributes.speech.value < $player.attributes.speech.max && $player.status.energy.value >= 10>>
<div class="btn"><<button "Oratory Lessons ($250)" "PC_Lessons">><<set $trainingType = "speech">><</button>></div>
<<else>>
<div class="btn non-interacting"><<button "Oratory Lessons ($250)">><</button>></div>
<</if>>
<<if $player.money >= 250 && $player.attributes.dominance.value < $player.attributes.dominance.max && $player.status.energy.value >= 10>>
<div class="btn"><<button "Ego Training ($250)" "PC_Lessons">><<set $trainingType = "dominance">><</button>></div>
<<else>>
<div class="btn non-interacting"><<button "Ego Training ($250)">><</button>></div>
<</if>>
<<if $player.money >= 250 && $player.attributes.performer.value < $player.attributes.performer.max && $player.status.energy.value >= 10>>
<div class="btn"><<button "Performance Course ($250)" "PC_Lessons">><<set $trainingType = "performer">><</button>></div>
<<else>>
<div class="btn non-interacting"><<button "Performance Course ($250)">><</button>></div>
<</if>>
<<if $player.characterEvents.isEventRegistered($player.info.id, "GetFreelanceJob") == false && $player.dailyEvents.isEventRegistered($player.info.id, "RefuseFreelanceJob") == false>>
<<if $player.attributes.intelligence.value > 0>>
<div class="btn"><<button "Freelance Job" "PC_AcceptFreelanceJob">><</button>></div>
<<else>>
<div class="btn non-interacting" id="freelance-btn"><<button "Freelance Job">><</button>></div>
<<done>>
<<run addHoverTooltip('freelance-btn', 'Intelligence Level Too Low')>>
<</done>>
<</if>>
<<elseif $player.dailyEvents.isEventRegistered($player.info.id, "RefuseFreelanceJob") == true>>
<div class="btn non-interacting" id="freelance-btn"><<button "Freelance Job">><</button>></div>
<<done>>
<<run addHoverTooltip('freelance-btn', 'You\'ve already looked at today\'s assignments.')>>
<</done>>
<<elseif $player.status.energy.value >= 15>>
<<set _resumeWorkLabel = "Resume Work (" + $freelanceJob.progress + "/100)">>
<div class="btn"><<button _resumeWorkLabel "PC_ResumeWork">><</button>></div>
<<else>>
<<set _resumeWorkLabel = "Resume Work (" + $freelanceJob.progress + "/100)">>
<div class="btn non-interacting" id="freelance-btn"><<button _resumeWorkLabel>><</button>></div>
<<done>>
<<run addHoverTooltip('freelance-btn', 'You\'re too tired')>>
<</done>>
<</if>>
<div class="btn"><<button "Watch porn" "PC_WatchPorn_ChooseType">><</button>></div>
</div>
<div class="btn padding-top"><<button "Back" $player.info.currentLocation>>
<<set $gameSettings.allowSaves = true>>
<<set $canShowStatsBtn = true>>
<</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set $player.money -= 250>>
<<SpendEnergy $player 10>>
<<SpendTimeWithoutUpdate 30>>
<<set _randomIncrease = Random(5, 20) + $player.attributes.intelligence.value>>
<<SetCharProgression $player $trainingType _randomIncrease true>>
<<if $trainingType == "dominance">>
<<set _subLoss = Random(2, 5) * -1>>
<<SetCharProgression $player 'submission' _subLoss true>>
<</if>>
<div class="btn padding-top"><<button "Continue" "ComputerSystem">><<unset $trainingType>><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set $freelanceJob = {salary: 0, progress: 0}>>
<<ChatMessage 'The higher your intelligence, the more money you can be offered for a job. You can only view one assignment per day.'>>
<<switch $player.attributes.intelligence.value>>
<<case 1>>
<<set $freelanceJob.salary = Random(100, 180)>>
<<case 2>>
<<set $freelanceJob.salary = Random(180, 350)>>
<<case 3>>
<<set $freelanceJob.salary = Random(350, 500)>>
<<case 4>>
<<set $freelanceJob.salary = Random(500, 700)>>
<<case 5>>
<<set $freelanceJob.salary = Random(700, 900)>>
<<case 6>>
<<set $freelanceJob.salary = Random(900, 1200)>>
<<case 7>>
<<set $freelanceJob.salary = Random(1200, 1800)>>
<<case 8>>
<<set $freelanceJob.salary = Random(1800, 3000)>>
<<case 9>>
<<set $freelanceJob.salary = Random(3000, 5000)>>
<<case 10>>
<<set $freelanceJob.salary = Random(5000, 10000)>>
<</switch>>
<<set _msgSalary = 'You\'ll have a $' + $freelanceJob.salary + ' job offer'>>
<<ChatMessage _msgSalary>>
<div class="btn padding-top"><<button "Accept" "ComputerSystem">><<run $player.characterEvents.registerEvent($player.info.id, "GetFreelanceJob", 1)>><</button>></div>
<div class="btn padding-top"><<button "Refuse" "ComputerSystem">><<run $player.dailyEvents.registerEvent($player.info.id, "RefuseFreelanceJob", 1)>><<unset $freelanceJob>><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SpendEnergy $player 15>>
<<SpendTimeWithoutUpdate 120>>
<<set $freelanceJob.progress += Random(5,20)>>
<<if $freelanceJob.progress >= 100>>
<<set _msgSalary = 'Job Completed: You earned $' + $freelanceJob.salary>>
<<ChatMessage _msgSalary>>
<<set $player.money += $freelanceJob.salary>>
<<run $player.characterEvents.unregisterEvent($player.info.id,'GetFreelanceJob')>>
<div class="btn padding-top"><<button "Continue" "ComputerSystem">><<unset $freelanceJob>><</button>></div>
<<else>>
<<ChatMessage 'You work for several hours. But the work isn\'t done yet.'>>
<div class="btn padding-top"><<button "Continue" "ComputerSystem">><</button>></div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<div class="btn-container padding-top">
<div class="btn"><<button "Male on Female" "PC_WatchPorn">><<set $pornType = "MoF">><</button>></div>
<div class="btn"><<button "Male on Male" "PC_WatchPorn">><<set $pornType = "MoM">><</button>></div>
<div class="btn"><<button "Male on Trans" "PC_WatchPorn">><<set $pornType = "MoT">><</button>></div>
<div class="btn"><<button "Female on Male" "PC_WatchPorn">><<set $pornType = "FoM">><</button>></div>
<div class="btn"><<button "Female on Female" "PC_WatchPorn">><<set $pornType = "FoF">><</button>></div>
<div class="btn"><<button "Female on Trans" "PC_WatchPorn">><<set $pornType = "FoT">><</button>></div>
<div class="btn"><<button "Trans on Male" "PC_WatchPorn">><<set $pornType = "ToM">><</button>></div>
<div class="btn"><<button "Trans on Female" "PC_WatchPorn">><<set $pornType = "ToF">><</button>></div>
<div class="btn"><<button "Trans on Trans" "PC_WatchPorn">><<set $pornType = "ToT">><</button>></div>
</div>
<div class="btn padding-top"><<button "Back" "ComputerSystem">><<unset $pornType>><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set $player.status.horny.increase(15)>>
<<SpendTimeWithoutUpdate 15>>
<<set _xp = Random(2, 5)>>
<<SetCharProgression $player 'lust' _xp true>>
<<set _xp = Random(1, 3)>>
<<SetCharProgression $player 'corruption' _xp true>>
<<run $player.dailyEvents.registerEvent($player.info.id, "SexualActivityToday", 1)>>
<<switch $pornType>>
<<case "MoF">>
<<set _dom = "Male">>
<<set _sub = "Female">>
<<case "MoM">>
<<set _dom = "Male">>
<<set _sub = "Male">>
<<case "MoT">>
<<set _dom = "Male">>
<<set _sub = "Shemale">>
<<case "FoF">>
<<set _dom = "Female">>
<<set _sub = "Female">>
<<case "FoM">>
<<set _dom = "Female">>
<<set _sub = "Male">>
<<case "FoT">>
<<set _dom = "Female">>
<<set _sub = "Shemale">>
<<case "ToF">>
<<set _dom = "Shemale">>
<<set _sub = "Female">>
<<case "ToM">>
<<set _dom = "Shemale">>
<<set _sub = "Male">>
<<case "ToT">>
<<set _dom = "Shemale">>
<<set _sub = "Shemale">>
<</switch>>
<<if $pornType == "MoF" || $pornType == "FoF" || $pornType == "ToF">>
<<set _poseType = ['vag', 'anal', 'oral'].random()>>
<<else>>
<<set _poseType = ['anal', 'oral'].random()>>
<</if>>
<<switch _poseType>>
<<case "vag">>
<<SetVagPick _dom _sub>>
<<case "anal">>
<<SetAnalPick _dom _sub>>
<<case "oral">>
<<SetOralPick _dom _sub>>
<</switch>>
/* <<run console.log(_pick, $pornType, _poseType)>> */
<<Video _pick>>
<div class="btn padding-top"><<button "Continue" "ComputerSystem">><<unset $pornType>><</button>></div>
<</nobr>>/* Resolve a source-issued street-crime choice exactly once. The choice token is
replaced before any result UI is exposed, so passage reloads can only replay
prose, never the roll, wanted gain, money, time, or achievement. */
<<widget "PreparePoliceCrime">>
<<set _crimeName = _args[0]>>
<<set _crimeRoute = _args[1]>>
<<set _crimeLocation = _args[2]>>
<<set _crimeEligible = _args[3] is true>>
<<set _crimeToken = $policeCrimeAuthority>>
<<set _crimeConfigured =
(_crimeName is "pickpocket" and _crimeRoute is "Crime_Pickpocket" and _crimeLocation is "Downtown") or
(_crimeName is "shoplifting" and _crimeRoute is "Crime_Shoplift" and _crimeLocation is "Mall") or
(_crimeName is "mugging" and _crimeRoute is "Crime_Mug" and _crimeLocation is "Park") or
(_crimeName is "dealing" and _crimeRoute is "Crime_Deal" and _crimeLocation is "SR_SkidRow") or
(_crimeName is "grandTheft" and _crimeRoute is "Crime_GrandTheft" and _crimeLocation is "Downtown") or
(_crimeName is "vandalism" and _crimeRoute is "Crime_Vandalism" and _crimeLocation is "SR_SkidRow") or
(_crimeName is "solicitation" and _crimeRoute is "Crime_Solicit" and _crimeLocation is "RedLightDistrict")>>
<<set _crimeOwned = _crimeToken and _crimeToken.crime is _crimeName and _crimeToken.passage is _crimeRoute>>
<<set _crimeAtOrigin = _crimeToken and _crimeToken.location is _crimeLocation and $player.info.currentLocation is _crimeLocation and passage() is _crimeRoute>>
<<set _crimeChoiceValid = _crimeConfigured and _crimeOwned and _crimeAtOrigin and _crimeEligible and _crimeToken.source is "choice" and _crimeToken.day is getCurrentAbsoluteDay()>>
/* A clean action may cross midnight. Keep its source-day identity unchanged,
and stamp only the day on which the already-applied result was produced. */
<<set _crimeResultContentValid = _crimeName isnot "solicitation" or CheckContentFilter('Male', $player)>>
<<set _crimeCleanValid = _crimeConfigured and _crimeOwned and _crimeAtOrigin and _crimeResultContentValid and _crimeToken.source is "result" and _crimeToken.detected is false and Number.isFinite(_crimeToken.take) and _crimeToken.resolvedDay is getCurrentAbsoluteDay() and (_crimeToken.day is _crimeToken.resolvedDay or _crimeToken.day is (_crimeToken.resolvedDay - 1))>>
<<set _crimeCaughtValid = _crimeConfigured and _crimeOwned and _crimeAtOrigin and _crimeToken.source is "caught-choice" and _crimeToken.detected is true and _crimeToken.day is getCurrentAbsoluteDay()>>
<<set _crimeAuthorityValid = _crimeCleanValid or _crimeCaughtValid>>
<<if _crimeChoiceValid>>
<<set _crimeStealth = $player.attributes.dexterity.value>>
<<if _crimeName is "pickpocket">>
<<set _crimeDetection = streetDetectionChance($police, { crime: 'pickpocket', district: _crimeLocation, hour: $dateTime.hours, witnesses: 1, stealth: _crimeStealth })>>
<<set _crimeTakeMin = 15>><<set _crimeTakeMax = 60>><<set _crimeMinutes = 20>><<set _crimeCleanAchievement = "pickpocket">>
<<elseif _crimeName is "shoplifting">>
<<set _crimeDetection = streetDetectionChance($police, { crime: 'shoplifting', district: _crimeLocation, hour: $dateTime.hours, witnesses: 1, cameras: true, stealth: _crimeStealth })>>
<<set _crimeTakeMin = 25>><<set _crimeTakeMax = 90>><<set _crimeMinutes = 15>><<set _crimeCleanAchievement = "">>
<<elseif _crimeName is "mugging">>
<<set _crimeDetection = streetDetectionChance($police, { crime: 'mugging', district: _crimeLocation, hour: $dateTime.hours, witnesses: 0, stealth: _crimeStealth })>>
<<set _crimeTakeMin = 60>><<set _crimeTakeMax = 200>><<set _crimeMinutes = 20>><<set _crimeCleanAchievement = "">>
<<elseif _crimeName is "dealing">>
<<set _crimeDetection = streetDetectionChance($police, { crime: 'dealing', district: _crimeLocation, hour: $dateTime.hours, witnesses: 1, stealth: _crimeStealth })>>
<<set _crimeTakeMin = 80>><<set _crimeTakeMax = 250>><<set _crimeMinutes = 40>><<set _crimeCleanAchievement = "">>
<<elseif _crimeName is "grandTheft">>
<<set _crimeDetection = streetDetectionChance($police, { crime: 'grandTheft', district: _crimeLocation, hour: $dateTime.hours, cameras: true, stealth: _crimeStealth })>>
<<set _crimeTakeMin = 200>><<set _crimeTakeMax = 500>><<set _crimeMinutes = 45>><<set _crimeCleanAchievement = "">>
<<elseif _crimeName is "vandalism">>
<<set _crimeDetection = streetDetectionChance($police, { crime: 'vandalism', district: _crimeLocation, hour: $dateTime.hours, stealth: _crimeStealth })>>
<<set _crimeTakeMin = 10>><<set _crimeTakeMax = 45>><<set _crimeMinutes = 15>><<set _crimeCleanAchievement = "">>
<<else>>
<<set _crimeDetection = streetDetectionChance($police, { crime: 'solicitation', district: _crimeLocation, hour: $dateTime.hours, stealth: _crimeStealth })>>
<<set _crimeTakeMin = 40>><<set _crimeTakeMax = 120>><<set _crimeMinutes = 15>><<set _crimeCleanAchievement = "">>
<</if>>
<<run raiseWanted($police, _crimeName, _crimeToken.day, _crimeToken.location)>>
<<if getWanted($police) gte 75>><<run unlockPrisonAchievement('mostWanted')>><</if>>
<<if rollDetected(_crimeDetection)>>
<<set $policeCrimeAuthority = {
source: "caught-choice",
crime: _crimeToken.crime,
passage: _crimeToken.passage,
day: _crimeToken.day,
location: _crimeToken.location,
detected: true
}>>
<<else>>
<<set _crimeTake = random(_crimeTakeMin, _crimeTakeMax)>>
<<AddMoney _crimeTake>>
<<if _crimeCleanAchievement>><<run unlockPrisonAchievement(_crimeCleanAchievement)>><</if>>
<<SpendTime _crimeMinutes>>
<<set $policeCrimeAuthority = {
source: "result",
crime: _crimeToken.crime,
passage: _crimeToken.passage,
day: _crimeToken.day,
location: _crimeToken.location,
detected: false,
take: _crimeTake,
resolvedDay: getCurrentAbsoluteDay()
}>>
<</if>>
<<set _crimeAuthorityValid = true>>
<</if>>
<<set _crimeResult = $policeCrimeAuthority>>
<<if not _crimeAuthorityValid and _crimeOwned>>
/* Clear only the envelope owned by this route. An unrelated pending crime
remains available to its own passage. */
<<unset $policeCrimeAuthority>>
<<LeaveInteractionSettings>>
<</if>>
<</widget>><<nobr>>
<<include "UpdateAll">>
<<set _crimeEligible = $player.info.currentLocation is "Downtown">>
<<PreparePoliceCrime "pickpocket" "Crime_Pickpocket" "Downtown" _crimeEligible>>
<<if not _crimeAuthorityValid>>
<<goto $player.info.currentLocation>>
<<elseif _crimeResult.source is "caught-choice">>
<<LockSettings>>
<<SetBackground "Media/Locations/Downtown/Downtown.jpg">>
<div class="centre-text">Caught in the act</div>
<div class="chat-container"><p class="text">A hand clamps your wrist mid-lift and a voice goes up for a cop. There is no talking your way out of the grab itself.</p></div>
<div class="btn padding-top"><<button "Face the music">>
<<set _crimeNow = $policeCrimeAuthority>>
<<set _crimeEligibleNow = $player.info.currentLocation is "Downtown">>
<<set _crimeCaughtNow = _crimeEligibleNow and passage() is "Crime_Pickpocket" and _crimeNow and _crimeNow.source is "caught-choice" and _crimeNow.crime is "pickpocket" and _crimeNow.passage is "Crime_Pickpocket" and _crimeNow.day is getCurrentAbsoluteDay() and _crimeNow.location is "Downtown" and _crimeNow.detected is true>>
<<if _crimeCaughtNow>>
<<unset $policeCrimeAuthority>>
<<set $policeStopCrime = "pickpocket">>
<<set $policeReturnPassage = _crimeNow.location>>
<<goto "Police_Stop">>
<<else>>
<<if _crimeNow and _crimeNow.crime is "pickpocket" and _crimeNow.passage is "Crime_Pickpocket">><<unset $policeCrimeAuthority>><</if>>
<<LeaveInteractionSettings>>
<<goto $player.info.currentLocation>>
<</if>>
<</button>></div>
<<else>>
<<SetBackground "Media/Locations/Downtown/Downtown.jpg">>
<div class="centre-text">Clean lift</div>
<div class="chat-container"><p class="text">You brush past a mark and their wallet is lighter by $<<= _crimeResult.take>> before they feel a thing. In and gone, easy as breathing.</p></div>
<div class="btn padding-top"><<button "Melt into the crowd">>
<<set _crimeNow = $policeCrimeAuthority>>
<<set _crimeCleanNow = passage() is "Crime_Pickpocket" and $player.info.currentLocation is "Downtown" and _crimeNow and _crimeNow.source is "result" and _crimeNow.crime is "pickpocket" and _crimeNow.passage is "Crime_Pickpocket" and _crimeNow.location is "Downtown" and _crimeNow.detected is false and Number.isFinite(_crimeNow.take) and _crimeNow.resolvedDay is getCurrentAbsoluteDay() and (_crimeNow.day is _crimeNow.resolvedDay or _crimeNow.day is (_crimeNow.resolvedDay - 1))>>
<<if _crimeCleanNow>><<unset $policeCrimeAuthority>><<LeaveInteractionSettings>><<goto _crimeNow.location>><<else>><<if _crimeNow and _crimeNow.crime is "pickpocket" and _crimeNow.passage is "Crime_Pickpocket">><<unset $policeCrimeAuthority>><</if>><<LeaveInteractionSettings>><<goto $player.info.currentLocation>><</if>>
<</button>></div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _crimeEligible = $player.info.currentLocation is "Mall">>
<<PreparePoliceCrime "shoplifting" "Crime_Shoplift" "Mall" _crimeEligible>>
<<if not _crimeAuthorityValid>>
<<goto $player.info.currentLocation>>
<<elseif _crimeResult.source is "caught-choice">>
<<LockSettings>>
<div class="centre-text">Caught on camera</div>
<div class="chat-container"><p class="text">A hand lands on your shoulder before you clear the doors. Loss prevention has you on tape, and they have already made the call.</p></div>
<div class="btn padding-top"><<button "Face the music">>
<<set _crimeNow = $policeCrimeAuthority>>
<<set _crimeEligibleNow = $player.info.currentLocation is "Mall">>
<<set _crimeCaughtNow = _crimeEligibleNow and passage() is "Crime_Shoplift" and _crimeNow and _crimeNow.source is "caught-choice" and _crimeNow.crime is "shoplifting" and _crimeNow.passage is "Crime_Shoplift" and _crimeNow.day is getCurrentAbsoluteDay() and _crimeNow.location is "Mall" and _crimeNow.detected is true>>
<<if _crimeCaughtNow>><<unset $policeCrimeAuthority>><<set $policeStopCrime = "shoplifting">><<set $policeReturnPassage = _crimeNow.location>><<goto "Police_Stop">><<else>><<if _crimeNow and _crimeNow.crime is "shoplifting" and _crimeNow.passage is "Crime_Shoplift">><<unset $policeCrimeAuthority>><</if>><<LeaveInteractionSettings>><<goto $player.info.currentLocation>><</if>>
<</button>></div>
/* The guard offers to settle it in the back office (Events/ShopliftBackRoom.twee). Each body
has its own scene: a male guard for a female or a shemale thief, a female guard for a man. */
<<set _sbrGuard = ($player.gender() is "Male") ? "Female" : "Male">>
<<if CheckContentFilter(_sbrGuard, $player)>>
<<set _sbrLabel = (_sbrGuard is "Male") ? "Go with the guard to his office" : "Go with the guard to her office">>
<div class="btn padding-top"><<button _sbrLabel>>
<<set _crimeNow = $policeCrimeAuthority>>
<<set _crimeEligibleNow = $player.info.currentLocation is "Mall">>
<<set _crimeBackRoomNow = _crimeEligibleNow and passage() is "Crime_Shoplift" and _crimeNow and _crimeNow.source is "caught-choice" and _crimeNow.crime is "shoplifting" and _crimeNow.passage is "Crime_Shoplift" and _crimeNow.day is getCurrentAbsoluteDay() and _crimeNow.location is "Mall" and _crimeNow.detected is true>>
<<set _sbrRouteNow = { Female: "Shoplift_BackRoom", Male: "Shoplift_BackRoomM", Shemale: "Shoplift_BackRoomT" }[$player.gender()]>>
<<if _crimeBackRoomNow and _sbrRouteNow>><<unset $policeCrimeAuthority>><<set $shopliftBackRoom = { day: getCurrentAbsoluteDay(), gender: $player.gender() }>><<goto _sbrRouteNow>><<else>><<if _crimeNow and _crimeNow.crime is "shoplifting" and _crimeNow.passage is "Crime_Shoplift">><<unset $policeCrimeAuthority>><</if>><<LeaveInteractionSettings>><<goto $player.info.currentLocation>><</if>>
<</button>></div>
<</if>>
<<else>>
<div class="centre-text">Five-finger discount</div>
<div class="chat-container"><p class="text">You palm what fits and walk out like you own the place. About $<<= _crimeResult.take>> in merchandise, and you clear the doors before anyone can stop you.</p></div>
<div class="btn padding-top"><<button "Leave">>
<<set _crimeNow = $policeCrimeAuthority>>
<<set _crimeCleanNow = passage() is "Crime_Shoplift" and $player.info.currentLocation is "Mall" and _crimeNow and _crimeNow.source is "result" and _crimeNow.crime is "shoplifting" and _crimeNow.passage is "Crime_Shoplift" and _crimeNow.location is "Mall" and _crimeNow.detected is false and Number.isFinite(_crimeNow.take) and _crimeNow.resolvedDay is getCurrentAbsoluteDay() and (_crimeNow.day is _crimeNow.resolvedDay or _crimeNow.day is (_crimeNow.resolvedDay - 1))>>
<<if _crimeCleanNow>><<unset $policeCrimeAuthority>><<LeaveInteractionSettings>><<goto _crimeNow.location>><<else>><<if _crimeNow and _crimeNow.crime is "shoplifting" and _crimeNow.passage is "Crime_Shoplift">><<unset $policeCrimeAuthority>><</if>><<LeaveInteractionSettings>><<goto $player.info.currentLocation>><</if>>
<</button>></div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _crimeEligible = $player.info.currentLocation is "Park" and ($dateTime.hours gte 21 or $dateTime.hours lt 5)>>
<<PreparePoliceCrime "mugging" "Crime_Mug" "Park" _crimeEligible>>
<<if not _crimeAuthorityValid>>
<<goto $player.info.currentLocation>>
<<elseif _crimeResult.source is "caught-choice">>
<<LockSettings>>
<div class="centre-text">A scream in the dark</div>
<div class="chat-container"><p class="text">Your mark screams before you get the wallet, and a patrol car's lights are already sweeping the block. There is no walking this one back.</p></div>
<div class="btn padding-top"><<button "Face the music">>
<<set _crimeNow = $policeCrimeAuthority>>
<<set _crimeEligibleNow = $player.info.currentLocation is "Park" and ($dateTime.hours gte 21 or $dateTime.hours lt 5)>>
<<set _crimeCaughtNow = _crimeEligibleNow and passage() is "Crime_Mug" and _crimeNow and _crimeNow.source is "caught-choice" and _crimeNow.crime is "mugging" and _crimeNow.passage is "Crime_Mug" and _crimeNow.day is getCurrentAbsoluteDay() and _crimeNow.location is "Park" and _crimeNow.detected is true>>
<<if _crimeCaughtNow>><<unset $policeCrimeAuthority>><<set $policeStopCrime = "mugging">><<set $policeReturnPassage = _crimeNow.location>><<goto "Police_Stop">><<else>><<if _crimeNow and _crimeNow.crime is "mugging" and _crimeNow.passage is "Crime_Mug">><<unset $policeCrimeAuthority>><</if>><<LeaveInteractionSettings>><<goto $player.info.currentLocation>><</if>>
<</button>></div>
<<else>>
<div class="centre-text">Wallet and watch</div>
<div class="chat-container"><p class="text">You put them on the ground with a forearm and take what they have - about $<<= _crimeResult.take>>, and gone before they find their feet. Ugly work, but good money.</p></div>
<div class="btn padding-top"><<button "Melt into the night">>
<<set _crimeNow = $policeCrimeAuthority>>
<<set _crimeCleanNow = passage() is "Crime_Mug" and $player.info.currentLocation is "Park" and _crimeNow and _crimeNow.source is "result" and _crimeNow.crime is "mugging" and _crimeNow.passage is "Crime_Mug" and _crimeNow.location is "Park" and _crimeNow.detected is false and Number.isFinite(_crimeNow.take) and _crimeNow.resolvedDay is getCurrentAbsoluteDay() and (_crimeNow.day is _crimeNow.resolvedDay or _crimeNow.day is (_crimeNow.resolvedDay - 1))>>
<<if _crimeCleanNow>><<unset $policeCrimeAuthority>><<LeaveInteractionSettings>><<goto _crimeNow.location>><<else>><<if _crimeNow and _crimeNow.crime is "mugging" and _crimeNow.passage is "Crime_Mug">><<unset $policeCrimeAuthority>><</if>><<LeaveInteractionSettings>><<goto $player.info.currentLocation>><</if>>
<</button>></div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _crimeEligible = $player.info.currentLocation is "SR_SkidRow">>
<<PreparePoliceCrime "dealing" "Crime_Deal" "SR_SkidRow" _crimeEligible>>
<<if not _crimeAuthorityValid>>
<<goto $player.info.currentLocation>>
<<elseif _crimeResult.source is "caught-choice">>
<<LockSettings>>
<<SetBackground "Media/Locations/City/SkidRow/SkidRow.jpg">>
<div class="centre-text">The wrong hand</div>
<div class="chat-container"><p class="text">The buyer flashes tin instead of cash. Undercover, and he had you the second the package changed hands. There is no talking past a hand-to-hand they watched go down.</p></div>
<div class="btn padding-top"><<button "Face the music">>
<<set _crimeNow = $policeCrimeAuthority>>
<<set _crimeEligibleNow = $player.info.currentLocation is "SR_SkidRow">>
<<set _crimeCaughtNow = _crimeEligibleNow and passage() is "Crime_Deal" and _crimeNow and _crimeNow.source is "caught-choice" and _crimeNow.crime is "dealing" and _crimeNow.passage is "Crime_Deal" and _crimeNow.day is getCurrentAbsoluteDay() and _crimeNow.location is "SR_SkidRow" and _crimeNow.detected is true>>
<<if _crimeCaughtNow>><<unset $policeCrimeAuthority>><<set $policeStopCrime = "dealing">><<set $policeReturnPassage = _crimeNow.location>><<goto "Police_Stop">><<else>><<if _crimeNow and _crimeNow.crime is "dealing" and _crimeNow.passage is "Crime_Deal">><<unset $policeCrimeAuthority>><</if>><<LeaveInteractionSettings>><<goto $player.info.currentLocation>><</if>>
<</button>></div>
<<else>>
<<SetBackground "Media/Locations/City/SkidRow/SkidRow.jpg">>
<div class="centre-text">Corner work</div>
<div class="chat-container"><p class="text">You move the whole package hand-to-hand before the hour is out - a nod, a handoff, gone. About $<<= _crimeResult.take>> for the night, and the corner runs a little warmer for it now.</p></div>
<div class="btn padding-top"><<button "Melt into the Row">>
<<set _crimeNow = $policeCrimeAuthority>>
<<set _crimeCleanNow = passage() is "Crime_Deal" and $player.info.currentLocation is "SR_SkidRow" and _crimeNow and _crimeNow.source is "result" and _crimeNow.crime is "dealing" and _crimeNow.passage is "Crime_Deal" and _crimeNow.location is "SR_SkidRow" and _crimeNow.detected is false and Number.isFinite(_crimeNow.take) and _crimeNow.resolvedDay is getCurrentAbsoluteDay() and (_crimeNow.day is _crimeNow.resolvedDay or _crimeNow.day is (_crimeNow.resolvedDay - 1))>>
<<if _crimeCleanNow>><<unset $policeCrimeAuthority>><<LeaveInteractionSettings>><<goto _crimeNow.location>><<else>><<if _crimeNow and _crimeNow.crime is "dealing" and _crimeNow.passage is "Crime_Deal">><<unset $policeCrimeAuthority>><</if>><<LeaveInteractionSettings>><<goto $player.info.currentLocation>><</if>>
<</button>></div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _crimeEligible = $player.info.currentLocation is "Downtown" and ($dateTime.hours gte 20 or $dateTime.hours lt 5)>>
<<PreparePoliceCrime "grandTheft" "Crime_GrandTheft" "Downtown" _crimeEligible>>
<<if not _crimeAuthorityValid>>
<<goto $player.info.currentLocation>>
<<elseif _crimeResult.source is "caught-choice">>
<<LockSettings>>
<div class="centre-text">Alarm and lights</div>
<div class="chat-container"><p class="text">The alarm goes off the second the slim-jim bites, loud enough to wake the block, and a patrol unit two streets over is already turning your way. No talking your way out of sitting in a car that is not yours.</p></div>
<div class="btn padding-top"><<button "Face the music">>
<<set _crimeNow = $policeCrimeAuthority>>
<<set _crimeEligibleNow = $player.info.currentLocation is "Downtown" and ($dateTime.hours gte 20 or $dateTime.hours lt 5)>>
<<set _crimeCaughtNow = _crimeEligibleNow and passage() is "Crime_GrandTheft" and _crimeNow and _crimeNow.source is "caught-choice" and _crimeNow.crime is "grandTheft" and _crimeNow.passage is "Crime_GrandTheft" and _crimeNow.day is getCurrentAbsoluteDay() and _crimeNow.location is "Downtown" and _crimeNow.detected is true>>
<<if _crimeCaughtNow>><<unset $policeCrimeAuthority>><<set $policeStopCrime = "grandTheft">><<set $policeReturnPassage = _crimeNow.location>><<goto "Police_Stop">><<else>><<if _crimeNow and _crimeNow.crime is "grandTheft" and _crimeNow.passage is "Crime_GrandTheft">><<unset $policeCrimeAuthority>><</if>><<LeaveInteractionSettings>><<goto $player.info.currentLocation>><</if>>
<</button>></div>
<<else>>
<div class="centre-text">Gone in a minute</div>
<div class="chat-container"><p class="text">You are into it and rolling before the owner finishes their coffee, and within forty-five minutes a chop-shop contact takes it off your hands for about $<<= _crimeResult.take>>. Ugly, loud, and the best money the street pays - when it goes clean.</p></div>
<div class="btn padding-top"><<button "Drive off">>
<<set _crimeNow = $policeCrimeAuthority>>
<<set _crimeCleanNow = passage() is "Crime_GrandTheft" and $player.info.currentLocation is "Downtown" and _crimeNow and _crimeNow.source is "result" and _crimeNow.crime is "grandTheft" and _crimeNow.passage is "Crime_GrandTheft" and _crimeNow.location is "Downtown" and _crimeNow.detected is false and Number.isFinite(_crimeNow.take) and _crimeNow.resolvedDay is getCurrentAbsoluteDay() and (_crimeNow.day is _crimeNow.resolvedDay or _crimeNow.day is (_crimeNow.resolvedDay - 1))>>
<<if _crimeCleanNow>><<unset $policeCrimeAuthority>><<LeaveInteractionSettings>><<goto _crimeNow.location>><<else>><<if _crimeNow and _crimeNow.crime is "grandTheft" and _crimeNow.passage is "Crime_GrandTheft">><<unset $policeCrimeAuthority>><</if>><<LeaveInteractionSettings>><<goto $player.info.currentLocation>><</if>>
<</button>></div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _crimeEligible = $player.info.currentLocation is "SR_SkidRow">>
<<PreparePoliceCrime "vandalism" "Crime_Vandalism" "SR_SkidRow" _crimeEligible>>
<<if not _crimeAuthorityValid>>
<<goto $player.info.currentLocation>>
<<elseif _crimeResult.source is "caught-choice">>
<<LockSettings>>
<div class="centre-text">Someone called it in</div>
<div class="chat-container"><p class="text">Glass is still falling when a porch light snaps on and a voice is already on the phone to the non-emergency line, describing you. A cruiser rolls up before you clear the lot.</p></div>
<div class="btn padding-top"><<button "Face the music">>
<<set _crimeNow = $policeCrimeAuthority>>
<<set _crimeEligibleNow = $player.info.currentLocation is "SR_SkidRow">>
<<set _crimeCaughtNow = _crimeEligibleNow and passage() is "Crime_Vandalism" and _crimeNow and _crimeNow.source is "caught-choice" and _crimeNow.crime is "vandalism" and _crimeNow.passage is "Crime_Vandalism" and _crimeNow.day is getCurrentAbsoluteDay() and _crimeNow.location is "SR_SkidRow" and _crimeNow.detected is true>>
<<if _crimeCaughtNow>><<unset $policeCrimeAuthority>><<set $policeStopCrime = "vandalism">><<set $policeReturnPassage = _crimeNow.location>><<goto "Police_Stop">><<else>><<if _crimeNow and _crimeNow.crime is "vandalism" and _crimeNow.passage is "Crime_Vandalism">><<unset $policeCrimeAuthority>><</if>><<LeaveInteractionSettings>><<goto $player.info.currentLocation>><</if>>
<</button>></div>
<<else>>
<div class="centre-text">Broken glass</div>
<div class="chat-container"><p class="text">You put a brick through what needs it and rake the coin tray of a machine and the console of a parked car - about $<<= _crimeResult.take>> in change and small stuff, and the satisfying crunch of somebody's bad day. Petty, loud, barely worth it. But it felt like something.</p></div>
<div class="btn padding-top"><<button "Walk off">>
<<set _crimeNow = $policeCrimeAuthority>>
<<set _crimeCleanNow = passage() is "Crime_Vandalism" and $player.info.currentLocation is "SR_SkidRow" and _crimeNow and _crimeNow.source is "result" and _crimeNow.crime is "vandalism" and _crimeNow.passage is "Crime_Vandalism" and _crimeNow.location is "SR_SkidRow" and _crimeNow.detected is false and Number.isFinite(_crimeNow.take) and _crimeNow.resolvedDay is getCurrentAbsoluteDay() and (_crimeNow.day is _crimeNow.resolvedDay or _crimeNow.day is (_crimeNow.resolvedDay - 1))>>
<<if _crimeCleanNow>><<unset $policeCrimeAuthority>><<LeaveInteractionSettings>><<goto _crimeNow.location>><<else>><<if _crimeNow and _crimeNow.crime is "vandalism" and _crimeNow.passage is "Crime_Vandalism">><<unset $policeCrimeAuthority>><</if>><<LeaveInteractionSettings>><<goto $player.info.currentLocation>><</if>>
<</button>></div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _crimeEligible = $player.info.currentLocation is "RedLightDistrict" and ($dateTime.hours gte 18 or $dateTime.hours lt 5) and CheckContentFilter('Male', $player)>>
<<PreparePoliceCrime "solicitation" "Crime_Solicit" "RedLightDistrict" _crimeEligible>>
<<if not _crimeAuthorityValid>>
<<goto $player.info.currentLocation>>
<<elseif _crimeResult.source is "caught-choice">>
<<LockSettings>>
<div class="centre-text">Vice</div>
<div class="chat-container"><p class="text">The car that slows for you has two men in it and a radio under the dash, and the moment you name a price the badge comes out. A sting, and you walked right into the open door of it.</p></div>
<div class="btn padding-top"><<button "Face the music">>
<<set _crimeNow = $policeCrimeAuthority>>
<<set _crimeEligibleNow = $player.info.currentLocation is "RedLightDistrict" and ($dateTime.hours gte 18 or $dateTime.hours lt 5) and CheckContentFilter('Male', $player)>>
<<set _crimeCaughtNow = _crimeEligibleNow and passage() is "Crime_Solicit" and _crimeNow and _crimeNow.source is "caught-choice" and _crimeNow.crime is "solicitation" and _crimeNow.passage is "Crime_Solicit" and _crimeNow.day is getCurrentAbsoluteDay() and _crimeNow.location is "RedLightDistrict" and _crimeNow.detected is true>>
<<if _crimeCaughtNow>><<unset $policeCrimeAuthority>><<set $policeStopCrime = "solicitation">><<set $policeReturnPassage = _crimeNow.location>><<goto "Police_Stop">><<else>><<if _crimeNow and _crimeNow.crime is "solicitation" and _crimeNow.passage is "Crime_Solicit">><<unset $policeCrimeAuthority>><</if>><<LeaveInteractionSettings>><<goto $player.info.currentLocation>><</if>>
<</button>></div>
<<else>>
<div class="centre-text">A quick date</div>
<div class="chat-container"><p class="text">A car slows, a window rolls down, a price is named and met. Fifteen minutes in the dark of his front seat with your lips around a stranger's cock, jacking what you cannot swallow until he grunts and cums, and about $<<= _crimeResult.take>> for it - cash in hand and no cut to anyone. You spit into the gutter and straighten up. The stroll pays quick and it pays ugly.</p></div>
<div class="btn padding-top"><<button "Back to the corner">>
<<set _crimeNow = $policeCrimeAuthority>>
<<set _crimeCleanNow = passage() is "Crime_Solicit" and $player.info.currentLocation is "RedLightDistrict" and CheckContentFilter('Male', $player) and _crimeNow and _crimeNow.source is "result" and _crimeNow.crime is "solicitation" and _crimeNow.passage is "Crime_Solicit" and _crimeNow.location is "RedLightDistrict" and _crimeNow.detected is false and Number.isFinite(_crimeNow.take) and _crimeNow.resolvedDay is getCurrentAbsoluteDay() and (_crimeNow.day is _crimeNow.resolvedDay or _crimeNow.day is (_crimeNow.resolvedDay - 1))>>
<<if _crimeCleanNow>><<unset $policeCrimeAuthority>><<LeaveInteractionSettings>><<goto _crimeNow.location>><<else>><<if _crimeNow and _crimeNow.crime is "solicitation" and _crimeNow.passage is "Crime_Solicit">><<unset $policeCrimeAuthority>><</if>><<LeaveInteractionSettings>><<goto $player.info.currentLocation>><</if>>
<</button>></div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
/* Pool of work-shift events. Gender decides what can fire: the flirty regular is
gender-neutral (she does the showing off), the rest are written for a girl/trans
body per the scene descriptions. */
<<set _pool = ["Diner_Event_FlirtyCustomer"]>>
/* The hookup client is always male - honor the player×male content filter. */
<<if CheckContentFilter('Male')>>
<<run _pool.push("Diner_Event_HookupClient")>>
<</if>>
<<if $player.gender() == "Female" || $player.gender() == "Shemale">>
<<run _pool.push("Diner_Event_RudeCustomer", "Diner_Event_CounterService", "Diner_Event_Boss")>>
<</if>>
<<set _pick = _pool[Random(0, _pool.length - 1)]>>
<<include _pick>>
<</nobr>>
/* ============================================================
FLIRTY CUSTOMER (any gender) -> flirt, flash_boobs
============================================================ */<<nobr>>
<<set $npcType = Random(1,2)>>
<<if $npcType == 1>>
<<set $npc = {name:'Regular', gender:'Female', photo:'Media\\Characters\\QuestChars\\Other\\Unknown.jpg', type:'dominant'}>>
<<else>>
<<set $npc = {name:'Regular', gender:'Female', photo:'Media\\Characters\\QuestChars\\Other\\Unknown.jpg', type:'submissive'}>>
<</if>>
<<ChatMessage 'A regular in the corner booth keeps catching your eye over the rim of her milkshake, biting the straw and letting her gaze crawl down your body like she\'s already picturing you out of that uniform.'>>
<<Video "Media\\Events\\Diner Events\\flirt-diner.webm">>
<<set _msg = ($npc.type == 'dominant' ? 'Come here, cutie. I didn\'t order dessert, but I think I just found it. Bet I could make you blush harder than that apron is red.' : 'Hi... sorry, I keep staring, I know. You\'re just really, really pretty and I can\'t help myself.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<div class="npc-event-actions">
<div class="btn"><<button "Flirt back" "Diner_Flirty_Flash">><</button>></div>
<div class="btn"><<button "Stay professional" "Diner_Flirty_Pro">><</button>></div>
</div>
<</nobr>><<nobr>>
<<Chat $player 'Dessert, huh? *You lean in over her table, voice dropping low.* Careful what you flash around in here, sweetheart, or I might just flash something back.'>>
<<set _msg = ($npc.type == 'dominant' ? 'Oh, you want a show? *She glances at the door, then peels the front of her top down and lets her bare tits spill out right there in the booth.* Your move now, gorgeous.' : 'O-okay, you asked for it... *She bites her lip and tugs her top down, baring her tits for you with a shy little grin.*')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Video "Media\\Events\\Diner Events\\flash_boobs-diner.webm">>
<<set _randomValueChange = Random(1,3)>>
<<SetCharProgression $player "corruption" _randomValueChange true>>
<<SpendEnergy $player 5>>
<<set $player.money += 15>>
<<ChatMessage 'She stuffs a 15 tip into your apron for the eyeful, winking as she covers back up.'>>
<<set _salary = Random(70,200)>>
<<set $player.money += _salary>>
<<set _salaryMSG = 'You got your daily salary of ' + _salary + '.'>>
<<ChatMessage _salaryMSG>>
<div class="npc-event-actions">
<div class="btn"><<button "Continue" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
</div>
<</nobr>><<nobr>>
<<Chat $player 'You flash her a warm smile and a wink, but keep moving - you\'re on the clock. Maybe next time, gorgeous. Enjoy your shake.'>>
<<set _msg = ($npc.type == 'dominant' ? 'Mmm, playing hard to get. I respect it. I\'ll be back, and I\'ll wear something lower.' : 'Oh-okay! Sorry again. I\'ll, um, leave you a good tip. Promise.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<SpendEnergy $player 5>>
<<set $player.money += 5>>
<<ChatMessage 'She leaves a flustered little 5 tip on her way out.'>>
<<set _salary = Random(70,200)>>
<<set $player.money += _salary>>
<<set _salaryMSG = 'You got your daily salary of ' + _salary + '.'>>
<<ChatMessage _salaryMSG>>
<div class="npc-event-actions">
<div class="btn"><<button "Continue" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
</div>
<</nobr>>
/* ============================================================
RUDE CUSTOMER (girl/trans body) -> kiss, handjob
============================================================ */<<nobr>>
<<set $npcType = Random(1,2)>>
<<if $npcType == 1>>
<<set $npc = {name:'Customer', gender:'Male', photo:'Media\\Characters\\QuestChars\\Other\\Unknown.jpg', type:'dominant'}>>
<<else>>
<<set $npc = {name:'Customer', gender:'Male', photo:'Media\\Characters\\QuestChars\\Other\\Unknown.jpg', type:'submissive'}>>
<</if>>
<<ChatMessage 'A big guy at the counter shoves his plate away, jaw tight, and clamps a heavy hand around your wrist before you can clear it. His grip is hot and his eyes drag straight to your mouth.'>>
<<set _msg = ($npc.type == 'dominant' ? 'This food is cold garbage and my whole night\'s ruined. So you\'re gonna make it up to me, sweetheart, one way or another. Don\'t test me.' : 'Look, the order\'s all wrong and I\'m pissed... but, fuck, you\'re gorgeous. Maybe there\'s some way you could, uh, make it better?')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<div class="npc-event-actions">
<div class="btn"><<button "Smooth it over" "Diner_Rude_Smooth">><</button>></div>
<<if $player.attributes.corruption.value >= 2>>
<div class="btn"><<button "Kiss him quiet" "Diner_Rude_Kiss">><</button>></div>
<<else>>
<div class="btn non-interacting" id='rude-kiss'><<button "Kiss him quiet">><</button>></div>
<<done>>
<<run addHoverTooltip('rude-kiss', 'Requires corruption level 2 or higher')>>
<</done>>
<</if>>
<<if $player.attributes.corruption.value >= 3>>
<div class="btn"><<button "Jerk him off" "Diner_Rude_Handjob">><</button>></div>
<<else>>
<div class="btn non-interacting" id='rude-handjob'><<button "Jerk him off">><</button>></div>
<<done>>
<<run addHoverTooltip('rude-handjob', 'Requires corruption level 3 or higher')>>
<</done>>
<</if>>
<<if $player.attributes.dominance.value >= 2>>
<div class="btn"><<button "Throw him out" "Diner_Rude_Dominate">><</button>></div>
<<else>>
<div class="btn non-interacting" id='rude-dom'><<button "Throw him out">><</button>></div>
<<done>>
<<run addHoverTooltip('rude-dom', 'Requires dominance level 2 or higher')>>
<</done>>
<</if>>
</div>
<</nobr>><<nobr>>
<<Chat $player 'Easy, big guy. *You twist your wrist free and flash your sweetest smile.* Let me comp that meal and bring you a fresh one, hot off the grill. On the house. We good?'>>
<<set _msg = ($npc.type == 'dominant' ? 'Tch. Fine. Lucky you\'re cute. Bring it fast.' : 'Yeah... yeah, okay. Sorry I snapped. Thanks, doll.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<SpendEnergy $player 10>>
<<set $player.money -= 10>>
<<ChatMessage 'Comping his meal cost you 10, but he leaves calm.'>>
<<set _salary = Random(70,200)>>
<<set $player.money += _salary>>
<<set _salaryMSG = 'You got your daily salary of ' + _salary + '.'>>
<<ChatMessage _salaryMSG>>
<div class="npc-event-actions">
<div class="btn"><<button "Continue" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
</div>
<</nobr>><<nobr>>
<<Chat $player 'Shut that mouth of yours for a second. *You grab his collar and crush your lips to his, swallowing his complaints whole.*'>>
<<Video "Media\\Events\\Diner Events\\kiss-diner.webm">>
<<set _msg = ($npc.type == 'dominant' ? '*He kisses back hungrily, big hand sliding up to wrap around your throat, squeezing just enough to make your head swim.* Yeah... that\'s more like it.' : '*He melts into you with a groan, fingers curling loosely at your neck like he can\'t believe his luck.* Fuck... okay, all is forgiven.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<set _randomValueChange = Random(1,3)>>
<<SetCharProgression $player "corruption" _randomValueChange true>>
<<SpendEnergy $player 10>>
<<set $player.money += 20>>
<<ChatMessage 'He slaps a 20 on the counter, grinning like an idiot.'>>
<<set _salary = Random(70,200)>>
<<set $player.money += _salary>>
<<set _salaryMSG = 'You got your daily salary of ' + _salary + '.'>>
<<ChatMessage _salaryMSG>>
<div class="npc-event-actions">
<div class="btn"><<button "Continue" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
</div>
<</nobr>><<nobr>>
<<Chat $player 'Fine. You want service with a smile? *You duck under the counter, free his cock, and start stroking him slow and tight until his attitude evaporates.*'>>
<<Video "Media\\Events\\Diner Events\\handjob-diner.webm">>
<<set _msg = ($npc.type == 'dominant' ? '*He hauls you up off your knees by the throat, never letting you stop pumping his shaft.* Keep going. Don\'t you dare stop, sweetheart.' : '*He whimpers, hips bucking into your fist as you rise, his hand fluttering at your neck.* Oh god, just like that, please...')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<set _randomValueChange = Random(3,7)>>
<<SetCharProgression $player "corruption" _randomValueChange true>>
<<SpendEnergy $player 15>>
<<set $player.money += 35>>
<<ChatMessage 'He stuffs 35 down your apron, all complaints forgotten.'>>
<<set _salary = Random(70,200)>>
<<set $player.money += _salary>>
<<set _salaryMSG = 'You got your daily salary of ' + _salary + '.'>>
<<ChatMessage _salaryMSG>>
<div class="npc-event-actions">
<div class="btn"><<button "Continue" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
</div>
<</nobr>><<nobr>>
<<Chat $player 'Let go of me. *Your voice cuts like ice as you peel his fingers off your wrist.* Cold food gets a refund, not a free grope. Touch me again and you\'re eating concrete out front. Move.'>>
<<set _msg = ($npc.type == 'dominant' ? 'Tch. Whatever. Frigid bitch. *He throws down cash and storms out.*' : 'Okay, okay! Christ, I\'m going, I\'m sorry!')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<SpendEnergy $player 10>>
<<set _salary = Random(70,200)>>
<<set $player.money += _salary>>
<<set _salaryMSG = 'You got your daily salary of ' + _salary + '.'>>
<<ChatMessage _salaryMSG>>
<div class="npc-event-actions">
<div class="btn"><<button "Continue" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
</div>
<</nobr>>
/* ============================================================
COUNTER SERVICE (girl/trans body) -> blowjob(facial), spank_ass
============================================================ */<<nobr>>
<<set $npcType = Random(1,2)>>
<<if $npcType == 1>>
<<set $npc = {name:'Customer', gender:'Male', photo:'Media\\Characters\\QuestChars\\Other\\Unknown.jpg', type:'dominant'}>>
<<else>>
<<set $npc = {name:'Customer', gender:'Male', photo:'Media\\Characters\\QuestChars\\Other\\Unknown.jpg', type:'submissive'}>>
<</if>>
<<ChatMessage 'A sharp-dressed customer waves you to the empty end of the counter and slides a thick fold of bills under his napkin, tapping it twice. The diner\'s dead this hour, and his meaning couldn\'t be clearer.'>>
<<set _msg = ($npc.type == 'dominant' ? 'Forget the coffee. There\'s a hundred under that napkin and more where it came from, if you\'re the kind of girl who gives a little extra service in the back.' : 'I, um... I left you a really big tip. No pressure at all, but if you wanted to do something... extra... I\'d be very grateful.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<div class="npc-event-actions">
<div class="btn"><<button "Refuse" "Diner_Service_Refuse">><</button>></div>
<<if $player.attributes.corruption.value >= 3>>
<div class="btn"><<button "Drop to your knees" "Diner_Service_Blowjob">><</button>></div>
<<else>>
<div class="btn non-interacting" id='service-blowjob'><<button "Drop to your knees">><</button>></div>
<<done>>
<<run addHoverTooltip('service-blowjob', 'Requires corruption level 3 or higher')>>
<</done>>
<</if>>
<<if $player.attributes.corruption.value >= 3>>
<div class="btn"><<button "Bend over the counter" "Diner_Service_Spank">><</button>></div>
<<else>>
<div class="btn non-interacting" id='service-spank'><<button "Bend over the counter">><</button>></div>
<<done>>
<<run addHoverTooltip('service-spank', 'Requires corruption level 3 or higher')>>
<</done>>
<</if>>
<<if $player.attributes.dominance.value >= 2>>
<div class="btn"><<button "Shut it down" "Diner_Service_Dominate">><</button>></div>
<<else>>
<div class="btn non-interacting" id='service-dom'><<button "Shut it down">><</button>></div>
<<done>>
<<run addHoverTooltip('service-dom', 'Requires dominance level 2 or higher')>>
<</done>>
<</if>>
</div>
<</nobr>><<nobr>>
<<Chat $player 'Keep your money, slick. *You slide the napkin back across the counter.* This is a diner, not a back-alley special. Coffee\'s a buck fifty. Take it or leave it.'>>
<<set _msg = ($npc.type == 'dominant' ? 'Heh. Can\'t blame a man for trying. Your loss, doll.' : 'Right, of course, I\'m so sorry, that was out of line...')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<SpendEnergy $player 5>>
<<set _salary = Random(70,200)>>
<<set $player.money += _salary>>
<<set _salaryMSG = 'You got your daily salary of ' + _salary + '.'>>
<<ChatMessage _salaryMSG>>
<div class="npc-event-actions">
<div class="btn"><<button "Continue" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
</div>
<</nobr>><<nobr>>
<<Chat $player 'For a hundred? *You palm the fold and pull him into the back booth, then sink to your knees.* Sit back and shut up, big spender. *You take him down to the root.*'>>
<<Video "Media\\Events\\Diner Events\\creampie_mouth_facial-diner.webm">>
<<set _msg = ($npc.type == 'dominant' ? 'Fuck, that mouth\'s worth every cent. Take it all, don\'t waste a drop. *He fists your hair and finishes across your tongue and cheeks.*' : 'Oh god, oh god, I\'m gonna- *He spills hot over your lips and chin with a strangled moan, knees shaking.*')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<set _randomValueChange = Random(3,7)>>
<<SetCharProgression $player "corruption" _randomValueChange true>>
<<SpendEnergy $player 15>>
<<set $player.money += 100>>
<<ChatMessage 'You pocket the full hundred for the back-booth special, wiping your chin clean.'>>
<<set _salary = Random(70,200)>>
<<set $player.money += _salary>>
<<set _salaryMSG = 'You got your daily salary of ' + _salary + '.'>>
<<ChatMessage _salaryMSG>>
<div class="npc-event-actions">
<div class="btn"><<button "Continue" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
</div>
<</nobr>><<nobr>>
<<Chat $player 'A hundred buys you five minutes, hands included. *You take the money, then let him steer you to the back table, where he bends you over it, flips your skirt up and drags your panties down.*'>>
<<Video "Media\\Events\\Diner Events\\spank_ass-diner.webm">>
<<set _msg = ($npc.type == 'dominant' ? '*His palm cracks across your bare ass, again and again, until the cheeks glow red and you\'re gasping over the table.* That\'s a good girl. Take it.' : '*He smooths a shy hand over your bare cheeks before each careful, stinging smack.* You\'re unbelievable... thank you, thank you...')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<set _randomValueChange = Random(3,7)>>
<<SetCharProgression $player "corruption" _randomValueChange true>>
<<SpendEnergy $player 12>>
<<set $player.money += 100>>
<<ChatMessage 'You straighten your skirt and pocket the hundred, ass still stinging.'>>
<<set _salary = Random(70,200)>>
<<set $player.money += _salary>>
<<set _salaryMSG = 'You got your daily salary of ' + _salary + '.'>>
<<ChatMessage _salaryMSG>>
<div class="npc-event-actions">
<div class="btn"><<button "Continue" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
</div>
<</nobr>><<nobr>>
<<Chat $player 'Cute. *You snatch the napkin, pull the cash, and tuck it into your own apron.* I\'ll keep this for the insult. Now order something or get the hell off my counter before I have you tossed.'>>
<<set _msg = ($npc.type == 'dominant' ? 'Ha! You\'ve got nerve, I\'ll give you that. Fine, fine. Coffee. Black.' : 'I- yes, of course, keep it, I\'m sorry, just one coffee please...')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<SpendEnergy $player 8>>
<<set $player.money += 50>>
<<ChatMessage 'You kept 50 of his "tip" out of pure spite.'>>
<<set _salary = Random(70,200)>>
<<set $player.money += _salary>>
<<set _salaryMSG = 'You got your daily salary of ' + _salary + '.'>>
<<ChatMessage _salaryMSG>>
<div class="npc-event-actions">
<div class="btn"><<button "Continue" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
</div>
<</nobr>>
/* ============================================================
BOSS (girl/trans body; full sex Female-only -> vaginal clips)
-> blowjob, fuck_pussy, creampie_pussy
============================================================ */<<nobr>>
<<set $npcType = Random(1,2)>>
<<if $npcType == 1>>
<<set $npc = {name:'Boss', gender:'Male', photo:'Media\\Characters\\QuestChars\\Other\\Unknown.jpg', type:'dominant'}>>
<<else>>
<<set $npc = {name:'Boss', gender:'Male', photo:'Media\\Characters\\QuestChars\\Other\\Unknown.jpg', type:'submissive'}>>
<</if>>
<<ChatMessage 'Your boss leans in the office doorway and crooks a finger at you, eyes sliding all over your uniform. He waits until the last cook clocks out, then pulls the blinds.'>>
<<set _msg = ($npc.type == 'dominant' ? 'You\'ve been a very good girl this month. Good girls get bonuses. Get in here and earn it - and we both know how.' : 'So, uh, payroll\'s got some wiggle room... if you wanted to be a little friendly, I could make it very worth your while. No pressure.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<div class="npc-event-actions">
<div class="btn"><<button "Refuse" "Diner_Boss_Refuse">><</button>></div>
<<if $player.attributes.corruption.value >= 2>>
<div class="btn"><<button "Blow the boss" "Diner_Boss_Blowjob">><</button>></div>
<<else>>
<div class="btn non-interacting" id='boss-blowjob'><<button "Blow the boss">><</button>></div>
<<done>>
<<run addHoverTooltip('boss-blowjob', 'Requires corruption level 2 or higher')>>
<</done>>
<</if>>
<<if $player.gender() == "Female" && $player.attributes.corruption.value >= 4>>
<div class="btn"><<button "Let him have you" "Diner_Boss_Sex">><</button>></div>
<<else>>
<div class="btn non-interacting" id='boss-sex'><<button "Let him have you">><</button>></div>
<<done>>
<<run addHoverTooltip('boss-sex', ($player.gender() != "Female" ? 'Only available for a female body' : 'Requires corruption level 4 or higher'))>>
<</done>>
<</if>>
<<if $player.attributes.dominance.value >= 2>>
<div class="btn"><<button "Shut him down" "Diner_Boss_Dominate">><</button>></div>
<<else>>
<div class="btn non-interacting" id='boss-dom'><<button "Shut him down">><</button>></div>
<<done>>
<<run addHoverTooltip('boss-dom', 'Requires dominance level 2 or higher')>>
<</done>>
<</if>>
</div>
<</nobr>><<nobr>>
<<Chat $player 'Hard pass, boss. *You step back and fold your arms.* My paycheck\'s for slinging plates, not for whatever this is. Keep it professional or keep it to yourself.'>>
<<set _msg = ($npc.type == 'dominant' ? 'Heh. Frigid. The offer stands, sweetheart. You\'ll warm up eventually.' : 'No, you\'re right, that was inappropriate, forget I said anything, please...')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<SpendEnergy $player 5>>
<<set _salary = Random(70,200)>>
<<set $player.money += _salary>>
<<set _salaryMSG = 'You got your daily salary of ' + _salary + '.'>>
<<ChatMessage _salaryMSG>>
<div class="npc-event-actions">
<div class="btn"><<button "Continue" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
</div>
<</nobr>><<nobr>>
<<Chat $player 'A bonus is a bonus. *You lock the office door, drop to your knees between his legs, and free him from his slacks.* Sit back, boss. *You wrap your lips around him and start working.*'>>
<<Video "Media\\Events\\Diner Events\\blowjob-diner.webm">>
<<set _msg = ($npc.type == 'dominant' ? 'Goddamn, that\'s what I\'m paying for. Deeper. Choke on it and the bonus doubles. *He fists your hair and rocks into your throat.*' : 'Oh- oh fuck, your mouth, I- you\'re so good at this, don\'t stop, please...')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<set _randomValueChange = Random(3,7)>>
<<SetCharProgression $player "corruption" _randomValueChange true>>
<<SpendEnergy $player 15>>
<<set $player.money += 60>>
<<ChatMessage 'He signs off a fat 60 bonus, breathless and grinning.'>>
<<set _salary = Random(70,200)>>
<<set $player.money += _salary>>
<<set _salaryMSG = 'You got your daily salary of ' + _salary + '.'>>
<<ChatMessage _salaryMSG>>
<div class="npc-event-actions">
<div class="btn"><<button "Continue" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
</div>
<</nobr>><<nobr>>
<<Chat $player 'Then earn me, boss. *You hike your skirt, peel off your panties, and bend over his desk, looking back over your shoulder.* That bonus better be huge.'>>
<<Video "Media\\Events\\Diner Events\\fuck_pussy-diner.webm">>
<<set _msg = ($npc.type == 'dominant' ? 'Look at you, already dripping. *He drives into your pussy in one thrust and sets a brutal pace.* This sweet cunt is the best employee I\'ve got.' : 'You\'re so warm, oh fuck... *He sinks into you with a shudder, hips stuttering as he tries to last.*')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<set _randomValueChange = Random(5,10)>>
<<SetCharProgression $player "corruption" _randomValueChange true>>
<div class="npc-event-actions">
<div class="btn"><<button "Let him finish" "Diner_Boss_Creampie">><</button>></div>
</div>
<</nobr>><<nobr>>
<<Chat $player 'Do it inside, boss. *You grind back against him, clenching tight.* Fill me up and make that bonus count.'>>
<<Video "Media\\Events\\Diner Events\\creampie_pussy-diner.webm">>
<<set _msg = ($npc.type == 'dominant' ? 'Take it-take all of it. *He buries himself to the hilt and floods you, holding you down on his cock until the last twitch.* Good girl.' : 'I\'m- I\'m cumming, oh god- *He spills deep inside you with a broken groan, clutching your hips.*')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<set _randomValueChange = Random(3,7)>>
<<SetCharProgression $player "corruption" _randomValueChange true>>
<<SpendEnergy $player 20>>
<<set $player.money += 120>>
<<ChatMessage 'You feel him drip down your thigh as he peels off a 120 bonus, true to his word.'>>
<<set _salary = Random(70,200)>>
<<set $player.money += _salary>>
<<set _salaryMSG = 'You got your daily salary of ' + _salary + '.'>>
<<ChatMessage _salaryMSG>>
<div class="npc-event-actions">
<div class="btn"><<button "Continue" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
</div>
<</nobr>><<nobr>>
<<Chat $player 'Cute speech, boss. *You plant a hand on the desk and lean into his space until he leans back.* Here\'s the new deal: that bonus is mine, the blinds stay open, and you keep your hands to yourself. Or HR gets a very detailed letter. Nod if we understand each other.'>>
<<set _msg = ($npc.type == 'dominant' ? 'Tch... you\'re lucky you\'re good at your job. Fine. We never spoke.' : 'Y-yes! Yes, absolutely, the bonus is yours, please don\'t report me...')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<SpendEnergy $player 10>>
<<set $player.money += 80>>
<<ChatMessage 'You strong-armed an 80 bonus out of him on principle.'>>
<<set _salary = Random(70,200)>>
<<set $player.money += _salary>>
<<set _salaryMSG = 'You got your daily salary of ' + _salary + '.'>>
<<ChatMessage _salaryMSG>>
<div class="npc-event-actions">
<div class="btn"><<button "Continue" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
</div>
<</nobr>>
/* ============================================================
HOOKUP CLIENT (any gender) -> a paying customer wants to take
you out back. With high enough corruption you can go through with
it, which launches the REAL sex system with a freshly-created male
NPC in the active role (player passive). The NPC is deleted after
the scene via SexSystem_CheckSexType ($sexType == "dinerHookup").
============================================================ */<<nobr>>
<<set $npc = {name:'Customer', gender:'Male', photo:'Media\\Characters\\QuestChars\\Other\\Unknown.jpg', type:'dominant'}>>
<<ChatMessage 'A man at the end of the counter has been nursing the same cup of coffee for an hour, eyes tracking you the whole shift. When the place finally empties out, he lays down a thick fold of bills and tips his head toward the dark back hallway.'>>
<<ChatWithoutNPC $npc.name $npc.photo 'No games, no small talk. You\'re the prettiest thing in this dump and I\'ve got cash and a free hour. Come out back and let me have you. You won\'t regret it.'>>
<div class="npc-event-actions">
<div class="btn"><<button "Turn him down" "Diner_Hookup_Refuse">><</button>></div>
<<if $player.attributes.corruption.value >= 5>>
<div class="btn"><<button "Slip into the back with him" "Diner_Hookup_Start">><</button>></div>
<<else>>
<div class="btn non-interacting" id='hookup-go'><<button "Slip into the back with him">><</button>></div>
<<done>>
<<run addHoverTooltip('hookup-go', 'Requires corruption level 5 or higher')>>
<</done>>
<</if>>
</div>
<</nobr>><<nobr>>
<<Chat $player 'Not a chance, slick. *You slide his money back across the counter.* I sling plates here, nothing else. Drink your coffee or hit the road.'>>
<<ChatWithoutNPC $npc.name $npc.photo 'Heh. Can\'t blame a man for asking. Your loss, gorgeous.'>>
<<SpendEnergy $player 5>>
<<set _salary = Random(70,200)>>
<<set $player.money += _salary>>
<<set _salaryMSG = 'You got your daily salary of ' + _salary + '.'>>
<<ChatMessage _salaryMSG>>
<div class="npc-event-actions">
<div class="btn"><<button "Continue" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
</div>
<</nobr>><<nobr>>
/* Create the disposable male client and hand off to the real sex system. */
<<include "CharactersData">>
<<run _client = CreateCharacter({
isPlayer: false,
characterWork: "Citizen",
gender: "Male",
sexualPreference: "Bi",
age: Random(20, 45),
lust: 10,
}, true)>>
<<set $indexNPC = $Characters.indexOf(_client)>>
<<set $interactionNpc = $Characters[$indexNPC]>>
<<unset $maleNames $femaleNames $surnames>>
/* Pay + shift salary up front, since the sex flow returns straight to the diner. */
<<set _pay = Random(80, 160)>>
<<set $player.money += _pay>>
<<set _corr = Random(4,8)>>
<<SetCharProgression $player "corruption" _corr true>>
<<SpendEnergy $player 10>>
<<set _salary = Random(70,200)>>
<<set $player.money += _salary>>
<<set _payMsg = "He presses " + _pay + " into your hand up front, plus your " + _salary + " shift pay waiting in the register, and pulls you into the dark of the back hallway.">>
<<ChatMessage _payMsg>>
/* Player passive, NPC active. dinerHookup bypasses consent and deletes the NPC on exit. */
<<set $sexType = "dinerHookup">>
<<set $passiveSex = true>>
<<set $playerDom = false>>
<div class="npc-event-actions">
<div class="btn"><<button "Let him have you" "PassiveSex">><</button>></div>
</div>
<</nobr>><<widget "LocationEvents">>
<<if CanTriggerNpcInitiatedEvent($player, $dateTime)>>
<<if $player.info.reputation.pornActer.value > 70 && Random(0,100) > 70
&& $player.info.currentLocation != "CollegeHall" && $player.info.currentLocation != "Auditorium"
&& $player.info.currentLocation != "WomensRestroom" && $player.info.currentLocation != "MensRestroom">>
<<SetSaveBtn false>>
<<run MarkNpcInitiatedEventTriggered($player, $dateTime)>>
<<set $interactType = "PornoFanatCome">>
<<goto "LocationEvent">>
<<else>>
<<run _locationKeys = Object.keys($Locations);>>
<<if _locationKeys.includes(passage())>>
<<set _chars = []>>
<<run _chars = $Locations[passage()].filter(
(id) => $Characters[id].info.characterWork != "Hooker"
&& $Characters[id].info.questInfo.isQuestCharacter == false && $Characters[id].info.characterWork != "Etheriant")>>
<<if _chars.length > 0>>
<<set $indexNPC = _chars[Math.floor(Math.random() * _chars.length)]>>
<<set $interactionNpc = $Characters[$indexNPC]>>
<<run _contentAllow = CheckContentFilter($interactionNpc)>>
<<if (_contentAllow == true)>>
<<run MarkNpcInitiatedEventTriggered($player, $dateTime)>>
<<goto "EventChoose">>
<</if>>
<</if>>
<</if>>
<</if>>
<</if>>
<</widget>><<widget "PimpBrothelEvents">>
<<if CanTriggerNpcInitiatedEvent($player, $dateTime)>>
<<if $player.info.currentLocation != "PimpRoom">>
<<run _locationKeys = Object.keys($Locations);>>
<<if _locationKeys.includes(passage()) && passage() != "PimpRoom">>
<<run _EventCharsID = $Locations[passage()]>>
<<if _EventCharsID.length > 0>>
<<run _EventCharsID = getRandomElements(_EventCharsID, _EventCharsID.length)>>
<<set _RandEvent = Random(0, 100, false)>>
<<if _RandEvent >= 0 && _RandEvent < 50>>
<<run $brothelSecurityChar = _EventCharsID.filter(
(id) => $Characters[id].dailyEvents.isEventRegistered($Characters[id].info.id, "FuckOtherWhore") == false &&
$Characters[id].info.characterWork == "Brothel Security" && CheckContentFilter($Characters[id]))>>
<<run $brothelWhoreChar = _EventCharsID.filter(
(id) => $Characters[id].info.characterWork == "Pimp's whore")>>
<<if $brothelSecurityChar.length > 0 && $brothelWhoreChar.length > 0>>
<<set $brothelSecurityChar = $brothelSecurityChar[0]>>
<<set $brothelWhoreChar = $brothelWhoreChar[0]>>
<<SetSaveBtn false>>
<<run MarkNpcInitiatedEventTriggered($player, $dateTime)>>
<<goto "PimpBrothelEventChoose_TwoCharacters_Pimp">>
<</if>>
<<elseif _RandEvent >= 50>>
<<run $brothelSecurityChar = _EventCharsID.filter(
(id) => $Characters[id].dailyEvents.isEventRegistered($Characters[id].info.id, "FuckPlayer") == false &&
$Characters[id].info.characterWork== "Brothel Security" && CheckContentFilter($Characters[id]))>>
<<if $brothelSecurityChar.length > 0>>
<<set $brothelSecurityChar = $brothelSecurityChar[0]>>
<<SetSaveBtn false>>
<<run MarkNpcInitiatedEventTriggered($player, $dateTime)>>
<<goto "PimpBrothelEventChoose_GuardFuck_Pimp">>
<</if>>
<</if>>
<</if>>
<</if>>
<</if>>
<</if>>
<</widget>><<nobr>>
<<include "UpdateAll">>
<<SetBackground>>
<<if $Characters[$brothelSecurityChar].dailyEvents.isEventRegistered($Characters[$brothelSecurityChar].info.id, "FuckOtherWhore") == false>>
<<run $Characters[$brothelSecurityChar].dailyEvents.registerEvent($Characters[$brothelSecurityChar].info.id, "FuckOtherWhore", 1)>>
<</if>>
<<set _pos = ["Anal", "Blowjob", "Vaginal"].random()>>
<<if $Characters[$brothelWhoreChar].genitalia() == "Penis" && _pos == "Vaginal">>
<<set _pos = "Anal">>
<</if>>
<<switch _pos>>
<<case "Anal">>
<<SetAnalPick $Characters[$brothelSecurityChar].gender() $Characters[$brothelWhoreChar].gender()>>
<<case "Blowjob">>
<<SetOralPick $Characters[$brothelSecurityChar].gender() $Characters[$brothelWhoreChar].gender()>>
<<case "Vaginal">>
<<SetVagPick $Characters[$brothelSecurityChar].gender() $Characters[$brothelWhoreChar].gender()>>
<</switch>>
<<Video _pick>>
<<ChatMessage 'You see the guard fucking one of the whores.'>>
<div class="padding-top">
<div class="btn"><<button "Leave" $player.info.currentLocation>><<unset $interactionNpc $indexNPC>><<SetSaveBtn true>><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground>>
<<if $Characters[$brothelSecurityChar].dailyEvents.isEventRegistered($Characters[$brothelSecurityChar].info.id, "FuckPlayer") == false>>
<<run $Characters[$brothelSecurityChar].dailyEvents.registerEvent($Characters[$brothelSecurityChar].info.id, "FuckPlayer", 1)>>
<</if>>
<<set $interactionNpc = $Characters[$brothelSecurityChar]>>
<<set $indexNPC = $brothelSecurityChar>>
<div class="npc-event-panel">
<<NpcEventHeader $interactionNpc>>
<<NpcEventDialogue $interactionNpc 'Hey whore, let\'s have some fun.'>>
<div class="npc-event-actions">
<div class="btn"><<button "Continue" "PassiveSex">><<set $sexType = "hookerWork">><<set $aggressiveFuck = true>><</button>></div>
</div>
</div><!-- /npc-event-panel -->
<</nobr>><<nobr>>
<<set $gameSettings.allowSaves = false>>
<<set $canShowStatsBtn = false>>
<<include "UpdateAll">>
<<set _friendship = $player.getRelationship($interactionNpc.info.id, false)?.metrics?.friendship ?? 0>>
<<set _love = $player.getRelationship($interactionNpc.info.id, false)?.metrics?.love ?? 0>>
<<set _fear = $player.getRelationship($interactionNpc.info.id, false)?.metrics?.fear ?? 0>>
<<if $player.characterEvents.isEventRegistered($interactionNpc.info.id, "knows you") == false>>
<<set $interactType = "Get acquainted">>
<<elseif _fear > 50>>
<<set $interactType = "Ran away in fear">>
<<else>>
<<set $interactType = "Ordinary">>
<<if _love >= 90 >>
<<set $interaction = ["Talk", "Hug", "Kiss", "Touch Ass", "Touch Boobs", "Sex"].random()>>
<<elseif _love >= 85>>
<<set $interaction = ["Talk", "Hug", "Kiss", "Touch Ass", "Touch Boobs"].random()>>
<<elseif _love >= 75>>
<<set $interaction = ["Talk", "Hug", "Kiss"].random()>>
<<elseif _friendship >= 65 || _love >= 60 >>
<<set $interaction = ["Talk", "Hug"].random()>>
<<else>>
<<set $interaction = "Talk">>
<</if>>
<<if ($interaction == "Touch Ass" || $interaction == "Touch Boobs" || $interaction == "Sex" || $interaction == "Kiss")
&& (($player.gender() == "Male" && $interactionNpc.info.sexualPreference == "Feminine")
|| $player.gender() != "Male" && $interactionNpc.info.sexualPreference == "Manly")>>
<<set $interaction = "Talk">>
<</if>>
<<if $player.gender() == "Male" && $interaction == "Touch Boobs">>
<<set $interaction = "Talk">>
<</if>>
<<if ($player.status.potency.value == $player.status.potency.min || $interactionNpc.status.potency.value == $interactionNpc.status.potency.min) && $interaction == "Sex">>
<<set $interaction = ["Talk", "Hug", "Kiss", "Touch Ass", "Touch Boobs"].random()>>
<</if>>
/* Respect content filter - replace sexual interactions if filter blocks this pairing */
<<if ($interaction == "Sex" || $interaction == "Touch Ass" || $interaction == "Touch Boobs" || $interaction == "Kiss") && CheckContentFilter($interactionNpc) == false>>
<<set $interaction = "Talk">>
<</if>>
<</if>>
<<goto "LocationEvent">>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if $interactType == "Ordinary">>
<div class="npc-event-panel">
<<NpcEventHeader $interactionNpc>>
<<if $FromInteraction != true>>
<<run $interactionNpc.dailyEvents.registerEvent($interactionNpc.info.id, "WalkEventDone", 1)>>
<</if>>
<<switch $interaction>>
<<case "Talk">>
<<set _msg = $interactionNpc.info.firstName + " wants to talk to you.">>
<<case "Hug">>
<<set _msg = $interactionNpc.info.firstName + " wants to hug you.">>
<<case "Kiss">>
<<set _msg = $interactionNpc.info.firstName + " wants to kiss you.">>
<<case "Touch Ass">>
<<set _msg = $interactionNpc.info.firstName + " wants to touch your ass.">>
<<case "Touch Boobs">>
<<set _msg = $interactionNpc.info.firstName + " wants to touch your tits">>
<<case "Sex">>
<<set _msg = $interactionNpc.info.firstName + " wants to have sex with you.">>
<</switch>>
<<NpcEventDialogue $interactionNpc _msg>>
<div class="npc-event-actions">
<div class="btn friendly"><<button "Accept" "LocationEventAction">><</button>></div>
<<if $FromInteraction == true>>
<div class="btn"><<button "Decline" "CharacterInteractions">><<unset $FromInteraction>><<unset $interaction $interactType>><</button>></div>
<<else>>
<div class="btn"><<button "Decline" $player.info.currentLocation>><<set $gameSettings.allowSaves = true>><<set $canShowStatsBtn = true>><<unset $indexNPC $interactionNpc $interaction $interactType>><</button>></div>
<</if>>
</div>
</div><!-- /npc-event-panel -->
<<elseif $interactType == "Ran away in fear">>
<div class="npc-event-panel">
<<NpcEventHeader $interactionNpc>>
<<set _scaredMsg = "Upon seeing you, " + $interactionNpc.info.firstName + " got scared and ran away.">>
<<NpcEventDialogue _scaredMsg>>
<div class="npc-event-actions">
<div class="btn"><<button "Continue" $player.info.currentLocation>>
<<run RandomRelocateCharacter($indexNPC)>>
<<set $gameSettings.allowSaves = true>><<set $canShowStatsBtn = true>><<unset $interactionType $interactionNpc $indexNPC $interaction $FromInteraction>>
<</button>></div>
</div>
</div><!-- /npc-event-panel -->
<<elseif $interactType == "Get acquainted">>
<div class="npc-event-panel">
<<NpcEventHeader $interactionNpc>>
<<set _introMsg = "Hi, I haven't seen you around here before. I'm " + $interactionNpc.info.firstName + ".">>
<<NpcEventDialogue $interactionNpc _introMsg>>
<div class="npc-event-actions">
<div class="btn friendly"><<button "Continue" $player.info.currentLocation>>
<<run $player.characterEvents.registerEvent($interactionNpc.info.id, "knows you", 1)>>
<<set $gameSettings.allowSaves = true>><<set $canShowStatsBtn = true>><<unset $interactionType $interactionNpc $indexNPC $interaction $FromInteraction>>
<</button>></div>
</div>
</div><!-- /npc-event-panel -->
<<elseif $interactType == "PornoFanatCome">>
<<include "CharactersData">>
<<run _testChar = CreateCharacter({
isPlayer: false,
characterWork: "external",
lust: 10,
gender: ["Male", "Female", "Trans"].random(),
sexualPreference: "Bi",
age: Random(18,45),
}, true)>>
<<set $indexNPC = $Characters.indexOf(_testChar)>>
<<set $interactionNpc = $Characters[$indexNPC]>>
<div class="npc-event-panel">
<<NpcEventHeader $interactionNpc>>
<<unset $maleNames $femaleNames $surnames $interactType>>
<<NpcEventDialogue $interactionNpc 'Hello, I recognize you, you act in porno'>>
<<NpcEventDialogue 'You notice that your fan is overly interested in you.'>>
<div class="npc-event-actions">
<<if $player.status.potency.value > $player.status.potency.min && $playerlock != true>>
<div class="btn"><<button "Sex with a fan (Passive)" "PassiveSex">><<set $sexType = "OneSex (Destroy)">><</button>></div>
<div class="btn"><<button "Sex with a fan (Active)" "Sex">><<set $sexType = "OneSex (Destroy)">><</button>></div>
<<elseif $player.status.potency.value > $player.status.potency.min && $playerlock == true>>
<div class="btn"><<button "Sex with a fan (Passive)" "PassiveSex">><<set $sexType = "OneSex (Destroy)">><</button>></div>
<div class="btn non-interacting"><<button "Sex with a fan (Active)" "Sex">><<set $sexType = "OneSex (Destroy)">><</button>></div>
<<else>>
<div class="btn non-interacting"><<button "Sex with a fan (Passive)" "PassiveSex">><<set $sexType = "OneSex (Destroy)">><</button>></div>
<div class="btn non-interacting"><<button "Sex with a fan (Active)" "Sex">><<set $sexType = "OneSex (Destroy)">><</button>></div>
<</if>>
<div class="btn"><<button "A polite goodbye" $player.info.currentLocation>>
<<SetSaveBtn true>>
<<run $Characters.splice($indexNPC, 1)>>
<</button>></div>
</div>
</div><!-- /npc-event-panel -->
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<div class="npc-event-panel">
<<NpcEventHeader $interactionNpc>>
<<if $player.status.energy.value < 5>>
<<goto "NotEnoughEnergy_Events">>
<</if>>
<<SpendTime 15>>
<<if $interactType == "Ordinary">>
<<switch $interaction>>
<<case "Talk">>
<<if $interactionNpc.dailyEvents.isEventRegistered($interactionNpc.info.id, "TalkEventDone") == false && $FromInteraction == true>>
<<run $interactionNpc.dailyEvents.registerEvent($interactionNpc.info.id, "TalkEventDone", 1)>>
<<set _relUpgrd = {friendship: Random(1, 2, true)}>>
<<SetRelations $player $interactionNpc _relUpgrd>>
<<elseif $FromInteraction != true>>
<<set _relUpgrd = {friendship: Random(1, 2, true)}>>
<<SetRelations $player $interactionNpc _relUpgrd>>
<</if>>
<<set _msg = "You are talking to " + $interactionNpc.info.firstName + " about various topics.">>
<<case "Hug">>
<<if $interactionNpc.dailyEvents.isEventRegistered($interactionNpc.info.id, "HugEventDone") == false && $FromInteraction == true>>
<<run $interactionNpc.dailyEvents.registerEvent($interactionNpc.info.id, "HugEventDone", 1)>>
<<set _relUpgrd = {friendship: Random(1, 3, true)}>>
<<SetRelations $player $interactionNpc _relUpgrd>>
<<elseif $FromInteraction != true>>
<<set _relUpgrd = {friendship: Random(1, 3, true)}>>
<<SetRelations $player $interactionNpc _relUpgrd>>
<</if>>
<<run _msg = "You and " + $interactionNpc.info.firstName + " are hugging">>
<<case "Kiss">>
<<if $interactionNpc.dailyEvents.isEventRegistered($interactionNpc.info.id, "KissEventDone") == false && $FromInteraction == true>>
<<run $interactionNpc.dailyEvents.registerEvent($interactionNpc.info.id, "KissEventDone", 1)>>
<<set _relUpgrd = {love: Random(1, 2, true)}>>
<<SetRelations $player $interactionNpc _relUpgrd>>
<<elseif $FromInteraction != true>>
<<set _relUpgrd = {love: Random(1, 2, true)}>>
<<SetRelations $player $interactionNpc _relUpgrd>>
<</if>>
<<set $interactionType = "Kiss">>
<<Interaction $interactionNpc $player>>
<<run _msg = "You and " + $interactionNpc.info.firstName + " are kissing">>
<<case "Touch Ass">>
<<if $interactionNpc.dailyEvents.isEventRegistered($interactionNpc.info.id, "TouchAssEventDone") == false && $FromInteraction == true>>
<<run $interactionNpc.dailyEvents.registerEvent($interactionNpc.info.id, "TouchAssEventDone", 1)>>
<<set _relUpgrd = {love: Random(1, 2, true)}>>
<<SetRelations $player $interactionNpc _relUpgrd>>
<<elseif $FromInteraction != true>>
<<set _relUpgrd = {love: Random(1, 2, true)}>>
<<SetRelations $player $interactionNpc _relUpgrd>>
<</if>>
<<set $interactionType = "Touch Ass">>
<<Interaction $interactionNpc $player>>
<<run _msg = $interactionNpc.info.firstName + " is touching your ass">>
<<case "Touch Boobs">>
<<if $interactionNpc.dailyEvents.isEventRegistered($interactionNpc.info.id, "TouchBoobsEventDone") == false && $FromInteraction == true>>
<<run $interactionNpc.dailyEvents.registerEvent($interactionNpc.info.id, "TouchBoobsEventDone", 1)>>
<<set _relUpgrd = {love: Random(1, 2, true)}>>
<<SetRelations $player $interactionNpc _relUpgrd>>
<<elseif $FromInteraction != true>>
<<set _relUpgrd = {love: Random(1, 2, true)}>>
<<SetRelations $player $interactionNpc _relUpgrd>>
<</if>>
<<set $interactionType = "Touch boobs">>
<<Interaction $interactionNpc $player>>
<<run _msg = $interactionNpc.info.firstName + " is touching your boobs">>
<<case "Sex">>
<<goto "Sex">>
<</switch>>
<<elseif $interactType == "Aggressive">>
<<switch $interaction>>
<<case "Touch Ass">>
<<set $interactionType = "Touch Ass">>
<<Interaction $interactionNpc $player>>
<<run _msg = $interactionNpc.info.firstName + " is touching your ass">>
<<case "Touch Boobs">>
<<set $interactionType = "Touch boobs">>
<<Interaction $interactionNpc $player>>
<<run _msg = $interactionNpc.info.firstName + " is touching your boobs">>
<</switch>>
<</if>>
<<NpcEventDialogue _msg>>
<div class="npc-event-actions">
<<if $FromInteraction == true>>
<div class="btn"><<button "Back" "CharacterInteractions">><<unset $FromInteraction>><<unset $interaction $interactType>><</button>></div>
<<else>>
<div class="btn"><<button "Back" $player.info.currentLocation>><<set $gameSettings.allowSaves = true>><<set $canShowStatsBtn = true>><<unset $indexNPC $interactionNpc $interaction $interactType>><</button>></div>
<</if>>
</div>
</div><!-- /npc-event-panel -->
<</nobr>><<nobr>>
<<include "UpdateAll">>
<div class="npc-event-panel">
<<NpcEventHeader $interactionNpc>>
<<NpcEventDialogue "Not enough energy">>
<div class="npc-event-actions">
<<if $FromInteraction == true>>
<div class="btn"><<button "Back" "CharacterInteractions">><<unset $FromInteraction>><<unset $interaction $interactType>><</button>></div>
<<else>>
<div class="btn"><<button "Back" $player.info.currentLocation>><<set $gameSettings.allowSaves = true>><<set $canShowStatsBtn = true>><<unset $indexNPC $interactionNpc $interaction $interactType>><</button>></div>
<</if>>
</div>
</div><!-- /npc-event-panel -->
<</nobr>><<nobr>>
<div class="faq-container">
<div class="faq-toolbar">
<div class="faq-search">
<span class="faq-search-icon" aria-hidden="true">🔍</span>
<input class="faq-search-input" type="text" placeholder="Search the FAQ: bus, rent, jobs, prison..." aria-label="Search the FAQ" autocomplete="off" spellcheck="false">
<button type="button" class="faq-search-clear" aria-label="Clear search">✕</button>
</div>
</div>
<div class="faq-layout">
<nav class="faq-chips" aria-label="FAQ sections"></nav>
<div class="faq-body">
<div class="faq-intro">
<div class="faq-intro-kicker">New in Viceburg?</div>
<div class="faq-intro-title">Your first days in five steps</div>
<ol class="faq-steps">
<li>Open <b>Quests</b> in the sidebar - each active quest lists its tasks, and the unticked one is what to do next.</li>
<li>Watch your <b>energy</b>. <b>Wait</b>, <b>Rest</b> or <b>Sleep</b> before it runs dry.</li>
<li>You start with <b>$100</b>. The <b>Diner</b> in Downtown pays from day one.</li>
<li>Train at the <b>Gym</b> in the Mall before you pick fights or roam Skid Row at night.</li>
<li>Talk to the people you meet and ask the ones you like for their number - it goes into your <b>Phone</b>.</li>
</ol>
<p class="faq-intro-note">Stuck with no way out of a scene? <b>Emergency Return</b> in the sidebar sends you home. Looking for something specific? Type it in the search above.</p>
</div>
<section class="faq-section faq-section--amber" data-faq-section="start" data-faq-label="Basics">
<h3 class="faq-section-title"><span class="faq-section-icon">🧭</span><span class="faq-section-name">Basics & Interface</span></h3>
<div class="faq">
<div class="faq-question">What is on the sidebar?</div>
<div class="faq-answer">
<ul>
<li><b>Player Profile</b> - your name and cash.</li>
<li><b>Time & Status</b> - date, time and weekday.</li>
<li><b>Player Condition</b> - Health, Energy, Horny, Sex Stamina, Drunkenness and Hygiene.</li>
<li><b>Main Actions</b> - Quests, Stats, Inventory, Wardrobe, Phone, Streets (the gang map) and Achievements.</li>
<li><b>Utilities</b> - Cheats. <b>Support</b> - this FAQ and <b>Emergency Return</b>.</li>
<li><b>Movement</b> - pick Walk, Bus or Car, travel home with <b>Return to Bedroom</b> (where it is shown) and use your pinned place.</li>
<li>Options, Saves and Restart sit at the very bottom.</li>
</ul>
<p>In prison and aboard the cruise ship, Streets and Movement are hidden; the Phone is also gone in prison.</p>
</div>
</div>
<div class="faq">
<div class="faq-question">How do I check my quest progress?</div>
<div class="faq-answer">Click <b>Quests</b> in the sidebar to see every active and finished storyline with its description and task checklist. The unticked task is what to do next, so when you don't know what to do, start there.</div>
</div>
<div class="faq">
<div class="faq-question">How do saves work?</div>
<div class="faq-answer">
<p>Open <b>Saves</b> from the side menu. You get <b>15 manual slots</b> plus one autosave slot, and you can <b>Save to file</b> / <b>Load from file</b> or export all slots at once.</p>
<ul>
<li>The autosave is written at most once per game day, on the first screen after midnight (usually when you wake up). Switch it off with <b>Daily Autosave</b> in Options.</li>
<li>You can't save manually in the middle of an interaction, a sex scene or a fight, while Options is open, in prison or aboard the cruise ship.</li>
</ul>
<p class="faq-tip">Keep a file save before big decisions - the browser's storage can be wiped by cleaning tools.</p>
</div>
</div>
<div class="faq">
<div class="faq-question">What can I change in Options?</div>
<div class="faq-answer">
<ul>
<li><b>Content Filter</b> - NPC Activity and which pairings appear (♂+♂, ♂+♀, ♀+♀ and the ⚧ pairings).</li>
<li><b>NPC Can Improve Their Skills</b>, <b>Show Game Tips</b>, <b>Daily Autosave</b> and <b>Interactive Sex Scenes</b> (experimental).</li>
<li><b>Replay onboarding tutorial</b> if you want the intro tour again.</li>
<li><b>Rain Volume</b> and <b>Enable Back / Forward Steps</b> (history navigation).</li>
<li>The <b>🤖 AI</b> tab sets up the AI chat.</li>
</ul>
</div>
</div>
<div class="faq">
<div class="faq-question">I'm stuck - how do I get out?</div>
<div class="faq-answer">Press <b>Emergency Return</b> in the sidebar. It teleports you to your bedroom - or, aboard the «Sirena», to the communal cabins, in prison back to your block or cell, and if a required police or prison step is waiting, back to that step. It never ends a voyage or a sentence or skips such a step, and it can break the quest or event you were in, so use it only when the normal buttons don't let you continue.</div>
</div>
<div class="faq">
<div class="faq-question">What are achievements?</div>
<div class="faq-answer">The <b>Achievements</b> panel tracks goals in Story, Combat, Relationship, Business, Exploration and more. Every unlocked achievement has a <b>Claim</b> button that pays out by rarity: <b>$100</b> Common, <b>$500</b> Uncommon, <b>$1,000</b> Rare, <b>$2,500</b> Epic and <b>$5,000</b> Legendary.</div>
</div>
</section>
<section class="faq-section faq-section--teal" data-faq-section="needs" data-faq-label="Daily Life">
<h3 class="faq-section-title"><span class="faq-section-icon">⚡</span><span class="faq-section-name">Energy, Health & Time</span></h3>
<div class="faq">
<div class="faq-question">How do I recover energy?</div>
<div class="faq-answer">
<ul>
<li><b>Wait</b> (Activity panel) - 15 minutes, a small chunk of energy.</li>
<li><b>Rest</b> - waits as long as it takes to fill your energy; the button shows how long that is.</li>
<li><b>Nap (2h)</b> in your bedroom - a big refill.</li>
<li><b>Sleep</b> - full energy and full health, and you sober up.</li>
<li><b>Energy drink</b> - +25 energy, $80 at the Mall Grocery. Use it with <b>Eat</b> in the Inventory.</li>
</ul>
<p class="faq-tip">Higher <b>Endurance</b> makes every Wait and Nap restore more.</p>
</div>
</div>
<div class="faq">
<div class="faq-question">What happens when my energy or health runs out?</div>
<div class="faq-answer">Nothing dramatic: neither drops below 1, and you never faint. Low energy just greys out actions that need it - a Diner or Bar shift needs 25, the Gym and studying 20 (the Gym also costs $120) - and the photographer turns you away under 25. Running out of health in a fight means you lose that fight.</div>
</div>
<div class="faq">
<div class="faq-question">How do I raise my maximum energy and health?</div>
<div class="faq-answer">Max energy is <b>100 + 10 × Endurance</b>, max health is <b>100 + 10 × Vitality</b>. Raise both with <b>Endurance training</b> and <b>Vitality training</b> at the Gym in the Mall.</div>
</div>
<div class="faq">
<div class="faq-question">How do I heal?</div>
<div class="faq-answer">
<ul>
<li><b>Sleep</b> restores all your health.</li>
<li><b>QuickHeals</b> from the Mall Pharmacy: Small +25 ($200), Medium +50 ($350), Big +80 ($500). They work in fights too.</li>
<li>The <b>Street doctor</b> on Skid Row's Pawn Row patches you up for at least $40 (4 dollars per missing point), in one hour.</li>
</ul>
</div>
</div>
<div class="faq">
<div class="faq-question">What do Hygiene, Horny, Sex Stamina and Drunkenness do?</div>
<div class="faq-answer">
<ul>
<li><b>Hygiene</b> drops over about three days of waiting and walking around (sleep, shifts and training don't count), four times faster outdoors in the rain. <b>Wash (30m)</b> in your bathroom. Being very clean adds up to +8% to friendly and romantic attempts, being filthy costs up to −10%.</li>
<li><b>Horny</b> creeps up as you move around while you still have Sex Stamina left.</li>
<li><b>Sex Stamina</b> is how many times you can cum; it refills every day at midnight (not in prison). Viagra restores one used charge, never above your maximum.</li>
<li><b>Drunkenness</b> comes from drinks ($25 at the Night Club bar). Waiting and resting sober you up a little, sleep clears it.</li>
</ul>
</div>
</div>
<div class="faq">
<div class="faq-question">How does time work?</div>
<div class="faq-answer">
<p>The story starts on <b>Wednesday, 3 September 2025, 07:05</b>. Most actions cost time:</p>
<ul>
<li>Wait 15m, Diner or Bar shift 30m, Gym 30m, studying 30m, a class 45m, photo shoot 1h, wash 30m.</li>
<li>Walking between districts 30m, the bus 10m, a car 5m.</li>
</ul>
<p>Opening hours matter: the Mall is open 08:00-22:59, the Diner takes shifts 09:00-21:59, the Bar 16:00-01:59, classes run Monday-Friday 09:00-11:59. Some places offer <b>Wait until evening</b> (05:00-16:59; it moves the clock to 18:00 and keeps you where you are) or similar buttons to skip ahead.</p>
</div>
</div>
<div class="faq">
<div class="faq-question">How does sleeping work, and what happens in the morning?</div>
<div class="faq-answer">
<p><b>Sleep</b> takes you to 07:00 the next morning; go to bed after midnight and you wake at 07:00 the same day. People head home at 22:00, so the city gets quiet at night.</p>
<p>When there is news, a <b>🌅 A new day</b> screen lists what happened while you slept: missed calls, messages, relationship changes, today's meetups and street news (not after a short sleep past midnight). If you went to bed before 22:00, <b>🌙 See the night's log</b> shows what the town got up to until then.</p>
<p class="faq-tip">You can sleep in your bedroom, in an apartment you own, in your brothel's master room or in the Skid Row motel ($100 a night).</p>
</div>
</div>
<div class="faq">
<div class="faq-question">What can I do at home?</div>
<div class="faq-answer">
<ul>
<li><b>Bedroom</b> - Sleep, Nap (2h) and Jerk off. Buy a PC ($5,000) and <b>Set up PC</b> for online courses (Oratory, Ego Training for Dominance, Performance, $250 each), freelance jobs that pay more the smarter you are, and porn.</li>
<li><b>Bathroom</b> - <b>Wash (30m)</b> to get clean.</li>
<li><b>Living Room</b> - call a maid service ($80, once a day).</li>
<li>Bring people over with <b>Invite Home</b> or <b>Come to my place</b> on the phone.</li>
</ul>
</div>
</div>
</section>
<section class="faq-section faq-section--cyan" data-faq-section="travel" data-faq-label="Travel">
<h3 class="faq-section-title"><span class="faq-section-icon">🗺️</span><span class="faq-section-name">Getting Around</span></h3>
<div class="faq">
<div class="faq-question">How do I travel between districts?</div>
<div class="faq-answer">
<p>Pick a mode with the icons in the sidebar's <b>Movement</b> section, then use any travel button:</p>
<ul>
<li><b>Walk</b> - free, 30 minutes, small chance of a street encounter.</li>
<li><b>Bus</b> - <b>$10</b>, 10 minutes, paid when you get off. With less than $10 you walk.</li>
<li><b>Car</b> - 5 minutes and $12 of gas once per day, small chance of a road event.</li>
</ul>
</div>
</div>
<div class="faq">
<div class="faq-question">How is the city laid out?</div>
<div class="faq-answer"><b>Campus</b> is the hub: from there you reach Downtown, the Business District, the Entertainment District, the Residential Area, the Red Light District, Skid Row and Oak Street (your home). Every district has a <b>Leave</b> or <b>Campus</b> button back to Campus. The <b>Harbor</b> is reached from Downtown.</div>
</div>
<div class="faq">
<div class="faq-question">Is there a quick way home?</div>
<div class="faq-answer"><b>Return to Bedroom</b> in the Movement section takes you to your bedroom on Oak Street from anywhere, using your current travel mode (its time and fare). You can also <b>☆ Pin location</b> on one place you visit often; it then stays in the sidebar as a one-click trip.</div>
</div>
<div class="faq">
<div class="faq-question">How do I get a car?</div>
<div class="faq-answer">Visit the <b>Car Dealership</b> in Downtown and talk to Lana Monroe. There are 12 models, from a $5,000 compact to a $100,000 supercar. A car makes trips the fastest and costs $12 of gas a day. Buying the $100,000 Supercar opens up Lana's story.</div>
</div>
</section>
<section class="faq-section faq-section--green" data-faq-section="money" data-faq-label="Money">
<h3 class="faq-section-title"><span class="faq-section-icon">💰</span><span class="faq-section-name">Money & Work</span></h3>
<div class="faq">
<div class="faq-question">How can I earn money?</div>
<div class="faq-answer">
<ul>
<li><b>Diner</b> (Downtown) - <b>Work</b> a 30-minute shift for $70-200 (needs 25 energy, uses 20; 09:00-21:59), or start <b>Work All Day</b> before 21:00 to work until closing. Now and then a shift turns into an event.</li>
<li><b>Bar</b> (Entertainment District) - <b>Work</b> a 30-minute bartending shift for $70-200 (needs 25 energy, uses 20; 16:00-01:59). Now and then an event shift pays $80-250 plus extra tips.</li>
<li><b>Photo Studio</b> and <b>Porn Studio</b> (Red Light District, 08:00-18:00) - $100-850 a photo shoot, $250-1000 a porn scene. See Businesses for the details.</li>
<li><b>Night Club</b> basement (opens through Damian's story) - bet $1,000 on a sex battle, 08:00-21:59: win and you get $1,000, lose and you pay $1,000.</li>
<li><b>PC at home</b> - freelance jobs that pay more the higher your Intelligence.</li>
<li>Later: sell yourself with <b>Work the stroll</b> (a crime), take over the pimp's business or buy your own <b>Brothel</b>.</li>
<li>Crime pays fast but brings the police - see Police & Prison.</li>
</ul>
<p class="faq-tip">Every unlocked achievement also pays out once you press <b>Claim</b> in the Achievements panel.</p>
</div>
</div>
<div class="faq">
<div class="faq-question">Do I have to pay rent?</div>
<div class="faq-answer">No - the family home on Oak Street is free. If you <b>buy an apartment</b> in the Residential Area ($10,000), it costs $250 a week, taken from your cash automatically; if you can't cover it, the place runs down. A <b>maid service</b> at home costs $80.</div>
</div>
<div class="faq">
<div class="faq-question">Can I borrow money?</div>
<div class="faq-answer">
<p>The pawn shop on Skid Row's <b>Pawn Row</b> lends $500, $1,500 or $3,000 at 2-4% a day, due in 7 days - when the gang that runs Pawn Row has the cash. Paying late brings a collector asking for 10% more; a week late, the gang behind the loan sends people after you.</p>
<p>The <b>💵 Money</b> action in the interaction menu lets you borrow from, lend to or give money to an NPC, ask for your money back or forgive a debt; <b>Send money</b> on the phone pays a debt back or sends a gift.</p>
</div>
</div>
<div class="faq">
<div class="faq-question">Is there a bank?</div>
<div class="faq-answer">Yes - the <b>Bank</b> in the Business District. <b>Deposit money</b> moves cash into your account and <b>Withdraw money</b> brings it back, in whole dollars, with no fees and no interest. Shops, fees and fines all take cash, so withdraw what you need first. Money in the bank is not on you, so whatever happens to your cash does not touch your balance.</div>
</div>
</section>
<section class="faq-section faq-section--slate" data-faq-section="shopping" data-faq-label="Shops & Looks">
<h3 class="faq-section-title"><span class="faq-section-icon">🛍️</span><span class="faq-section-name">Shops, Clothes & Looks</span></h3>
<div class="faq">
<div class="faq-question">Where can I buy things?</div>
<div class="faq-answer">
<p>The <b>Mall</b> on Campus (08:00-22:59) has almost everything:</p>
<ul>
<li><b>Grocery</b> - energy drinks.</li>
<li><b>Pharmacy</b> - pills and QuickHeals.</li>
<li><b>Clothing</b> - a rotating rack of outfits.</li>
<li><b>Sex Shop</b> - a dildo and a paddle.</li>
<li><b>Electronics</b> - a phone, the NovaGear X console and a PC (all work as gifts) and a hidden camera.</li>
<li><b>Gift Shop</b> - wrapped gift boxes: Small ($50), Medium ($400) and Big ($1,500).</li>
<li><b>Weapon Shop</b>, <b>Gym</b> and <b>Shooting Range</b>.</li>
</ul>
<p>On Skid Row, <b>The Fence</b> sells lockpicks ($150) and teaches lockpicking ($250).</p>
</div>
</div>
<div class="faq">
<div class="faq-question">How do the Inventory and Wardrobe work?</div>
<div class="faq-answer">The <b>Inventory</b> holds everything you carry, with filters (Clothes, Drugs, Gift, Food, Toys, Weapons, Ammo), a search box and sorting. Items have <b>Put on</b>, <b>Equip</b>, <b>Eat</b> or <b>Use</b> buttons. The <b>Wardrobe</b> shows what you wear slot by slot, with its Protection, Beauty and other ratings - clothes protect you in fights and change how people see you.</div>
</div>
<div class="faq">
<div class="faq-question">What counts as being naked in public?</div>
<div class="faq-answer">
<p>A male character has to cover his crotch; everyone else has to cover both crotch and chest. Walk around exposed and a horny local may come on to you - or the police stop you once a day:</p>
<ul>
<li><b>Pay the fine ($500)</b>, <b>Go to the station</b>, <b>Offer to perform oral sex</b> (if that content is on) or <b>Fight</b>.</li>
</ul>
</div>
</div>
<div class="faq">
<div class="faq-question">Can I change my body?</div>
<div class="faq-answer">
<p>Talk to the <b>Plastic Surgeon</b> at the <b>Surgery center</b> on Campus (08:00-20:59) and pick <b>💉 Plastic Surgery</b>:</p>
<ul>
<li>Face - $1,500.</li>
<li>Femininity, breasts or butt - $500 per step, up or down.</li>
<li>Genitals - $2,000; cock size - $250 per step.</li>
</ul>
<p><b>🧪 Drug Testing</b> pays $200 once a day and may nudge your body a little; about 40% of the time you get no money and the pills turn you into a bimbo girl until the next day. People you know comment when your gender has changed since they last saw you.</p>
<p>The Surgery center also offers a <b>Libido Suppressant</b> ($200) that lowers your lust and a <b>Therapy Session</b> ($300) that lowers your corruption.</p>
</div>
</div>
<div class="faq">
<div class="faq-question">Does my gender matter?</div>
<div class="faq-answer">You start as Male, Female or Trans. After that the game reads your gender from your body: a pussy makes you female, a feminine body with a cock makes you a shemale, otherwise you are male. Gender changes which jobs, scenes and partners are open to you, and what counts as decent clothing.</div>
</div>
</section>
<section class="faq-section faq-section--red" data-faq-section="combat" data-faq-label="Combat">
<h3 class="faq-section-title"><span class="faq-section-icon">⚔️</span><span class="faq-section-name">Combat & Training</span></h3>
<div class="faq">
<div class="faq-question">How do fights start?</div>
<div class="faq-answer">
<ul>
<li>An <b>aggressive NPC</b> who doesn't like you picks on you: <b>Stay indifferent</b> (you lose some dominance), <b>Try to resolve the situation</b> (a chance roll) or <b>Fight</b>.</li>
<li>You <b>Challenge</b> someone from the interaction menu.</li>
<li>On Skid Row: <b>Pick a fight</b> on Bar Row or <b>Step into the ring</b> at The Cage after dark.</li>
<li>The <b>Fight Club</b> in Skid Row.</li>
</ul>
</div>
</div>
<div class="faq">
<div class="faq-question">How does a fight work?</div>
<div class="faq-answer">
<p>Most fights let you choose <b>Fight</b> to play it turn by turn or <b>Auto-Fight</b> to let it resolve; street brawls on Skid Row go straight to a manual fight. Each turn has four tabs, though some fights lock Seduce or Items:</p>
<ul>
<li><b>Attack</b> - punches and kicks; stronger moves unlock as your Strength grows, plus moves for an equipped weapon. After each attack you choose <b>Block</b> or <b>Dodge</b>.</li>
<li><b>Seduce</b> - turn the fight into a fuck instead; works on horny opponents and gets easier with your Corruption.</li>
<li><b>Items</b> - QuickHeals and energy drinks.</li>
<li><b>Actions</b> - Surrender, Wait or Escape (15 energy; the odds depend on your Dexterity against theirs).</li>
</ul>
</div>
</div>
<div class="faq">
<div class="faq-question">Which stats matter in a fight?</div>
<div class="faq-answer"><b>Strength</b> sets your damage, <b>Defense</b> (shown as "Pain threshold" in fights) cuts the damage when you <b>Block</b>, <b>Dexterity</b> helps you dodge, land critical hits and escape, <b>Vitality</b> gives you more health. Your clothes' protection softens every hit.</div>
</div>
<div class="faq">
<div class="faq-question">Why do I always lose in fights?</div>
<div class="faq-answer">
<p>You are probably undertrained. Go to the <b>Gym</b> in the Mall and press <b>Work Out</b> ($120, 20 energy, 30 minutes): it trains <b>Strength</b>, <b>Vitality</b>, <b>Endurance</b>, <b>Dexterity</b>, <b>Defense</b> or <b>Melee</b>. Higher Intelligence makes every session count for more.</p>
<p class="faq-tip">Carry a couple of QuickHeals, and don't start fights with zero energy.</p>
</div>
</div>
<div class="faq">
<div class="faq-question">How do weapons and shooting work?</div>
<div class="faq-answer">
<p>Buy guns, melee weapons and ammo at the <b>Weapon Shop</b> in the Mall (ammo: pistol $15 for 12 rounds, shotgun $25 for 8, rifle $30 for 10), then <b>Equip</b> the weapon from the Inventory. Each weapon has a required level - Firearm Proficiency for guns, Strength for melee weapons. Below it, the weapon's bonus damage drops to 30%.</p>
<p>Train Firearm Proficiency at the <b>Shooting Range</b> (Mall): Basic $50, Advanced $100, Expert $200, 20 energy each.</p>
</div>
</div>
<div class="faq">
<div class="faq-question">How does the Fight Club work?</div>
<div class="faq-answer">Take <b>Underground Fight Gym</b> in Skid Row and talk to <b>Grant Maddox</b> first. Then earn the trainers' approval in order: <b>Tess Carter</b> (Defense), <b>Clay Harper</b> (Dexterity), <b>Marcus Bell</b> (Strength). Tess trains Defense for $250 a session whenever you aren't in the middle of her story; Clay and Marcus train their stat for $250 once their storylines are done. With all three on your side, Grant lets you into his tournament: beat Razor, Bull and Shade in a row for <b>$20,000</b> - a loss sends you back to the first fight.</div>
</div>
<div class="faq">
<div class="faq-question">What happens when I win or lose a fight?</div>
<div class="faq-answer">
<p><b>Win:</b> experience, half the loser's cash (30% if you won by seduction), sometimes a QuickHeal or energy drink, and after an ordinary brawl you can strip or dress the beaten NPC.</p>
<p><b>Lose:</b> your energy drops to zero and you lose some dominance; if you were knocked out, health drops to 1. An aggressive winner with a cock who wants you may fuck you right there. A male player beaten by a random NPC can end up locked in a <b>chastity cage</b> - Damian in the Night Club's VIP Lounge removes it for $2,000.</p>
</div>
</div>
<div class="faq">
<div class="faq-question">Can I die or get a game over?</div>
<div class="faq-answer">You can't die - health never drops below 1. The one bad ending is the <b>Etherium infection</b>: losing to an Etheriant infects you, and every day it pushes your face, tits and ass toward the maximum. Once you have been infected for 10 days or more and all three are maxed, the game ends. <b>Damian</b> in the Night Club's VIP Lounge cures it for $1,200.</div>
</div>
</section>
<section class="faq-section faq-section--blue" data-faq-section="police" data-faq-label="Police & Prison">
<h3 class="faq-section-title"><span class="faq-section-icon">🚓</span><span class="faq-section-name">Crime, Police & Prison</span></h3>
<div class="faq">
<div class="faq-question">What crimes can I commit?</div>
<div class="faq-answer">
<ul>
<li><b>Pickpocket</b> - Downtown "Work the crowd", $15-60.</li>
<li><b>Shoplift</b> - Mall "Pocket some merchandise" (watch the cameras), $25-90.</li>
<li><b>Mugging</b> - Park, 21:00-05:00, $60-200.</li>
<li><b>Dealing</b> - Skid Row "Work the corner", $80-250.</li>
<li><b>Car theft</b> - Downtown "Boost a car off the lot", 20:00-05:00, $200-500.</li>
<li><b>Vandalism</b> - Skid Row, $10-45.</li>
<li><b>Street hustling</b> - Red Light District "Work the stroll", 18:00-05:00, $40-120 (only with male partners allowed in the Content Filter).</li>
<li><b>Burglary</b> - pick the lock of an NPC's house (needs a lockpick) and search the rooms; up to $50-200, depending on what the residents have.</li>
</ul>
<p>Night, Dexterity and a lack of witnesses or cameras lower the odds of being caught.</p>
</div>
</div>
<div class="faq">
<div class="faq-question">What are heat and the wanted level?</div>
<div class="faq-answer">
<p>Every crime adds <b>heat</b> and a warrant - <b>even when nobody catches you</b>. Witnessed fights you start can count as assault.</p>
<ul>
<li><b>15+</b> - person of interest.</li>
<li><b>40+</b> - wanted: police may stop you on the street (at most once a day).</li>
<li><b>75+</b> - most wanted: they may raid your bedroom.</li>
</ul>
<p>Heat drops by 10 for each day without crime, but warrants stay until you deal with them.</p>
</div>
</div>
<div class="faq">
<div class="faq-question">The police stopped me - what are my options?</div>
<div class="faq-answer">
<ul>
<li><b>Pay the fine ($500)</b> - only for minor charges; clears the charge.</li>
<li><b>Slip a bribe</b> ($200 + 2 × heat) - the cop may take it (the warrant stays), take it and book you anyway, or refuse and arrest you for attempted bribery.</li>
<li><b>Talk your way out</b> - minor charges only, better odds with high Speech.</li>
<li><b>Run for it</b> - Dexterity helps, high heat hurts.</li>
<li><b>Fight</b> - adds an assault charge; win and you walk (the warrant stays), lose and you are booked for resisting.</li>
<li>An oral offer, if that content is on, or <b>Give it up</b>.</li>
</ul>
</div>
</div>
<div class="faq">
<div class="faq-question">How do I clear my warrants?</div>
<div class="faq-answer">At the <b>Police department</b> in Downtown (Squad room → Front desk) you can <b>Grease the clerk</b>: $150 + $200 per point of severity for each warrant, wipes them all and drops heat by 40. You can also <b>Turn yourself in</b>. A fugitive should <b>Go see the fixer</b> on Skid Row instead: $2,000 and a week of waiting clear your fugitive status, every warrant and all heat (your notoriety only drops, and prior convictions stay).</div>
</div>
<div class="faq">
<div class="faq-question">What happens when I get arrested?</div>
<div class="faq-answer">Minor charges land you in a holding cell for a couple of days before the county bus moves you to prison. For serious charges you can <b>Post bail</b> ($400 × severity - you walk, but the warrant stays), take a <b>reduced plea</b> ($250 × severity, still prison but a shorter term) or decline the deal. Prior convictions, high heat, resisting arrest, a notorious name and three or more open warrants raise the severity.</div>
</div>
<div class="faq">
<div class="faq-question">How long is a prison sentence, and how do I get out early?</div>
<div class="faq-answer">
<p>A felony booking gives 15-45 days depending on severity, plus 6 days for every prior conviction (90 at most); a reduced plea knocks one step off. If the county bus brings you from a holding cell, you serve what is left of your 21-day holding term. Ways out:</p>
<ul>
<li><b>Serve the time</b>, and shorten it with good-time days from the work detail.</li>
<li><b>Parole</b> after half the term, through "The Board" prison quest.</li>
<li><b>Post bail and walk</b> - needs at least $200 held at intake, and you lose all of it.</li>
<li><b>Escape</b> through the "Over the Wall" quest (six routes). Failing adds days; success makes you a fugitive and leaves your belongings behind.</li>
</ul>
</div>
</div>
<div class="faq">
<div class="faq-question">What can I do in prison?</div>
<div class="faq-answer">Your cash and items are held at intake and you start with 12 scrip, the prison currency. Earn more on the <b>work detail</b> (08:00-12:00), gamble at dice, buy at the commissary (16:00-18:00), and visit the yard, chow hall, showers, rec room, laundry, infirmary, chapel and law library. Manual saving is disabled until you are out (the daily autosave still runs if it is on).</div>
</div>
</section>
<section class="faq-section faq-section--orange" data-faq-section="gangs" data-faq-label="Gangs">
<h3 class="faq-section-title"><span class="faq-section-icon">🏴</span><span class="faq-section-name">Street Gangs</span></h3>
<div class="faq">
<div class="faq-question">What are the street gangs?</div>
<div class="faq-answer">Four to six gangs (you pick the number when you start, and a split can add one) fight over the city's 26 blocks - 21 of them can change hands, the rest are neutral. Open the map with <b>Streets</b> in the sidebar or <b>🗺 Streets</b> on the phone to see who holds what. Gangs collect from their blocks, recruit, go to war and remember who crossed them.</div>
</div>
<div class="faq">
<div class="faq-question">How do I build street rep?</div>
<div class="faq-answer">Win brawls on Bar Row (+3) and fights in The Cage (+2); losing either costs 1. Beating gang collectors and finishing gang jobs give more. Helping a neighbour in the Tenements gives +1 once per night's sleep. Leaving a gang costs 5.</div>
</div>
<div class="faq">
<div class="faq-question">How do I join a gang?</div>
<div class="faq-answer">
<p>Once you have 10 street rep, a recruiter may approach you on a gang's block - a nightly chance, and only if that gang doesn't hate you, you never left it and you aren't marked as a rat. <b>Hear them out</b>, then pick <b>Start as a hangaround</b>; the offer stays open for a week under <b>Answer <gang></b> on the Streets screen.</p>
<p>You climb from Hangaround to Recruit, Soldier, Made (a weekly $250 cut) and Lieutenant (25% of a block's take). A hangaround can simply walk away; members buy their way out for $600 to $6,000 depending on rank, or take a <b>Blood out</b> and fight two or three of them in a row.</p>
</div>
</div>
<div class="faq">
<div class="faq-question">Why did a gang come after me?</div>
<div class="faq-answer">Commit two or more crimes on a gang's block and a collector comes for their share: <b>Pay the cut</b> ($100 plus $50 per crime) or <b>Fight the collector</b>. Lose the fight and they take the same cut (all your cash if you have less) and may drag you off as a captive: either they use you, or you buy your way out for $800 - your crew pays if it can, otherwise they empty your pockets. Late payments on a pawn-shop loan also bring collectors.</div>
</div>
<div class="faq">
<div class="faq-question">Can I start my own crew or take over the city?</div>
<div class="faq-answer">With 20 street rep (or the rank of Made in your gang), $5,000 plus the first rent or price of a free site, you can <b>Found your own crew</b> - unless you are marked as a rat. A Lieutenant can also seize their gang: win over at least half of its lieutenants, then beat the boss. Hold 60% of the takeable blocks for 7 nights in a row, or have every other gang allied with you or paying tribute, to become <b>King of Viceburg</b>.</div>
</div>
</section>
<section class="faq-section faq-section--violet" data-faq-section="people" data-faq-label="People">
<h3 class="faq-section-title"><span class="faq-section-icon">👥</span><span class="faq-section-name">NPCs & Relationships</span></h3>
<div class="faq">
<div class="faq-question">How do I meet people?</div>
<div class="faq-answer">Everyone at your location shows up as a card. Strangers are just a description ("Fit white woman") until you open their menu - that introduces you and gives 5 Friendship plus your Speech. Talking needs at least 5 energy.</div>
</div>
<div class="faq">
<div class="faq-question">What can I do in the interaction menu?</div>
<div class="faq-answer">
<p>Most buttons show their success chance in brackets, e.g. "Small Talk (85%)". The menu is split into groups:</p>
<ul>
<li><b>Friendly</b>, <b>Support</b> and <b>Playful</b> - small talk, deep talk, gifts, a drink at the bar, comfort, jokes and games.</li>
<li><b>Personal</b> - ask where they are going, what they want, about their life, family, orientation and rumors.</li>
<li><b>Romance</b> and <b>Intimate</b> - compliment, flirt, hug, confess, ask out, kiss, touch, ask for sex.</li>
<li><b>Aggressive</b> - insult, threaten, intimidate, challenge or fight.</li>
<li><b>Actions</b> - Follow Me, Invite Home, 📱 Number, 🔑 Ask Keys, Give Item, 💵 Money, 📅 Meet up, 🚗 Offer Ride and more.</li>
<li><b>Persuasion</b> and <b>Job Services</b> (depending on their job).</li>
</ul>
</div>
</div>
<div class="faq">
<div class="faq-question">Why does my success chance change?</div>
<div class="faq-answer">The chance weighs your relationship, the NPC's mood, tiredness and grudges, the time and place and your <b>Speech</b>; for friendly and romantic actions your <b>Hygiene</b> counts too. NPCs remember up to 12 things you did to them, and what happened in the last 30 days nudges the odds up or down. Most buttons also have a cooldown, so spamming them doesn't help.</div>
</div>
<div class="faq">
<div class="faq-question">How do relationships work?</div>
<div class="faq-answer">
<p>Each NPC tracks <b>Friendship</b> (-100 to 100) plus <b>Love</b>, <b>Sex</b>, <b>Fear</b>, <b>Anger</b> and <b>Corruption</b> (0 to 100). With you, a relationship climbs one of two tracks: <b>Acquaintance → Friend → Best friend</b> and <b>Crush → Dating → Soulmate</b>.</p>
<p>A step up is never automatic: when you open their menu (at most once a day) the NPC may propose it - Friend from about Friendship 20, Best friend from 45, Crush from Love 15-25, Dating from Love 40 with Friendship 35 - and you answer <b>Accept</b>, <b>I need time to think</b> or <b>No</b>. You can also <b>Ask to Date</b> yourself. <b>Soulmate</b> needs Love 80+, Friendship 50+, almost no anger, a healthy couple (no open conflict) and two weeks together - days living together count double.</p>
</div>
</div>
<div class="faq">
<div class="faq-question">What do I need to get a number, a visit or a date?</div>
<div class="faq-answer">
<ul>
<li><b>Compliment</b> - Friendship 5. <b>Flirt</b> - Friendship 20 and Love 10.</li>
<li><b>📱 Number</b> - Friendship 30. It adds them to your phone.</li>
<li><b>Invite Home</b> - Friendship 35, Love 25 or Sex 30, and you must not be enemies.</li>
<li><b>Ask to Date</b> - Friendship 35 and Love 30 while you are Friends, Best friends or a Crush.</li>
</ul>
</div>
</div>
<div class="faq">
<div class="faq-question">How do gifts work?</div>
<div class="faq-answer"><b>Give Gift</b> ($50, Friendship 10, once a day) and <b>Bar</b> ($150, Friendship 15, every other day) are quick ways to warm someone up. With <b>Give Item</b> you hand over something from your inventory - the same gift item only once a day. Gift boxes from the Mall <b>Gift Shop</b> and the electronics raise Friendship; the Big box and the console the most. Clothes are only accepted if they are made for the NPC's gender, and drugs only from someone with Friendship above 90 and low dominance.</div>
</div>
<div class="faq">
<div class="faq-question">How can I make an NPC obey me?</div>
<div class="faq-answer">Beat them in a fight: your <b>Dominance</b> rises, theirs drops and they fear you more (losing shifts dominance their way). Whoever has the higher Dominance leads when you fuck, and some requests - recruiting someone into whoring, handing them drugs - only work on NPCs with low dominance.</div>
</div>
<div class="faq">
<div class="faq-question">How does 📅 Meet up work?</div>
<div class="faq-answer">Pick a place and a time up to six days ahead (08:00-22:30), up to three open meetups at a time. The NPC really walks there and waits about half an hour, longer if they love you. Cancel at least two hours ahead and nobody minds; stand them up twice within two weeks and they won't make plans with you for a week. Angry or scared NPCs refuse. Partners use <b>Plan a date</b> instead, and story characters can't be booked. Your plans are on the phone under <b>📅</b>.</div>
</div>
<div class="faq">
<div class="faq-question">Where do I find someone?</div>
<div class="faq-answer">NPCs keep schedules: students sit in the auditorium on weekdays 07:00-15:00, the photographer and the porn director work 08:00-18:00, the plastic surgeon until 21:00, hookers walk the Red Light District from 18:00. Between 22:00 and 07:00 almost everyone goes home. Call a contact and ask <b>Where are you?</b> to find them.</div>
</div>
<div class="faq">
<div class="faq-question">What can I do with the Phone?</div>
<div class="faq-answer">
<p>Your <b>Phone</b> holds every number you collected (story characters aren't listed), with a search box, plus 💬 messages, 📖 Journal, 📅 plans and 🗺 Streets. Calling a contact lets you:</p>
<ul>
<li><b>Talk</b> (once a day), <b>Send money</b> (pay back a debt or send a gift), ask <b>Where are you?</b></li>
<li><b>Come to me</b> (shows the chance) or <b>Come to my place</b>.</li>
<li>Partners also get <b>Plan a date</b> and can be asked when they'll be home.</li>
</ul>
<p>In messages, <b>✏️ Reach out to someone</b> sends a check-in, a flirt (Love 30+) or an apology (Anger 30+), once per contact per day.</p>
</div>
</div>
<div class="faq">
<div class="faq-question">Do NPCs have lives of their own?</div>
<div class="faq-answer">Yes. They date, fight, cheat and break up with each other, and gossip spreads for about a month. When you run into two NPCs together you can <b>Watch quietly</b> and, depending on what they are up to, <b>Interrupt them</b>, <b>Defuse</b>, <b>Cheer them on</b>, take a side or <b>Join in</b>. What you saw can later be used to gossip. Go to bed before 22:00 and the night log shows what happened in town until then.</div>
</div>
<div class="faq">
<div class="faq-question">Can I move in with a partner?</div>
<div class="faq-answer">Not in the family home - you need the <b>apartment</b> in the Residential Area ($10,000, $250 a week). Then <b>Ask to live together</b> once you have been Dating (or Soulmates) for 5+ days with Friendship 35, Love 45 and Trust 45. After moving in, <b>Discuss your household</b> to agree on money, guests and quiet hours.</div>
</div>
</section>
<section class="faq-section faq-section--cyan" data-faq-section="ai" data-faq-label="AI Chat">
<h3 class="faq-section-title"><span class="faq-section-icon">💬</span><span class="faq-section-name">AI Chat</span></h3>
<div class="faq">
<div class="faq-question">How do I turn on the AI chat?</div>
<div class="faq-answer">Open <b>Options → AI</b>, switch the chat on and paste your own <b>OpenRouter</b> key (the <b>How to get a key</b> button explains where to find it). Voices are optional: switch on NPC voices and use an <b>ElevenLabs</b> key or the browser's built-in voice. Then use <b>💬 Chat with <name></b> in the interaction menu, <b>💬 Talk</b> with Ethan, Robert, Sarah, Amanda or Damian, or <b>💬 Chat</b> under ✏️ Reach out to someone in the phone's messages.</div>
</div>
<div class="faq">
<div class="faq-question">Can I sweet-talk an NPC into anything?</div>
<div class="faq-answer">No. The AI only speaks; the game decides. Every request is rolled with the same odds as the menu buttons - you can even try something whose button is still locked, but every missing requirement cuts the chance. Whatever the game agrees to happens right away. Each NPC can only grow so much closer to you per day through the chat: past that they answer the same, but the relationship stops rising until tomorrow (the <b>💞 closeness meter</b> in the chat shows how far you got). Asking again after a "no" makes them angry, and a third ask makes them walk off for an hour.</div>
</div>
<div class="faq">
<div class="faq-question">Can the chat arrange meetings?</div>
<div class="faq-answer">Yes. A meetup agreed in the chat works exactly like <b>📅 Meet up</b>: the NPC walks to the place and waits for you, and standing them up hurts the relationship. Your plans are on the phone under <b>📅</b>.</div>
</div>
<div class="faq">
<div class="faq-question">Does the AI chat cost money?</div>
<div class="faq-answer">OpenRouter bills your own key per request, and every line you send makes two requests. <b>Options → AI</b> shows the spending and lets you cap requests per game day, replies per day with one story character and spending per browser session.</div>
</div>
</section>
<section class="faq-section faq-section--rose" data-faq-section="sex" data-faq-label="Sex">
<h3 class="faq-section-title"><span class="faq-section-icon">💋</span><span class="faq-section-name">Sex</span></h3>
<div class="faq">
<div class="faq-question">How do I get someone into bed?</div>
<div class="faq-answer">
<p>Use <b>Ask Sex</b> in the Intimate part of the interaction menu. It needs a <b>Crush</b>, <b>Dating</b>, <b>Soulmate</b>, <b>Fuckbuddy</b> or <b>Hatefuck</b> relationship (or Sex 80+), and a private place - bring them home or find somewhere quiet.</p>
<p>How often an NPC wants to fuck in a day depends on their lust, from once to six times. Push past that and it fizzles out, costing you both 20 energy.</p>
</div>
</div>
<div class="faq">
<div class="faq-question">How does a sex scene play out?</div>
<div class="faq-answer">
<p>If the NPC's <b>Dominance</b> is higher than yours (or you are locked in a chastity cage), they lead and pick what happens. Otherwise you choose from the Active and Passive poses yourself.</p>
<p>Keep going until the arousal bar is full - then the <b>Cum</b> button appears (when you are fucking them with your cock you get <b>In</b> or <b>Out</b> instead). Every time you cum uses one <b>Sex Stamina</b>, which refills at midnight.</p>
<p>With <b>Interactive Sex Scenes</b> on in Options, a scene you lead runs in 3-6 phases: change position, speed up or slow down, kiss, grab, spank, talk dirty, then <b>Finish</b>. Which extras show up depends on your partner's kinks.</p>
</div>
</div>
<div class="faq">
<div class="faq-question">Can anyone get pregnant?</div>
<div class="faq-answer">No. There is no pregnancy and there are no STDs in the game.</div>
</div>
<div class="faq">
<div class="faq-question">Can I jerk off?</div>
<div class="faq-answer"><b>Jerk off</b> sits next to Sleep in your bedroom while you have Sex Stamina left and no chastity cage on. <b>Cum</b> spends one Sex Stamina; <b>Edge (train stamina)</b> costs 15 energy and 15 minutes and slowly raises how many times a day you can cum.</div>
</div>
<div class="faq">
<div class="faq-question">Can sex happen without my say?</div>
<div class="faq-answer">Yes. Losing a fight to an aggressive NPC who wants you, being dragged off by a gang, prison and the cruise can all end with you getting fucked whether you like it or not. Train, avoid fights you can't win and watch your step at night. The <b>Content Filter</b> in Options decides which pairings show up at all.</div>
</div>
</section>
<section class="faq-section faq-section--rose" data-faq-section="kinks" data-faq-label="Kinks">
<h3 class="faq-section-title"><span class="faq-section-icon">🔞</span><span class="faq-section-name">Sexual Preferences & Kinks</span></h3>
<div class="faq">
<div class="faq-question">What are kinks?</div>
<div class="faq-answer">Every NPC has a set of <b>likes</b> (green chips) and <b>dislikes</b> (red chips) - e.g. <b>Anal (receive)</b>, <b>Anal (give)</b>, <b>Kiss Lover</b>, <b>Rough Sex</b>, <b>Romantic</b>, <b>Spanking</b>, <b>Dirty Talk</b>. They decide which acts an NPC refuses or only does reluctantly and how much they get out of each one. What you have learned shows up in the <b>🔞 Kinks</b> tab of that NPC's Stats.</div>
</div>
<div class="faq">
<div class="faq-question">What does "(receive)" vs "(give)" mean on a kink?</div>
<div class="faq-answer">
<p>Penetrative acts are split by role so the system tracks <b>who does what</b>:</p>
<ul>
<li><b>Anal (receive)</b> - likes taking it in the ass.</li>
<li><b>Anal (give)</b> - likes fucking someone's ass.</li>
<li><b>Oral (receive)</b> - likes getting sucked or eaten out.</li>
<li><b>Oral (give)</b> - likes going down on a partner.</li>
<li><b>Vaginal (receive)</b> / <b>(give)</b> - same idea, for pussy fucking.</li>
<li><b>Titfuck (receive)</b> / <b>(give)</b> - having your tits fucked, or fucking someone's tits.</li>
</ul>
<p>A character can easily like one role and dislike the other. When you pick a pose, the game checks the side the NPC would be on, so a partner who hates taking it in the ass may still happily fuck yours - and vice versa.</p>
</div>
</div>
<div class="faq">
<div class="faq-question">Do I have kinks of my own?</div>
<div class="faq-answer">No. Kinks belong to NPCs only - your character has no kink list, and the Kinks tab only appears in an NPC's Stats.</div>
</div>
<div class="faq">
<div class="faq-question">How do I discover an NPC's kinks?</div>
<div class="faq-answer">
<p>NPC kinks are <b>hidden</b> until you learn them:</p>
<ul>
<li>Ask: <b>Get to know better</b> and <b>Talk about interests and boundaries</b> in the Personal part of the interaction menu.</li>
<li>In <b>Interactive Sex Scenes</b>, the first action in a pose shows how they feel about their role in it, and extras give more away: <b>Kiss</b> → Kiss Lover / Romantic, <b>Spank</b> → Rough Sex, Submissive, Spanking, Masochism, <b>Grab</b> → Dominant, Sadism, <b>Dirty Talk</b> → Exhibitionist, Dirty Talk, Degradation, Teasing.</li>
<li>If an NPC <b>refuses</b> an act or agrees <b>reluctantly</b>, the matching dislike is revealed.</li>
</ul>
<p>The tab never tells you how many kinks are still hidden - there may always be more to find.</p>
</div>
</div>
<div class="faq">
<div class="faq-question">Why was a sex position blocked?</div>
<div class="faq-answer">
<p>A blocked (🚫) pose has one of four reasons:</p>
<ol>
<li><b>Hard limit</b> - a brothel worker's limit rolled at casting. It can't be overridden.</li>
<li><b>Negative preference</b> toward the act itself.</li>
<li><b>Role-specific kink dislike</b> - an NPC with <b>Anal (receive)</b> in their dislikes refuses to take it in the ass, but may still fuck yours (if they don't also dislike <b>Anal (give)</b>).</li>
<li><b>Not close enough yet</b> - every act needs some intimacy (love + sex − fear×2): oral 5, titfuck 8, pussy 10, anal 25. Their corruption cuts that need (×0.8 at 25, ×0.6 at 50, ×0.4 at 75).</li>
</ol>
<p class="faq-tip">Hover a 🚫 button in the pose menu to see what you still need, e.g. "<i>Bypass: corruption ≥ 50 (have 12) OR intimacy ≥ 80 (have 45)</i>" or "<i>Need intimacy ≥ 25, have 9</i>".</p>
</div>
</div>
<div class="faq">
<div class="faq-question">What does "(reluctant)" mean on a button?</div>
<div class="faq-answer">
<p>The NPC dislikes that role, but their corruption or your intimacy is past the threshold, so they agree anyway. The button gets a <b>(reluctant)</b> label and a rose-tinted border, and:</p>
<ul>
<li>They give you a role-flavored reluctant line (<i>"...Okay. For you. But go slow."</i> vs <i>"Alright - I'll try. Guide me."</i>).</li>
<li>In Interactive Sex Scenes they get less out of it than they would from an act they don't mind - roughly −40% when your intimacy talked them into it, −25% when it was their corruption, more for a strong dislike.</li>
</ul>
<p>They stay reluctant for as long as they have the dislike - corruption only softens the penalty.</p>
</div>
</div>
<div class="faq">
<div class="faq-question">What do the passive-role blocks look like?</div>
<div class="faq-answer">The NPC respects their own give-role dislikes too. When you pick a pose where you are the one getting fucked and the NPC dislikes giving that act, the <b>Sex(Passive)</b> button shows the same 🚫 or (reluctant) marker you see on the active side - so an NPC who dislikes <b>Anal (give)</b> won't fuck your ass until their corruption or your intimacy crosses the threshold. When the NPC leads the scene, they pick the pose themselves.</div>
</div>
<div class="faq">
<div class="faq-question">How do kinks affect pleasure during a scene?</div>
<div class="faq-answer">
<p>In Interactive Sex Scenes every action is scaled by how well it matches the NPC's kinks. The figures below are for an average-strength kink - a strong one pushes them further:</p>
<ul>
<li><b>Pose role they like</b> → ×1.5; a disliked role → ×0.6-0.75.</li>
<li><b>Kiss</b> - Kiss Lover ×1.5, Romantic ×1.2; Kiss Lover dislike ×0.7.</li>
<li><b>Spank</b> - Spanking ×1.5, Rough Sex / Submissive ×1.4, Masochism ×1.4; a dislike of any of those ×0.7.</li>
<li><b>Grab</b> - Rough Sex / Dominant / Sadism ×1.3; Rough Sex dislike ×0.75.</li>
<li><b>Dirty Talk</b> - Dirty Talk ×1.45, Exhibitionist / Rough Sex / Degradation / Teasing ×1.3; Dirty Talk or Degradation dislike ×0.7.</li>
</ul>
<p>The multiplier only changes the NPC's own arousal, whether they lead or not. Your arousal is never scaled by their kinks.</p>
</div>
</div>
<div class="faq">
<div class="faq-question">Can I get past an NPC's dislikes?</div>
<div class="faq-answer">
<p>You can't simply delete a dislike, but each role-specific one has two bypass paths - either one turns 🚫 into (reluctant):</p>
<ul>
<li><b>Their corruption</b> - Vaginal receive/give 20, Oral receive 25, Titfuck give 25, Oral give 30, Titfuck receive 30, Anal give 45, Anal receive 50.</li>
<li><b>Your intimacy</b> (love + sex − fear×2) - Vaginal 40, Oral 50, Titfuck 50, Anal 80.</li>
</ul>
<p>NPCs can still pick up new likes over time as you meet up and talk.</p>
</div>
</div>
</section>
<section class="faq-section faq-section--amber" data-faq-section="business" data-faq-label="Businesses">
<h3 class="faq-section-title"><span class="faq-section-icon">🏩</span><span class="faq-section-name">Brothel, Pimp & Studios</span></h3>
<div class="faq">
<div class="faq-question">How do I get my own brothel?</div>
<div class="faq-answer">
<p>Go to <b>Brothel</b> in the Red Light District and press <b>🏩 Purchase Brothel ($20,000)</b>. From the office you can:</p>
<ul>
<li><b>💋 Casting (Hire Workers)</b> - one worker per worker room; they draw a weekly salary.</li>
<li><b>🚪 Buy Rooms</b> - up to 10 worker rooms; room number N costs N × $1,000.</li>
<li><b>🔧 Buy Upgrades</b> - from Lighting ($300) to a Dungeon ($5,000) and a Medical Room ($6,000), unlocked as the brothel levels up. The Bar ($100) and Security ($150, $75 with the Security Deal perk) cost weekly upkeep. Extra <b>client rooms</b> are bought here too.</li>
<li><b>👥 View Workers</b>, <b>Skills</b>, <b>Collect</b> the earnings or <b>🏷️ Sell Brothel</b> for $10,000.</li>
</ul>
<p class="faq-tip">Every working girl needs a free client room - you start with one, and workers without a room rest and earn nothing. A new brothel earns +50% in its first week, nothing extra in the second, and from the third week the bonus grows by 5% a week, back to +50% after about 11 weeks.</p>
</div>
</div>
<div class="faq">
<div class="faq-question">How does the pimp work?</div>
<div class="faq-answer">
<ul>
<li><b>📋 Learn about recruiting</b> unlocks <b>Recruit into whoring</b> on female and shemale citizens and students. It needs Friendship 90, an NPC with almost no dominance and your dominance at least as high as theirs. The pimp pays $50 plus bonuses for her face, tits, ass and pussy.</li>
<li>Beat the pimp in a fight and the business is yours. Make one of your girls head girl under <b>👠 Hooker Management</b> to collect: you get a quarter of what the girls earn.</li>
<li>Lose (or surrender) and he takes everything: you owe $10,000 that grows 1% a day, and you work it off as his whore after forced surgery. With forced feminization off in the content filter, he just takes $10,000 from you.</li>
</ul>
<p class="faq-tip">The pimp will tell a feminine player he'll find clients for a 40% cut, but you can't actually whore for him unless he owns you. To sell yourself on your own, use <b>Work the stroll</b> in the Red Light District (18:00-05:00): you keep the cash, but it's a crime and vice cops run stings.</p>
</div>
</div>
<div class="faq">
<div class="faq-question">How do the photo and porn studios work?</div>
<div class="faq-answer">
<p>Both are in the Red Light District, open 08:00-18:00 - <b>Wait for the photographer</b> / <b>Wait for the director</b> skips ahead if you arrive early.</p>
<ul>
<li><b>Photo Studio</b> - first pick <b>❓ Ask about the photo shoot</b>. A standard shoot pays $100-200 for men and $200-350 for women and shemales; the <b>erotic shoot</b> unlocks at model reputation 50 and pays $300-500 or $500-850. Each costs 25 energy and an hour, and the studio has work for 1-3 shoots a day, standard and erotic together.</li>
<li><b>Porn Studio</b> - pass the casting with the director (for a woman or shemale the casting is a fuck), then shoot for $250-1000 a scene. Each shoot takes 30 energy and 3 Sex Stamina, and a male player needs a cock of size 15 or more. Only 1-5 shoots are on offer each day.</li>
</ul>
</div>
</div>
<div class="faq">
<div class="faq-question">Can I work at the strip club?</div>
<div class="faq-answer">Not yet - the strip club is for customers. <b>Watch the show ($20, 30m)</b>, then <b>Tip the dancers ($20)</b>, or book a <b>Private dance ($100)</b> and pay her for more ($150, female content filter on).</div>
</div>
</section>
<section class="faq-section faq-section--blue" data-faq-section="cruise" data-faq-label="Cruise">
<h3 class="faq-section-title"><span class="faq-section-icon">🚢</span><span class="faq-section-name">The Cruise</span></h3>
<div class="faq">
<div class="faq-question">How do I get on the cruise?</div>
<div class="faq-answer">Go to Downtown → <b>Harbor</b> → <b>The pier & gangway</b> between 18:00 and 21:00 and choose <b>Take the recruiter's offer</b>.</div>
</div>
<div class="faq">
<div class="faq-question">What happens on board?</div>
<div class="faq-answer">
<p>You spend <b>10 days</b> aboard the «Sirena». You pick a stake of 500, 1,500 or 4,000 chips - an interest-free chip loan - while your city cash is held until you return. On board there is a gambling tournament, alliances, crafting and feminization going both ways.</p>
<p class="faq-tip faq-tip--warn">You can't leave the ship or save manually during the voyage (the daily autosave still runs if it is on). Fail to clear your chip debt and you still go ashore with your cash, but you owe the shortfall to the house: work it off or pay it at the Harbor before you can sail again.</p>
</div>
</div>
</section>
<div class="faq-empty is-hidden">
<div class="faq-empty-icon">🤷</div>
<div class="faq-empty-title">Nothing about "<span class="faq-empty-query"></span>" here yet</div>
<button type="button" class="faq-reset">Show all questions</button>
</div>
<p class="faq-footer"><span class="faq-total"></span> answers · tap a question to open it</p>
</div>
</div>
</div>
<<done>>
<<run initFaqPanel()>>
<</done>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
/* UpdateAll normally rebinds interactionNpc from Characters[indexNPC].
Synthetic opponents, such as prison inmates, are not stored in Characters,
so restore the defender captured by the StartFight widget before rendering. */
<<if $interactionNpc == undefined && $defender != undefined>>
<<set $interactionNpc = $defender>>
<</if>>
<<include "CheckBattleState">>
<<timed 0.2s>>
<div class="fight-container">
<div class="column player">
<<BattleCharacterColumn $player>>
</div>
<<include "BattleLogPanel">>
<div class="column enemy">
<<BattleCharacterColumn $interactionNpc>>
</div>
</div>
<<done>>
<<run _playerTurnStatus = resolveBattleTurnStart($player)>>
<<include "CheckBattleState">>
<<if $interactionNpc != undefined && $player.status.health.value > $player.status.health.min && $interactionNpc.status.health.value > $interactionNpc.status.health.min && !_playerTurnStatus.skippedTurn>>
<<run setMoveType()>>
<<elseif $interactionNpc != undefined && $player.status.health.value > $player.status.health.min && $interactionNpc.status.health.value > $interactionNpc.status.health.min && _playerTurnStatus.skippedTurn>>
<<include "CalculateEnemyMove">>
<<include "CheckBattleState">>
<<if $interactionNpc != undefined && $player.status.health.value > $player.status.health.min && $interactionNpc.status.health.value > $interactionNpc.status.health.min>>
<<run setMoveType()>>
<</if>>
<</if>>
<<if $battleChatMessage != "">>
<<append "#logtext" t8n>>$battleChatMessage<</append>>
<<set $battleChatMessage = "">>
<</if>>
<<run updateFightBars($player)>>
<<run updateFightBars($interactionNpc)>>
<<run attachTooltips()>>
<<run setupBattleLogAutoScroll()>>
<</done>>
<</timed>>
<</nobr>><<nobr>>
<div class="battle-log">
<div class="log-content" id="logContent">
<p id="logtext"></p>
</div>
<div class="battle-controls" id="battle-control">
<<include "MovesControlButtons">>
</div>
<div class="moves-container" id="display-moves">
<<if $battleSetControls.attack == true>>
<<DisplayMoves "Attack">>
<<elseif $battleSetControls.seduce == true>>
<<DisplayMoves "Seduce">>
<<elseif $battleSetControls.items == true>>
<<DisplayMoves "Items">>
<<else>>
<<DisplayMoves "Actions">>
<</if>>
</div>
</div>
<</nobr>><<nobr>>
<<if $battleType == "SexFight" && $endOfSexBattle == true && $battleType == "SexFight" && $currentMove != "SexActive" && $currentMove != "SexPassive" && $exitSexScene>>
<<set $currentMove = 'Actions'>>
<<set $battleSetControls.attack = false>>
<<set $battleSetControls.items = false>>
<<set $battleSetControls.seduce = false>>
<<set $playerIsDefense = false>>
<</if>>
<<if $player.status.health.value == $player.status.health.min>>
<<set $playerLose = true>>
<<FinishFight>>
<<elseif $interactionNpc != undefined && $interactionNpc.status.health.value == $interactionNpc.status.health.min>>
<<set $playerLose = false>>
<<FinishFight>>
<</if>>
<<if $battleType == "SexFight" && $isFinishBattle == true>>
<<if $finishFightStatus == "Player">>
<<set $playerLose = true>>
<<elseif $finishFightStatus == "Npc">>
<<set $playerLose = false>>
<</if>>
<<set $isFinishBattle = false>>
<<FinishFight>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if $interactionNpc == undefined && $defender != undefined>>
<<set $interactionNpc = $defender>>
<</if>>
/* Escape short-circuit: clean exit, no loss/win consequences - and no
onFightEnd, which would log a loss and break a win streak. */
<<if $playerEscaped == true>>
/* Police fights keep a battle receipt so Win/Loose cannot be opened directly.
Escape has no callback passage, so consume that receipt here before the
generic BackButton returns to the hub. The assault warrant and resisting
escalation remain: getting away ends the battle, not the charge. */
<<set _escapedPoliceFight = $policeFightSource and $policeFightSource.source is "fight-active" and $policeFightSource.day is getCurrentAbsoluteDay() and $policeFightSource.location is $player.info.currentLocation and $policeFightSource.crime is "assault">>
<<if _escapedPoliceFight>><<unset $policeFightSource>><</if>>
<<unset $playerTurn $battleChatMessage $attacker $defender $battleSetControls
$currentMove _moves $exitSexScene $sexPose $playerTryToAttempt
$playerIsDefense $enemyRestoreBattle $quickHealBotUsed $finishLock $finishLockLoose>>
<div style="margin-top: 10px;">
<<BackButton "<<set $canShowStatsBtn = true>> <<unset $interactionNpc $fightPhrasesNpcWon $fightPhrasesPlayerWon $playerEscaped $playerLose>> <<set $gameSettings.allowSaves = true>>">>
</div>
<<else>>
/* Achievement tracking for fight results */
<<if $playerLose == true>>
<<run onFightEnd(false, false)>>
<<else>>
/* Check if won by seduction (battleType == "SexFight" or mostly seduce moves) */
<<set _bySeduction = ($battleType == "SexFight" || $endOfSexBattle == true)>>
<<run onFightEnd(true, _bySeduction)>>
<</if>>
<<if $playerLose == true>>
<<set _randPlayer = Random(-1, -10)>>
<<SetCharProgression $player 'dominance' _randPlayer true>>
<<set _xp = Random(1, 5)>>
<<SetCharProgression $player 'submission' _xp true>>
<<set _rand = Random(1, 10)>>
<<if $interactionNpc != undefined>>
<<SetCharProgression $interactionNpc 'dominance' _rand false>>
<</if>>
<<SpendEnergy $player 1000>>
<<if $interactionNpc != undefined && $player.gender() == "Male" && $interactionNpc.info.questInfo.isQuestCharacter != true && Random(0,100) > 70>>
<<set $playerlock = true>>
<<ChatMessage 'The victor stands over you, a smug grin spreading across their face as they pull out a gleaming metal chastity cage.'>>
<<Chat $interactionNpc 'Pathetic. You call that a fight? Your sorry dick doesn’t deserve to be free after that performance. *They snap the chastity cage around your cock, locking it tight with a click.*'>>
<<ChatMessage 'Damian can help you remove the chastity cage.'>>
<</if>>
<<else>>
<<if $interactionNpc != undefined>>
<<run $player.getRelationship($interactionNpc.info.id).metrics.increaseFear(Random(3, 10, true))>>
<</if>>
<<set _rand = Random(1, 10)>>
<<SetCharProgression $player 'dominance' _rand true>>
<<set _rand = Random(1, 10) * -1>>
<<if $interactionNpc != undefined>>
<<SetCharProgression $interactionNpc 'dominance' _rand false>>
<</if>>
/* C4: Visible XP / money / item rewards from the fight. Isolated adapters
(prison light-record fights) keep their own economy and fallout. */
<<if $interactionNpc != undefined && not ($battleSetControls && $battleSetControls.isolated)>>
<<set _battleReward = computeBattleReward($player, $interactionNpc, { won: true, bySeduction: _bySeduction })>>
<<run applyBattleRewardSideEffects($player, _battleReward, $interactionNpc)>>
<<if _battleReward.xp > 0>>
<<SetCharProgression $player _battleReward.xpAttribute _battleReward.xp true>>
<</if>>
<<set _battleRewardHtml = formatBattleRewardHtml(_battleReward)>>
<<if _battleRewardHtml != "">>
_battleRewardHtml
<</if>>
<</if>>
/* <<set $player.skills.battleSkill.increase(Random(1, 3, true))>> */
<<if $isTournament != true && not ($battleSetControls && $battleSetControls.isolated)>>
<<run RandomRelocateCharacter($indexNPC)>>
<</if>>
<</if>>
<<unset $playerTurn $battleChatMessage $attacker $defender $battleSetControls
$currentMove _moves $exitSexScene $sexPose $playerTryToAttempt
$playerIsDefense $enemyRestoreBattle $quickHealBotUsed>>
<<set _npcGoodRelationToPlayer = false>>
<<if $interactionNpc != undefined>>
<<set _npcGoodRelationToPlayer = npcHasGoodRelationToPlayer($interactionNpc, $player)>>
<</if>>
<<if ($interactionNpc != undefined && $interactionNpc.info.questInfo.isQuestCharacter == true || $finishLock != undefined) && $playerLose == false>>
<<goto $finishLock>>
<<elseif $finishLockLoose != undefined && $playerLose == true>>
<<goto $finishLockLoose>>
<<elseif $interactionNpc != undefined && $interactionNpc.info.characterWork == "Pimp">>
<<set $LoseBattle = $playerLose>>
<div style="margin-top: 10px;">
<div class="btn"><<button "Continue" "EndOfBattle_Pimp">><<unset $interactionNpc $fightPhrasesNpcWon $fightPhrasesPlayerWon>> <</button>></div>
</div>
<<elseif $interactionNpc != undefined && $interactionNpc.info.characterTraits.includes("Aggressive") && $playerLose == true && !_npcGoodRelationToPlayer >>
<div style="margin-top: 10px;">
<div class="btn"><<button "Continue" "AggressiveWin">><<set $surrenderFight = false>><</button>></div>
</div>
<<elseif $isTournament == true>>
<div style="margin-top: 10px;">
<<unset $isTournament>>
<<if $finishLock != undefined>>
<<set _lock = $finishLock>>
<div class="padding-top">
<div class="btn"><<button "Continue" $finishLock>> <<unset $finishLock $interactionNpc $fightPhrasesNpcWon $fightPhrasesPlayerWon>><</button>></div>
</div>
<<else>>
<<BackButton "<<set $canShowStatsBtn = true>> <<unset $interactionNpc $fightPhrasesNpcWon $fightPhrasesPlayerWon>> <<set $gameSettings.allowSaves = true>>">>
<</if>>
<<elseif $playerLose == false>>
<<goto "FightFinish">>
<<else>>
<div style="margin-top: 10px;">
<<if $finishLock != undefined>>
<<set _lock = $finishLock>>
<div class="padding-top">
<div class="btn"><<button "Continue" $finishLock>> <<unset $finishLock $interactionNpc $fightPhrasesNpcWon $fightPhrasesPlayerWon>><</button>></div>
</div>
<<else>>
<<BackButton "<<set $canShowStatsBtn = true>> <<unset $interactionNpc $fightPhrasesNpcWon $fightPhrasesPlayerWon>> <<set $gameSettings.allowSaves = true>>">>
<</if>>
</div>
<</if>>
<</if>>
<<unset $playerLose>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _canManageDefeatedOutfit = $interactionNpc != undefined
&& $battleType == "Fight"
&& ($interactionNpc.info.questInfo == undefined || $interactionNpc.info.questInfo.isQuestCharacter != true)>>
<<if _canManageDefeatedOutfit>>
<<run beginDefeatedNpcClothingSession($interactionNpc)>>
<</if>>
<<if $interactionNpc != undefined>>
<<ShowNpcIcon $interactionNpc>>
<<set _fightFinishPhrasePool = $fightPhrasesPlayerWon>>
<<if _fightFinishPhrasePool == undefined>>
<<set _fightFinishPhrasePool = [
"Aaah, damn, that hurts.",
"Okay, okay, you win... I'm done.",
"Ugh, I didn't see that coming.",
"I'm out, I'm out... no more.",
"Ouch, my back."
]>>
<</if>>
<<set _fightFinishPhrase = _fightFinishPhrasePool.random()>>
<<Chat $interactionNpc _fightFinishPhrase>>
<<ChatMessage `$interactionNpc.info.firstName + " backs off after the fight."`>>
<<else>>
<<ChatMessage "The fight is over. You won.">>
<</if>>
<div style="margin-top: 10px;">
<<if _canManageDefeatedOutfit>>
<div class="btn padding-bottom"><<button "Manage defeated NPC's outfit">><<OpenNpcClothingManager "defeated">><</button>></div>
<<BackButton "<<run recoverDefeatedNpcOutfit($interactionNpc)>> <<set $canShowStatsBtn = true>> <<unset $interactionNpc $fightPhrasesNpcWon $fightPhrasesPlayerWon $autoBattleResult $playerLose>> <<set $gameSettings.allowSaves = true>>">>
<<else>>
<<BackButton "<<set $canShowStatsBtn = true>> <<unset $interactionNpc $fightPhrasesNpcWon $fightPhrasesPlayerWon $autoBattleResult $playerLose>> <<set $gameSettings.allowSaves = true>>">>
<</if>>
</div>
<</nobr>><<widget "StartFight">>
<<HideLeftPanel true>>
<<run prepareBattleRuntimeState(_args[0], _args[1])>>
<<set $attacker = _args[0]>>
<<set $defender = _args[1]>>
<<set $battleSetControls = _args[2]>>
<<set $finishLock = _args[3]>>
<<set $finishLockLoose = _args[4]>>
/* Optional seventh argument marks a fight the player deliberately started.
Consume the legacy debtor-force flag here so it uses the same witness-based
police response instead of triggering a guaranteed arrest on a later day. */
<<set $playerStartedFight = (_args[6] === true || $playerInitFight > 0)>>
<<if $playerInitFight > 0>><<set $playerInitFight = 0>><</if>>
/* Choosing one NPC from an active pair clears the pair UI immediately.
Preserve the exact witness snapshot from the pair's location so later
interaction/world updates cannot replace it with a different crowd. */
<<set $fightWitnessNpcIds = undefined>>
<<set $fightWitnessLocation = $player.info.currentLocation>>
<<if $playerStartedFight == true
&& $interactionPairWitness
&& _args[1] != undefined
&& _args[1].info != undefined
&& $interactionPairWitness.targetId === _args[1].info.id
&& Array.isArray($interactionPairWitness.witnessIds)>>
<<set $fightWitnessNpcIds = $interactionPairWitness.witnessIds.slice()>>
<<set $fightWitnessLocation = $interactionPairWitness.location>>
<</if>>
<<unset $interactionPairWitness>>
<<if _args[5] != undefined>>
<<set $battleType = _args[5]>>
<<run $currentMove = "Seduce">>
<<else>>
<<set $battleType = "Fight">>
<<run $currentMove = "Attack">>
<</if>>
/* Exposure → SexFight auto-routing (Phase 4 / A4 of docs/current.md).
The decision rules live in window.decideExposureSexFight so each
short-circuit is unit-tested (see exposureRouting.test.ts).
Roll on `chance` only when shouldRoute is true. */
<<set _exposureDecision = { shouldRoute: false, chance: 0, reason: 'no_defender' }>>
<<if _args[1] != undefined && _args[1].info != undefined>>
<<set _exposureDecision = window.decideExposureSexFight({
playerGender: $player.gender(),
playerExposureChance: typeof $player.clothes.getExposureSexFightChance === 'function'
? $player.clothes.getExposureSexFightChance()
: ($player.clothes.IndecentlyDressed(false) ? 95 : 0),
defenderDominance: _args[1].attributes && _args[1].attributes.dominance
? _args[1].attributes.dominance.value
: 0,
defenderIsQuestNpc: _args[1].info.questInfo != undefined && _args[1].info.questInfo.isQuestCharacter == true,
explicitBattleType: _args[5],
battleMode: $gameSettings.battleMode
})>>
<</if>>
<<if _exposureDecision.shouldRoute && random(0, 99) < _exposureDecision.chance>>
<<set $battleType = "SexFight">>
<<run $currentMove = "Seduce">>
<<set $exposureTriggeredSexFight = true>>
/* Anyone in the same location witnesses the public intimacy. */
<<if typeof window.recordSexFightWitnesses === 'function'>>
<<run window.recordSexFightWitnesses({
actorName: $player.info.firstName,
location: $player.info.currentLocation,
excludeNpcIds: [$player.info.id, _args[1].info.id]
})>>
<</if>>
<</if>>
<<set $playerIsDefense = false>>
<<set $playerTryToAttempt = false>>
<<set $exitSexScene = false>>
<<set $enemyRestoreBattle = false>>
<<set $sexPose = "">>
<<set $quickHealBotUsed = 0>>
<<run UIBar.stow()>>
<<if $battleSetControls && $battleSetControls.forcePhysical>>
<<set $battleType = "Fight">>
<<set $battleSetControls.attack = true>>
<<set $battleSetControls.seduce = false>>
<<set $battleSetControls.items = false>>
<<run $currentMove = "Attack">>
<<unset $exposureTriggeredSexFight>>
<<goto "StartFight">>
<<elseif $gameSettings.battleMode == "NoSexBattle">>
<<set $battleType = "Fight">>
<<set $battleSetControls.attack = true>>
<<set $battleSetControls.items = true>>
<<set $battleSetControls.seduce = false>>
<<run $currentMove = "Attack">>
<<unset $exposureTriggeredSexFight>>
<<goto "StartFight">>
<<elseif $battleType != "SexFight" && $gameSettings.battleMode != "SexBattle">>
<<goto "ChooseBattleType">>
<<else>>
<<set $battleType = "SexFight">>
<<set $battleSetControls.attack = false>>
<<set $battleSetControls.items = false>>
<<set $battleSetControls.seduce = true>>
<<run $currentMove = "Seduce">>
<<if $exposureTriggeredSexFight && _args[1] != undefined && _args[1].info != undefined>>
/* i18n: viceburg.combat.exposureTriggered - single source of truth for this flavor line */
<<set $battleChatMessage = _args[1].info.firstName + " can't tear their eyes off your exposed body - this fight just turned carnal.">>
<</if>>
<<unset $exposureTriggeredSexFight>>
<<goto "StartFight">>
<</if>>
<</widget>>
<<widget "FinishFight">>
<<HideLeftPanel false>>
<<if $interactionNpc != undefined>>
<<run $interactionNpc.status.health.value = $interactionNpc.status.health.max>>
<<run $interactionNpc.status.energy.value = $interactionNpc.status.energy.max>>
<<elseif $defender != undefined>>
<<set $interactionNpc = $defender>>
<<run $interactionNpc.status.health.value = $interactionNpc.status.health.max>>
<<run $interactionNpc.status.energy.value = $interactionNpc.status.energy.max>>
<</if>>
/* Phase 3 (A3): a public fight isn't private. NPCs at the same location
remember a player victory, or any physical fight the player deliberately
started. Quest NPC fights remain private by storyline convention.
A successful Escape also sets $playerLose = false - fleeing a fight the
player did NOT start is a victim's clean exit, not their violence, so it
must not pin a witnessed_violence memory on the player. */
<<set _fightWitnesses = []>>
<<if not ($battleSetControls && $battleSetControls.isolated)
&& (($playerLose == false && $playerEscaped != true) || $playerStartedFight == true)
&& $battleType != "SexFight"
&& $interactionNpc != undefined
&& $interactionNpc.info != undefined
&& ($interactionNpc.info.questInfo == undefined || $interactionNpc.info.questInfo.isQuestCharacter != true)
&& typeof window.recordPublicActionWitnesses === 'function'>>
<<set _fightWitnesses = window.recordPublicActionWitnesses({
type: 'witnessed_violence',
actorName: $player.info.firstName,
location: $fightWitnessLocation,
excludeNpcIds: [$player.info.id, $interactionNpc.info.id],
witnessNpcIds: $fightWitnessNpcIds,
intensity: 3
})>>
<</if>>
/* A witnessed assault may be reported. No witnesses means no police heat;
otherwise the existing street detection model handles patrols, time,
stealth, notoriety and current wanted level. */
<<if $playerStartedFight == true
&& $battleType != "SexFight"
&& $isTournament != true
&& _fightWitnesses.length > 0>>
<<set _fightReportChance = streetDetectionChance($police, {
crime: 'assault',
district: $fightWitnessLocation,
hour: $dateTime.hours,
witnesses: _fightWitnesses.length,
stealth: $player.attributes.dexterity.value
})>>
<<if rollDetected(_fightReportChance)>>
<<set _fightWitnessHeatBonus = Math.max(0, _fightWitnesses.length - 1) * 5>>
<<run raiseWanted($police, 'assault', getCurrentAbsoluteDay(), $fightWitnessLocation)>>
<<run adjustWanted($police, _fightWitnessHeatBonus)>>
<<if getWanted($police) gte 75>><<run unlockPrisonAchievement('mostWanted')>><</if>>
<</if>>
<</if>>
<<unset $playerStartedFight $fightWitnessNpcIds $fightWitnessLocation>>
<<if $player.status.health.value == $player.status.health.min>>
<<run $player.status.health.increase(1)>>
<</if>>
<<run UIBar.unstow()>>
<<if $autobattleMode != true>>
<<RemoveBattleTooltips>>
<<replace "#display-moves">><</replace>>
<<replace "#battle-control">><</replace>>
<</if>>
<<unset $autobattleMode>>
<<run finalizeBattleRuntimeState()>>
<<goto "EndOfBattle">>
<</widget>>
<<widget "RemoveBattleTooltips">>
<<script>>
var element = document.getElementById("global-tooltip");
if (element) {
element.remove();
}
<</script>>
<</widget>>
<<widget "BattleControlButton">>
<<if $currentMove == _args[0]>>
<div class="battle-control selected battle-control-selected"><<button _args[0]>><</button>></div>
<<else>>
<<if _args[1] == false>>
<div class="battle-control"><<button _args[0]>>
<<set $currentMove = _args[0]>>
<<replace "#display-moves">><<DisplayMoves $currentMove>><</replace>>
<<replace "#battle-control">><<include "MovesControlButtons">><</replace>>
<<run attachTooltips()>>
<</button>></div>
<<else>>
<div class="battle-control non-interacting"><<button _args[0]>><</button>></div>
<</if>>
<</if>>
<</widget>>
<<widget "BattleCharacterColumn">>
<img @src="_args[0].getPhotoImage()" alt="Photo" class="battle-icon"/>
<h3><<print '_args[0].info.firstName _args[0].info.secondName'>></h3>
<p style="text-align:center;"><<print getBattleCharacterPosition(_args[0])>><p>
<div class="bars">
<<if _args[0].info.isPlayer>>
<<set _character = "player">>
<<else>>
<<set _character = "enemy">>
<</if>>
<<BattleBar _character "health">>
<<BattleBar _character "energy">>
<<BattleBar _character "lust">>
</div>
<div class="battle-effects" @id="_character + '-effects'"></div>
<div class="stats">
<p>Vitality: <span><<print _args[0].attributes.vitality.value>></span></p>
<p>Strength: <span><<print _args[0].attributes.strength.value>></span></p>
<p>Pain threshold: <span><<print _args[0].attributes.defense.value>></span></p>
<p>Dexterity: <span><<print _args[0].attributes.dexterity.value>></span></p>
</div>
<div class="battle-weapon-info" @id="_character + '-weapon-info'"></div>
<</widget>>
<<widget "BattleBar">>
<<set _barHtml = '<div class="fill ' + _args[1] + '" id="' + _args[0] + '-' + _args[1] + '"></div>'>>
<div class="bar">
_barHtml
</div>
<</widget>>
<<widget "DisplayMoves">>
<<RemoveBattleTooltips>>
<<run _battleSystem = getBattleSystemService()>>
<<run _moves = _battleSystem.getMovesByClass(_args[0], $player)>>
<<if _moves.length > 0>>
<<for _move range _moves>>
<<run _previewHtml = getMoveCardPreviewHtml(_move, $player, $interactionNpc)>>
<<run _disableReason = getMoveAvailabilityReason(_move, $player)>>
<<set _btnClass = _disableReason == null ? "fight-move" : "fight-move fight-move--disabled">>
<<set _btnName = '<div class="' + _btnClass + '" data-tooltip="' + _move.description + '"><div class="move-name">_move.name</div><hr>' + _previewHtml + '</div>'>>
<<capture _move _btnName>>
<<include "CheckMoveRequirements">>
<<if _isMeet == false>>
<div class="btn-fight non-interacting"><<button _btnName >><</button>></div>
<<else>>
<div class="btn-fight"><<button _btnName >>
<<set $exitSexScene = false>>
<<run _enemyTryAttempt = (Random(0,1) == 1)>>
<<run _move.execute($player, $interactionNpc, _enemyTryAttempt)>>
<<include "CheckBattleState">>
<<if $playerIsDefense && $currentMove != "SexActive" && $currentMove != "SexPassive" && $exitSexScene == false>>
<<include "CalculateEnemyMove">>
<<append "#logtext" t8n>>$battleChatMessage<</append>>
<<set $battleChatMessage = "">>
<<run updateFightBars($player)>>
<<run updateFightBars($interactionNpc)>>
<<include "CheckBattleState">>
<<run setMoveType()>>
<<replace "#display-moves">><<DisplayMoves $currentMove>><</replace>>
<<run attachTooltips()>>
<<if $currentMove != "SexActive" && $currentMove != "SexPassive">>
<<replace "#battle-control">><<include "MovesControlButtons">><</replace>>
<<else>>
<<replace "#battle-control">><</replace>>
<</if>>
<<else>>
<<append "#logtext" t8n>>$battleChatMessage<</append>>
<<set $battleChatMessage = "">>
<<run updateFightBars($player)>>
<<run updateFightBars($interactionNpc)>>
<<replace "#battle-control">><</replace>>
<<include "CheckBattleState">>
<<if $currentMove != "SexActive" && $currentMove != "SexPassive" && $exitSexScene>>
<<replace "#battle-control">><<include "MovesControlButtons">><</replace>>
<</if>>
<<if $currentMove != "SexActive" && $currentMove != "SexPassive" && $exitSexScene == false && ($endOfSexBattle == false || $battleType != "SexFight")>>
<<replace "#display-moves">><<DisplayMoves "Defense">><</replace>>
<<else>>
<<replace "#display-moves">><<DisplayMoves $currentMove>><</replace>>
<</if>>
<<run attachTooltips()>>
<</if>>
<<run setupBattleLogAutoScroll()>>
<<if $currentMove != "SexActive" && $currentMove != "SexPassive" && $exitSexScene == false>>
<<set $playerIsDefense = !$playerIsDefense>>
<</if>>
<</button>></div>
<</if>>
<</capture>>
<</for>>
<</if>>
<</widget>>
<<widget "CheckSexOrientation">>
<<set _mainChar = _args[0]>>
<<set _secondChar = _args[1]>>
<<if _mainChar.info.sexualPreference == "Bi">>
<<set _result = true>>
<<elseif _mainChar.info.sexualPreference == "Manly" && _secondChar.gender() == "Male">>
<<set _result = true>>
<<elseif _mainChar.info.sexualPreference == "Feminine" && _secondChar.gender() == "Female">>
<<set _result = true>>
<<else>>
<<set _result = false>>
<</if>>
<</widget>><<nobr>>
<<include "UpdateAll">>
<div class="padding-top">
<div class="btn"><<button "Fight" "StartFight">><</button>></div>
</div>
<div class="padding-top">
<div class="btn"><<button "Auto-Fight">>
<<set $autoBattleResult = autoBattle($player, $interactionNpc)>>
<<set $autobattleMode = true>>
<<goto "AutoBattleResults">>
<</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<div class="autobattle-results">
<h2>Auto-Battle Results</h2>
<div class="results-section">
<<if $autoBattleResult.winner.info.isPlayer>>
<p class="result-winner victory">Victory!</p>
<<else>>
<p class="result-winner defeat">Defeat</p>
<</if>>
<p class="result-rounds">Rounds: <<print $autoBattleResult.rounds>></p>
</div>
<div class="results-stats">
<div class="stat-block player-stats">
<h3>$player.info.firstName</h3>
<p>Health: <span class="health-value"><<print $autoBattleResult.playerFinalHealth>></span> / <<print $autoBattleResult.playerMaxHealth>></p>
<p>Damage Dealt: <span class="damage-value"><<print $autoBattleResult.playerDamageDealt>></span></p>
</div>
<div class="stat-block enemy-stats">
<h3>$interactionNpc.info.firstName</h3>
<p>Health: <span class="health-value"><<print $autoBattleResult.enemyFinalHealth>></span> / <<print $autoBattleResult.enemyMaxHealth>></p>
<p>Damage Dealt: <span class="damage-value"><<print $autoBattleResult.enemyDamageDealt>></span></p>
</div>
</div>
<div class="padding-top">
<div class="btn"><<button "Continue">>
<<include "CheckBattleState">>
<</button>></div>
</div>
</div>
<style>
.autobattle-results {
text-align: center;
padding: 30px 40px;
background: linear-gradient(135deg, rgba(20, 20, 30, 0.95) 0%, rgba(30, 30, 45, 0.95) 100%);
border-radius: 16px;
border: 1px solid rgba(255, 255, 255, 0.1);
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.5), inset 0 1px 0 rgba(255, 255, 255, 0.05);
max-width: 550px;
margin: 20px auto;
backdrop-filter: blur(10px);
}
.autobattle-results h2 {
margin-bottom: 20px;
color: #fff;
font-size: 1.8em;
text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
padding-bottom: 15px;
}
.results-section {
margin-bottom: 25px;
}
.result-winner {
font-size: 1.6em;
font-weight: bold;
margin-bottom: 10px;
text-transform: uppercase;
letter-spacing: 2px;
}
.result-winner.victory {
color: #4caf50;
text-shadow: 0 0 20px rgba(76, 175, 80, 0.5);
}
.result-winner.defeat {
color: #f44336;
text-shadow: 0 0 20px rgba(244, 67, 54, 0.5);
}
.result-rounds {
color: #aaa;
font-size: 1.1em;
}
.results-stats {
display: flex;
justify-content: center;
gap: 30px;
margin: 25px 0;
}
.stat-block {
background: rgba(0, 0, 0, 0.4);
padding: 20px 30px;
border-radius: 12px;
min-width: 200px;
border: 1px solid rgba(255, 255, 255, 0.05);
}
.stat-block h3 {
margin-bottom: 15px;
color: #fff;
font-size: 1.2em;
}
.stat-block p {
margin: 8px 0;
color: #ccc;
font-size: 1em;
}
.health-value {
color: #4caf50;
font-weight: bold;
}
.damage-value {
color: #ff6b35;
font-weight: bold;
}
.player-stats {
border-left: 4px solid #4caf50;
}
.enemy-stats {
border-left: 4px solid #f44336;
}
.autobattle-results .padding-top {
margin-top: 20px;
}
</style>
<</nobr>><<nobr>>
<<done>>
<<script>>
var divs = document.getElementsByClassName('moves-container');
for (var i = 0; i < divs.length; i++) {
divs[i].style.display = 'none';
}
<</script>>
<<switch $currentMove >>
<<case "Attack">>
<<set $moveId = "attack-moves">>
<<case "Seduce">>
<<set $moveId = "seduce-moves">>
<<case "Items">>
<<set $moveId = "items-moves">>
<<case "Actions">>
<<set $moveId = "actions-moves">>
<</switch>>
<<run document.getElementById($moveId).style.display = 'flex'>>
<</done>>
<</nobr>><<nobr>>
<<if $battleSetControls == undefined>>
<<BattleControlButton "Attack">>
<<BattleControlButton "Seduce">>
<<BattleControlButton "Items">>
<<BattleControlButton "Actions">>
<<else>>
<<if $battleSetControls.attack == true>>
<<BattleControlButton "Attack" false>>
<<else>>
<<BattleControlButton "Attack" true>>
<</if>>
<<if $battleSetControls.seduce == true>>
<<BattleControlButton "Seduce" false>>
<<else>>
<<BattleControlButton "Seduce" true>>
<</if>>
<<if $battleSetControls.items == true>>
<<BattleControlButton "Items" false>>
<<else>>
<<BattleControlButton "Items" true>>
<</if>>
<<if $battleSetControls.actions == true>>
<<BattleControlButton "Actions" false>>
<<else>>
<<BattleControlButton "Actions" true>>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<run _disableReason = getMoveAvailabilityReason(_move, $player)>>
<<set _isMeet = _disableReason == null>>
<</nobr>><<nobr>>
<<if $interactionNpc == undefined>>
<<if $defender != undefined>>
<<set $interactionNpc = $defender>>
<<else>>
<<set $playerLose = false>>
<<FinishFight>>
<</if>>
<</if>>
<<if $interactionNpc != undefined && $interactionNpc.status.energy.value >= 80>>
<<set $enemyRestoreBattle = false>>
<</if>>
<<if $interactionNpc != undefined && $player.status.health.value > $player.status.health.min && $interactionNpc.status.health.value > $interactionNpc.status.health.min && $isFinishBattle != true>>
<<CheckSexOrientation $interactionNpc $player>>
<<run _enemyTurnStatus = resolveBattleTurnStart($interactionNpc)>>
<<include "CheckBattleState">>
<<if $interactionNpc != undefined && $player.status.health.value > $player.status.health.min && $interactionNpc.status.health.value > $interactionNpc.status.health.min && $isFinishBattle != true && _enemyTurnStatus.skippedTurn == false>>
<<run _enemyMovetypeRand = Random(0, 100)>>
<<set _battleSystem = getBattleSystemService()>>
<<set _itemHealMove = _battleSystem.getCharHealMove($interactionNpc)>>
<<set _itemEnergyMove = _battleSystem.getCharEnergyMove($interactionNpc)>>
<<if $interactionNpc != undefined && $interactionNpc.status.health.value < 50 && _itemHealMove != undefined && $quickHealBotUsed < 3 &&
$battleSetControls.items == true>>
<<set _moveEnemy = _itemHealMove>>
<<set $quickHealBotUsed += 1>>
<<elseif $interactionNpc != undefined && $interactionNpc.status.energy.value < 50 && _itemEnergyMove != undefined &&
$battleSetControls.items == true>>
<<set _moveEnemy = _itemEnergyMove>>
<<elseif $enemyRestoreBattle || ($interactionNpc != undefined && $interactionNpc.status.energy.value < 20 && _itemEnergyMove == undefined)>>
<<set _moveEnemy = _battleSystem.getCharWaitMove()>>
<<set $enemyRestoreBattle = true>>
<<elseif _enemyMovetypeRand >= (100 - getNpcSexualAttackChance($interactionNpc)) && $battleSetControls.seduce == true && _result == true>>
<<run _movesEnemy = _battleSystem.getMovesByClass("Seduce", $interactionNpc)>>
<<run _moveEnemy = _movesEnemy[Math.floor(Math.random() * _movesEnemy.length)]>>
<<elseif $battleSetControls.attack == true>>
<<run _movesEnemy = _battleSystem.getMovesByClass("Attack", $interactionNpc)>>
<<run _moveEnemy = _movesEnemy[Math.floor(Math.random() * _movesEnemy.length)]>>
<<else>>
<<set _moveEnemy = _battleSystem.getCharWaitMove()>>
<</if>>
<<run _moveEnemy.execute($interactionNpc, $player, $playerTryToAttempt)>>
<<include "CheckBattleState">>
<</if>>
<<if $interactionNpc != undefined && $player.status.health.value > $player.status.health.min && $interactionNpc.status.health.value > $interactionNpc.status.health.min && $isFinishBattle != true>>
<<run _playerTurnStatus = resolveBattleTurnStart($player)>>
<<include "CheckBattleState">>
<<if $interactionNpc != undefined && $player.status.health.value > $player.status.health.min && $interactionNpc.status.health.value > $interactionNpc.status.health.min && $isFinishBattle != true && _playerTurnStatus.skippedTurn>>
<<include "CalculateEnemyMove">>
<</if>>
<</if>>
<</if>>
<</nobr>><<nobr>>
<div class="item-filter">
<<if $filterType == "All">>
<div class="filter-button active"><<button "All" _curLoc>><<set $filterType = "All">><</button>></div>
<<else>>
<div class="filter-button"><<button "All" _curLoc>><<set $filterType = "All">><</button>></div>
<</if>>
<<if $filterType == "Clothing">>
<div class="filter-button active"><<button "Clothes" _curLoc>><<set $filterType = "Clothing">><</button>></div>
<<else>>
<div class="filter-button"><<button "Clothes" _curLoc>><<set $filterType = "Clothing">><</button>></div>
<</if>>
<<if $filterType == "Drug">>
<div class="filter-button active"><<button "Drugs" _curLoc>><<set $filterType = "Drug">><</button>></div>
<<else>>
<div class="filter-button"><<button "Drugs" _curLoc>><<set $filterType = "Drug">><</button>></div>
<</if>>
<<if $filterType == "Gift">>
<div class="filter-button active"><<button "Gift" _curLoc>><<set $filterType = "Gift">><</button>></div>
<<else>>
<div class="filter-button"><<button "Gift" _curLoc>><<set $filterType = "Gift">><</button>></div>
<</if>>
<<if $filterType == "Food">>
<div class="filter-button active"><<button "Food" _curLoc>><<set $filterType = "Food">><</button>></div>
<<else>>
<div class="filter-button"><<button "Food" _curLoc>><<set $filterType = "Food">><</button>></div>
<</if>>
<<if $filterType == "SexToy">>
<div class="filter-button active"><<button "Toys" _curLoc>><<set $filterType = "SexToy">><</button>></div>
<<else>>
<div class="filter-button"><<button "Toys" _curLoc>><<set $filterType = "SexToy">><</button>></div>
<</if>>
<<if $filterType == "Weapon">>
<div class="filter-button active"><<button "Weapons" _curLoc>><<set $filterType = "Weapon">><</button>></div>
<<else>>
<div class="filter-button"><<button "Weapons" _curLoc>><<set $filterType = "Weapon">><</button>></div>
<</if>>
<<if $filterType == "Ammunition">>
<div class="filter-button active"><<button "Ammo" _curLoc>><<set $filterType = "Ammunition">><</button>></div>
<<else>>
<div class="filter-button"><<button "Ammo" _curLoc>><<set $filterType = "Ammunition">><</button>></div>
<</if>>
</div>
<</nobr>><<nobr>>
<<include "UpdateStatBars">>
<<SetBackground>>
<<set _curLoc = passage()>>
/* Count items by type */
<<set _totalItems = 0>>
<<set _totalWeight = 0>>
<<for _item range $player.inventory.items>>
<<if _item.quantity > 0>>
<<set _totalItems += _item.quantity>>
<<set _totalWeight += (_item.weight * _item.quantity)>>
<</if>>
<</for>>
<div class="inventory-wrapper">
/* Inventory Header */
<div class="inventory-header">
<h2 class="inventory-title">
<span class="inventory-title-icon">🎒</span>
<span>Inventory</span>
</h2>
<div class="inventory-stats">
<div class="inventory-stat">
<span>📦</span>
<span>Items:</span>
<span class="inventory-stat-value"><<print _totalItems>></span>
</div>
<div class="inventory-stat">
<span>⚖️</span>
<span>Weight:</span>
<span class="inventory-stat-value"><<print _totalWeight.toFixed(1)>></span>
</div>
</div>
</div>
/* Filter Buttons */
<<include "Filter">>
/* D4: Search + sort UI for inventory */
<div class="inventory-search-bar">
<input type="search" class="inventory-search-input" placeholder="Search items…" id="inventory-search-input">
<select class="inventory-sort-select" id="inventory-sort-select">
<option value="name">Sort: Name</option>
<option value="type">Sort: Type</option>
<option value="recent">Sort: Recently added</option>
</select>
</div>
/* Items Grid */
<<if $player.inventory.items.size > 0>>
<<set _hasVisibleItems = false>>
<div class="inventory-grid">
<<for _item range $player.inventory.items>>
<<if _item.quantity <= 0>>
<<continue>>
<</if>>
/* Apply filter */
<<if $filterType != "All">>
<<set _filterItemType = -1>>
<<switch $filterType>>
<<case "Clothing">><<set _filterItemType = ItemType.Clothing>>
<<case "Drug">><<set _filterItemType = ItemType.Drugs>>
<<case "Gift">><<set _filterItemType = ItemType.Gift>>
<<case "Food">><<set _filterItemType = ItemType.Food>>
<<case "SexToy">><<set _filterItemType = ItemType.SexToy>>
<<case "Weapon">><<set _filterItemType = ItemType.Weapon>>
<<case "Ammunition">><<set _filterItemType = ItemType.Ammunition>>
<</switch>>
<<if _filterItemType != -1 && _item.type != _filterItemType>>
<<continue>>
<</if>>
<</if>>
<<set _hasVisibleItems = true>>
/* Determine item type string for styling */
<<set _itemTypeStr = "item">>
<<if _item.type == 0>><<set _itemTypeStr = "consumables">>
<<elseif _item.type == 1>><<set _itemTypeStr = "clothing">>
<<elseif _item.type == 2>><<set _itemTypeStr = "drug">>
<<elseif _item.type == 3>><<set _itemTypeStr = "gift">>
<<elseif _item.type == 4>><<set _itemTypeStr = "food">>
<<elseif _item.type == 5>><<set _itemTypeStr = "sextoy">>
<<elseif _item.type == 6>><<set _itemTypeStr = "weapon">>
<<elseif _item.type == 7>><<set _itemTypeStr = "ammunition">>
<</if>>
/* Get action button text */
<<set _actionText = "">>
<<set _actionIcon = "">>
<<if _item.type == ItemType.Clothing>>
<<set _actionText = "Put on">>
<<set _actionIcon = "👕">>
<<elseif _item.type == ItemType.Weapon>>
<<set _actionText = "Equip">>
<<set _actionIcon = "⚔️">>
<<elseif _item.type == ItemType.Food>>
<<set _actionText = "Eat">>
<<set _actionIcon = "🍽️">>
<<elseif _item.type == ItemType.Drugs>>
<<set _actionText = "Use">>
<<set _actionIcon = "💊">>
<<elseif _item.type != ItemType.Gift && _item.type != ItemType.SexToy && _item.type != ItemType.Ammunition>>
<<set _actionText = "Use">>
<<set _actionIcon = "✋">>
<</if>>
<<set _imgHtml = _item.getImg()>>
<<capture _item _itemTypeStr _actionText _actionIcon _imgHtml>>
<div class="inventory-item" data-type="<<print _itemTypeStr>>">
/* Item Image or Stats for Weapons/Ammo */
<<if _itemTypeStr == "weapon">>
/* Weapon Stats Display */
<div class="inventory-weapon-stats">
<<if _item.quantity > 1>>
<span class="inventory-item-quantity-badge"><<print _item.quantity>></span>
<</if>>
<span class="inventory-item-badge"><<print _itemTypeStr>></span>
<div class="weapon-stats-display-grid">
<div class="weapon-stat-row">
<span class="weapon-stat-icon">⚔️</span>
<span class="weapon-stat-label">Damage</span>
<span class="weapon-stat-val damage"><<print _item.additionalDetails.baseDamage || "N/A">></span>
</div>
<div class="weapon-stat-row">
<span class="weapon-stat-icon">🎯</span>
<span class="weapon-stat-label">Accuracy</span>
<span class="weapon-stat-val accuracy"><<print _item.additionalDetails.accuracyBonus || 0>>%</span>
</div>
<div class="weapon-stat-row">
<span class="weapon-stat-icon">📋</span>
<span class="weapon-stat-label">Type</span>
<span class="weapon-stat-val"><<print getWeaponTypeName(_item.additionalDetails.weaponType) || "Unknown">></span>
</div>
<div class="weapon-stat-row">
<span class="weapon-stat-icon">📖</span>
<span class="weapon-stat-label">Requires</span>
<<set _skillName = _item.additionalDetails.requiredSkill === "firearmProficiency" ? "Firearm Prof." : "Strength">>
<<set _playerSkill = _item.additionalDetails.requiredSkill === "firearmProficiency" ? $player.attributes.firearmProficiency.value : $player.attributes.strength.value>>
<<set _meetsReq = _playerSkill >= _item.additionalDetails.minSkillLevel>>
<span class="weapon-stat-val <<if _meetsReq>>met<<else>>unmet<</if>>"><<print _skillName>> Lvl <<print _item.additionalDetails.minSkillLevel>></span>
</div>
<<if _item.additionalDetails.ammoType>>
<div class="weapon-stat-row">
<span class="weapon-stat-icon">🔫</span>
<span class="weapon-stat-label">Ammo</span>
<span class="weapon-stat-val ammo"><<print _item.additionalDetails.ammoType>></span>
</div>
<</if>>
</div>
</div>
<<elseif _itemTypeStr == "ammunition">>
/* Ammunition Stats Display */
<div class="inventory-ammo-stats">
<<if _item.quantity > 1>>
<span class="inventory-item-quantity-badge"><<print _item.quantity>></span>
<</if>>
<span class="inventory-item-badge"><<print _itemTypeStr>></span>
<div class="ammo-stats-display">
<div class="ammo-icon">🔫</div>
<div class="ammo-info">
<div class="ammo-type"><<print _item.additionalDetails.ammoType || "Standard">> Ammo</div>
<div class="ammo-rounds"><<print _item.quantity>> rounds</div>
</div>
</div>
</div>
<<else>>
/* Regular Item Image */
<div class="inventory-item-image" @data-item-img="_imgHtml" @data-item-name="_item.name">
<<if _item.img && _item.img != "">>
<img class="inv-img-clickable" @src="_item.img" @alt="_item.name">
<<else>>
<div class="inventory-item-no-image">
<<if _itemTypeStr == "clothing">>👕
<<elseif _itemTypeStr == "drug">>💊
<<elseif _itemTypeStr == "gift">>🎁
<<elseif _itemTypeStr == "food">>🍔
<<elseif _itemTypeStr == "sextoy">>💋
<<else>>📦
<</if>>
</div>
<</if>>
/* Quantity Badge */
<<if _item.quantity > 1>>
<span class="inventory-item-quantity-badge"><<print _item.quantity>></span>
<</if>>
/* Type Badge */
<span class="inventory-item-badge"><<print _itemTypeStr>></span>
</div>
<</if>>
/* Item Content */
<div class="inventory-item-content">
/* Title */
<h3 class="inventory-item-title">
<<link _item.name>>
<<run Dialog.create(_item.name)>>
<<run Dialog.wiki(_item.getImg())>>
<<run Dialog.open()>>
<</link>>
</h3>
/* Effect (if any) */
<<if _item.effect && _item.effect.description>>
<div class="inventory-item-effect">
<span>✨</span>
<span><<print _item.effect.description>></span>
</div>
<</if>>
/* Info Row */
<div class="inventory-item-info">
<div class="inventory-item-stat">
<span class="inventory-item-stat-icon">📦</span>
<span>Qty:</span>
<span class="inventory-item-stat-value"><<print _item.quantity>></span>
</div>
<<if _item.weight && _item.weight > 0>>
<div class="inventory-item-stat">
<span class="inventory-item-stat-icon">⚖️</span>
<span class="inventory-item-stat-value"><<print _item.weight>></span>
</div>
<</if>>
<<if _item.price && _item.price > 0>>
<div class="inventory-item-stat">
<span class="inventory-item-stat-icon">💰</span>
<span class="inventory-item-stat-value">$<<print _item.price>></span>
</div>
<</if>>
</div>
</div>
/* Action Buttons */
<div class="inventory-item-actions">
<<if _actionText != "">>
<<set _btnLabel = _actionIcon + " " + _actionText>>
<div class="inventory-action-btn primary">
<<button _btnLabel "Inventory">>
<<if $player.inventory.getItemByName(_item.name)>>
<<run $player.useItem(_item, $player)>>
<<run $player.inventory.removeItem(_item.name, 1)>>
<</if>>
<</button>>
</div>
<</if>>
<div class="inventory-action-btn danger">
<<button "🗑️ Discard" "Inventory">>
<<run $player.inventory.removeItem(_item.name, 1)>>
<</button>>
</div>
</div>
</div>
<</capture>>
<</for>>
/* Show empty message if filter hides all items */
<<if !_hasVisibleItems>>
<div class="inventory-empty">
<div class="inventory-empty-icon">📭</div>
<div class="inventory-empty-text">No items in this category</div>
<div class="inventory-empty-hint">Try selecting a different filter</div>
</div>
<</if>>
</div>
<<else>>
<div class="inventory-grid">
<div class="inventory-empty">
<div class="inventory-empty-icon">🎒</div>
<div class="inventory-empty-text">Your inventory is empty</div>
<div class="inventory-empty-hint">Visit shops to buy items</div>
</div>
</div>
<</if>>
/* Back Button */
<div class="shop-back-btn padding-top">
<<BackButton "<<unset $filterType>> <<set $canShowStatsBtn = true>>">>
</div>
</div>
<<done>>
<<script>>
$('.inv-img-clickable').off('click').on('click', function() {
var container = $(this).closest('.inventory-item-image');
var imgHtml = container.attr('data-item-img');
var itemName = container.attr('data-item-name');
Dialog.create(itemName);
Dialog.wiki(imgHtml);
Dialog.open();
});
/* D4: client-side search and sort over rendered .inventory-item nodes */
var $search = $('#inventory-search-input');
var $sort = $('#inventory-sort-select');
var $grid = $('.inventory-grid');
function applyInventoryFilter() {
var q = String($search.val() || '').trim().toLowerCase();
$grid.find('.inventory-item').each(function() {
var text = ($(this).text() || '').toLowerCase();
$(this).toggle(q === '' || text.indexOf(q) !== -1);
});
}
function applyInventorySort() {
var mode = String($sort.val() || 'name');
var items = $grid.children('.inventory-item').get();
items.sort(function(a, b) {
if (mode === 'type') {
var ta = a.getAttribute('data-type') || '';
var tb = b.getAttribute('data-type') || '';
if (ta !== tb) return ta.localeCompare(tb);
}
var na = (a.querySelector('.inventory-item-name')?.textContent || a.textContent || '').trim().toLowerCase();
var nb = (b.querySelector('.inventory-item-name')?.textContent || b.textContent || '').trim().toLowerCase();
return na.localeCompare(nb);
});
items.forEach(function(el) { $grid.append(el); });
}
$search.off('input').on('input', applyInventoryFilter);
$sort.off('change').on('change', applyInventorySort);
<</script>>
<</done>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if $playerlock == true>>
<<ChatMessage "You're locked in a chastity cage and can't jerk off.">>
<div class="padding-top"><<BackButton "<<set $canShowStatsBtn = true>> <<set $gameSettings.allowSaves = true>>">></div>
<<else>>
<<switch $player.gender()>>
<<case "Male">>
<<set _pick = 'Media\\Sex\\JerkOff\\Male\\' + Random(0, 6, false) + '.mp4'>>
<<case "Female">>
<<set _pick = 'Media\\Sex\\JerkOff\\Female\\' + Random(0, 8, false) + '.mp4'>>
<<case "Shemale">>
<<set _pick = 'Media\\Sex\\JerkOff\\Shemale\\0.mp4'>> /* only Shemale/0.mp4 ships; was Random(0,1) → broke ~50% */
<</switch>>
<<Video _pick>>
<<ChatMessage "You're jerking off.">>
<div class="padding-top">
<div class="btn"><<button "Cum" "Jerk_off_Cum">><</button>></div>
<div class="btn"><<button "Edge (train stamina)" "Jerk_off_Edge">><</button>></div>
</div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set $player.status.potency.decrease(1)>>
<<set $player.status.horny.value = $player.status.horny.min>>
<<run $player.dailyEvents.registerEvent($player.info.id, "SexualActivityToday", 1)>>
<<switch $player.gender()>>
<<case "Male">>
<<set _pick = 'Media\\Sex\\JerkOff\\Male\\Cum\\' + Random(0, 2, false) + '.mp4'>>
<<case "Female">>
<<set _pick = 'Media\\Sex\\JerkOff\\Female\\Cum\\' + Random(0, 2, false) + '.mp4'>>
<<case "Shemale">>
<<set _pick = 'Media\\Sex\\JerkOff\\Shemale\\Cum\\' + Random(0, 2, false) + '.mp4'>>
<</switch>>
<<Video _pick>>
<<ChatMessage "You're cumming.">>
<<BackButton "<<set $canShowStatsBtn = true>> <<set $gameSettings.allowSaves = true>>">>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if $player.status.energy.value < 15>>
<<ChatMessage "You're too worn out to keep edging.">>
<<else>>
<<SpendEnergy $player 15>>
<<SpendTimeWithoutUpdate 15>>
<<run $player.status.horny.increase(Random(5, 15))>>
<<set _xp = Random(5, 15)>>
<<SetCharProgression $player 'sexStamina' _xp true>>
<<run $player.dailyEvents.registerEvent($player.info.id, "SexualActivityToday", 1)>>
<<ChatMessage "You edge yourself to the brink and hold back, training your stamina.">>
<</if>>
<div class="padding-top">
<div class="btn"><<button "Continue" "Jerk_off">><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if $playerlock == true>>
<<ChatMessage "You're locked in a chastity cage and can't jerk off.">>
<div class="padding-top"><<BackButton "<<set $canShowStatsBtn = true>> <<set $gameSettings.allowSaves = true>>">></div>
<<elseif $player.status.potency.value == $player.status.potency.min>>
<<ChatMessage "Lack of sexual stamina">>
<div class="padding-top">
<<BackButton "<<set $canShowStatsBtn = true>> <<set $gameSettings.allowSaves = true>>">>
</div>
<<else>>
<div class="padding-top">
<div class="btn-container">
<div class="btn"><<button "Dildo(Anal)" "DildoAction">><<set $trainType = "Anal">><</button>></div>
<<if $player.genitalia() == "Vagina">>
<div class="btn"><<button "Dildo(Vag)" "DildoAction">><<set $trainType = "Vag">><</button>></div>
<</if>>
<div class="btn"><<button "Dildo(Oral)" "DildoAction">><<set $trainType = "Oral">><</button>></div>
</div>
</div>
<div class="padding-top">
<<BackButton "<<set $canShowStatsBtn = true>> <<set $gameSettings.allowSaves = true>>">>
</div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if $playerlock == true>>
<<ChatMessage "You're locked in a chastity cage and can't jerk off.">>
<div class="padding-top"><<BackButton "<<set $canShowStatsBtn = true>> <<set $gameSettings.allowSaves = true>>">></div>
<<else>>
<<switch $trainType>>
<<case "Anal">>
<<switch $player.gender()>>
<<case "Female">>
<<set _pick = 'Media\\Sex\\Dildo\\' + $player.gender() + '\\Anal\\' + Random(0, 8, false) + '.mp4'>>
<<case "Male">>
<<run $player.status.horny.increase(Random(5, 20))>>
<<set _pick = 'Media\\Sex\\Dildo\\' + $player.gender() + '\\' + Random(0, 9, false) + '.mp4'>>
<<case "Shemale">>
<<run $player.status.horny.increase(Random(5, 20))>>
<<set _pick = 'Media\\Sex\\Dildo\\' + $player.gender() + '\\' + Random(0, 9, false) + '.mp4'>>
<</switch>>
<<run $player.body.anusSize.increase(Random(0.3, 0.8, true))>>
<<case "Vag">>
<<run $player.body.vaginaSize.increase(Random(0.3, 0.8, true))>>
<<run $player.status.horny.increase(Random(5, 20))>>
<<set _pick = 'Media\\Sex\\Dildo\\' + $player.gender() + '\\' + Random(0, 11, false) + '.mp4'>>
<<case "Oral">>
<<switch $player.gender()>>
<<case "Female">>
<<set _pick = 'Media\\Sex\\Dildo\\' + $player.gender() + '\\Oral\\' + Random(0, 1, false) + '.mp4'>>
<<case "Male">>
<<set _pick = 'Media\\Sex\\Dildo\\' + $player.gender() + '\\Oral\\' + Random(0, 2, false) + '.mp4'>>
<<case "Shemale">>
<<set _pick = 'Media\\Sex\\Dildo\\Female\\Oral\\' + Random(0, 1, false) + '.mp4'>>
<</switch>>
<<case "Cum">>
<<set $player.status.potency.decrease(1)>>
<<set $player.status.horny.value = $player.status.horny.min>>
<<switch $player.gender()>>
<<case "Female">>
<<set _pick = 'Media\\Sex\\Dildo\\' + $player.gender() + '\\Cum\\' + Random(0, 1, false) + '.mp4'>>
<<case "Male">>
<<set _pick = 'Media\\Sex\\Dildo\\' + $player.gender() + '\\Cum\\' + Random(0, 5, false) + '.mp4'>>
<<case "Shemale">>
<<set _pick = 'Media\\Sex\\Dildo\\' + $player.gender() + '\\Cum\\' + Random(0, 5, false) + '.mp4'>>
<</switch>>
<</switch>>
<<Video _pick>>
<<if $player.status.horny.value >= $player.status.horny.max && $trainType != "Oral">>
<div class="padding-top">
<div class="btn"><<button "Cum" "DildoAction">><<set $trainType = "Cum">> <<set $player.status.horny.value = $player.status.horny.min>><</button>></div>
</div>
<<else>>
<div class="padding-top">
<div class="btn"><<button "Continue" "DildoType">><<unset $trainType>><</button>></div>
</div>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _dest = ($recapDestination != undefined) ? $recapDestination : $player.info.currentLocation>>
<<set _todayNum = $dateTime.year * 12 * 31 + $dateTime.month * 31 + $dateTime.day>>
<<set _sinceAbs = ($recapSince != undefined) ? $recapSince : -1>>
/* A call only counts as "missed" if it was queued during this sleep (today). */
<<set _missedName = ($pendingPhoneCall != undefined && $pendingPhoneCall.day === _todayNum) ? $pendingPhoneCall.firstName : "">>
<<set _recent = (typeof window.getJournalEntries === "function") ? window.getJournalEntries({ maxAgeDays: 2, limit: 24 }) : []>>
/* Only relationship drama logged after this sleep began (abs hour >= snapshot). */
<<set _drama = _recent.filter(e => (e.type === "relation_jump" || e.type === "relation_drop") && (((e.day || 0) * 24 + (e.hour || 0)) >= _sinceAbs))>>
/* New texts that arrived during this sleep (queued on the new day). */
<<set _newTexts = Array.isArray($npcTexts) ? $npcTexts.filter(t => t.day === _todayNum).length : 0>>
/* The night world-sim ran only when the player went to bed before 22:00
($nightSimRan, set by the Sleep widget). Offer the openable night log only
then - a later bedtime skips the sim, so there's no night to show.
_hasNight = the sim captured notable around-town activity worth a teaser. */
<<set _simRan = ($nightSimRan === true)>>
<<set _hasNight = (typeof window.hasNightLog === "function") ? window.hasNightLog() : false>>
/* A live-in partner's night: declared activity only, never a hidden target. */
<<set _partnerNights = (typeof window.GetPlayerPartnerNightRecap === "function") ? window.GetPlayerPartnerNightRecap() : []>>
<<set _streetNews = (typeof gangMorningHeadlines === "function") ? gangMorningHeadlines() : []>>
<<set _streetNotes = (typeof careerMorningNotes === "function") ? careerMorningNotes() : []>>
/* Meetings agreed for today (playerNpcMeetings.ts). */
<<set _meetToday = (setup.playerNpcMeetings) ? setup.playerNpcMeetings.recapLines() : []>>
<<set _hasNews = (_missedName !== "") || (_drama.length > 0) || (_newTexts > 0) || (_partnerNights.length > 0) || _simRan || (_streetNews.length > 0) || (_streetNotes.length > 0) || (_meetToday.length > 0)>>
<<if not _hasNews>>
<<run typeof clearNightLog === 'function' && clearNightLog()>>
<<unset $recapDestination>>
<<unset $recapSince>>
<<unset $nightSimRan>>
<<goto _dest>>
<<else>>
<div class="phone-content-stack" style="max-width: 520px; margin: 0 auto;">
<h2 style="margin: 0 0 2px;">🌅 A new day</h2>
<div style="color:#9aa0b4; font-size:13px; margin-bottom:12px;">While you were away…</div>
<<if _missedName !== "">>
<div class="phone-card" style="border:1px solid #d4a04a; background:#d4a04a14; margin-bottom:8px;">
<span style="font-size:18px;">📞</span> You missed a call from <b><<print _missedName>></b>. <span style="color:#9aa0b4;">It's waiting on your phone.</span>
</div>
<</if>>
<<if _newTexts > 0>>
<div class="phone-card" style="border:1px solid #5b8def; background:#5b8def14; margin-bottom:8px;">
<span style="font-size:18px;">💬</span> You have <b><<print _newTexts>></b> new <<if _newTexts === 1>>message<<else>>messages<</if>> waiting.
</div>
<</if>>
<<for _i, _ev range _drama>>
<div class="phone-card" style="margin-bottom:8px;">
<span style="font-size:18px;"><<if _ev.type === "relation_jump">>💞<<else>>💔<</if>></span> <<print _ev.summary>>
</div>
<</for>>
<<for _i, _pn range _partnerNights>>
/* A macro inside an HTML attribute breaks the tag; build the style string first. */
<<set _pnStyle = "margin-bottom:8px;" + (_pn.tone === "concern" ? " border:1px solid #d4a04a; background:#d4a04a14;" : "")>>
<<set _pnIcon = (_pn.tone === "calm" || _pn.tone === "shift") ? "🏠" : "🌙">>
<div class="phone-card" @style="_pnStyle">
<span style="font-size:18px;"><<print _pnIcon>></span> <<print _pn.line>>
</div>
<</for>>
<<if _meetToday.length > 0>>
<div class="phone-card" style="border:1px solid #6fbf73; background:#6fbf7314; margin-bottom:8px;">
<span style="font-size:18px;">📅</span> <b>Today</b>
<ul class="gang-news">
<<for _i, _mt range _meetToday>><li><<print _mt>></li><</for>>
</ul>
</div>
<</if>>
<<if _streetNotes.length > 0>>
<div class="phone-card gang-morning-news" style="margin-bottom:8px;">
<span style="font-size:18px;">📨</span> <b>Word for you</b>
<ul class="gang-news">
<<for _i, _snote range _streetNotes>><li><<print _snote>></li><</for>>
</ul>
</div>
<</if>>
<<if _streetNews.length > 0>>
<div class="phone-card gang-morning-news" style="margin-bottom:8px;">
<span style="font-size:18px;">🗞</span> <b>Street Chronicle</b>
<ul class="gang-news">
<<for _i, _sn range _streetNews>><li><<print _sn>></li><</for>>
</ul>
</div>
<</if>>
<<if _simRan>>
<<if _hasNight>>
<div class="phone-card" style="border:1px solid #8a7dff; background:#8a7dff14; margin-bottom:8px;">
<span style="font-size:18px;">🌙</span> Things stirred around town while you slept.
</div>
<</if>>
<div class="btn" style="margin-top:8px;"><<button "🌙 See the night's log" "NightLog">><</button>></div>
<</if>>
<div class="btn" style="margin-top:8px;"><<button "Start the day" _dest>><<run typeof clearNightLog === 'function' && clearNightLog()>><<unset $recapDestination>><<unset $recapSince>><<unset $nightSimRan>><</button>></div>
</div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<ShowNpcIcon $interactionNpc>>
<<Chat $interactionNpc $genderReactionText>>
<div class="padding-top">
<div class="btn"><<button "Continue" "CharacterInteractions">><<unset $genderReactionText>><</button>></div>
</div>
<</nobr>><<nobr>>
<<set _dest = ($recapDestination != undefined) ? $recapDestination : $player.info.currentLocation>>
<<set _sum = (typeof window.getNightLogSummary === "function") ? window.getNightLogSummary() : { shifts: [], pairs: [], statChips: [], stats: { totalPairs: 0 }, filters: [], impactFilters: [], total: 0 }>>
<div class="night-log-overlay">
<div class="night-log-panel">
<div class="night-log-header">
<div class="night-log-emblem">🌙</div>
<div class="night-log-heading">
<span class="night-log-eyebrow">While you slept</span>
<div class="night-log-title">The night's events</div>
</div>
</div>
<div class="night-log-content">
<<if _sum.statChips.length > 0>>
<div class="night-log-section">
<div class="night-log-section-title">📊 Tonight across town<<if _sum.stats.totalPairs > 0>> · <<print _sum.stats.totalPairs>> pair<<if _sum.stats.totalPairs !== 1>>s<</if>><</if>></div>
<div class="night-log-stats">
<<for _i, _c range _sum.statChips>>
<div class="night-log-stat" @style="'--nl-row-accent:' + _c.accent">
<span class="night-log-stat-icon"><<print _c.icon>></span> <<print _c.label>>
</div>
<</for>>
</div>
</div>
<</if>>
<<if _sum.shifts.length > 0>>
<div class="night-log-section">
<div class="night-log-section-title">💘 Relationship shifts</div>
<<for _i, _s range _sum.shifts>>
<div class="night-log-card" @style="'--nl-row-accent:' + _s.accent">
<span class="night-log-card-icon"><<print _s.icon>></span>
<div class="night-log-card-body"><span class="night-log-card-text"><<print _s.text>></span></div>
</div>
<</for>>
</div>
<</if>>
<<if _sum.pairs.length > 0>>
<div class="night-log-section">
<div class="night-log-section-title">🌃 Around town · <<print _sum.pairs.length>></div>
/* Single filter row (All / Friendship / Love / Sex). Buttons carry their
key in @data-nl-key; a one-time delegated click handler (initNightLogFilters)
calls filterNightLog, which hides cards by @data-nl-tags. No inline onclick
(SugarCube doesn't run macros in event attributes) and no re-render. */
<<if _sum.impactFilters.length > 1>>
<div class="night-log-filters">
<<for _i, _f range _sum.impactFilters>>
<button type="button" @class="_i === 0 ? 'night-log-filter-btn is-active' : 'night-log-filter-btn'" @data-nl-key="_f.key"><<print _f.label>> <span class="night-log-filter-count"><<print _f.count>></span></button>
<</for>>
</div>
<</if>>
<div class="night-log-pairs">
<<for _i, _p range _sum.pairs>>
<div @class="_p.affair ? 'night-log-card night-log-card--affair' : 'night-log-card'" @data-nl-tags="_p.tags" @style="'--nl-row-accent:' + _p.accent">
<span class="night-log-card-icon"><<print _p.icon>></span>
<div class="night-log-card-body">
<span class="night-log-card-text"><<print _p.text>></span>
<<if _p.effect>><span @class="'night-log-card-effect night-log-card-effect--' + _p.effectTone"><<print _p.effect>></span><</if>>
</div>
<span class="night-log-card-tag"><<print _p.tag>></span>
</div>
<</for>>
</div>
</div>
<</if>>
<<if _sum.total === 0>>
<div class="night-log-empty">
<div class="night-log-empty-icon">😴</div>
<div class="night-log-empty-text">A quiet night. Nothing stirred around town while you slept.</div>
</div>
<</if>>
</div>
<div class="night-log-footer">
<div class="btn night-log-btn-ghost"><<button "← Back" "MorningRecap">><</button>></div>
<div class="btn night-log-btn-primary"><<button "Start the day ▸" _dest>><<run typeof clearNightLog === 'function' && clearNightLog()>><<unset $recapDestination>><<unset $recapSince>><<unset $nightSimRan>><</button>></div>
</div>
</div>
</div>
<</nobr>><<widget "OpenNpcClothingManager">>
<<set $npcClothingContext = _args[0] ?? "interaction">>
<<unset $npcClothingFeedback>>
/* The interaction page remains mounted behind the dialog. Re-render the
current passage after either the close button or the X closes this dialog,
so relationship bars immediately reflect refusal penalties. */
<<run $(document).off(':dialogclosed.npcClothingRefresh').one(':dialogclosed.npcClothingRefresh', function () { Engine.show(); })>>
<<run Dialog.create("Manage " + $interactionNpc.info.firstName + "'s outfit")>>
<<run Dialog.wiki('<<NpcClothingManagerBody>>')>>
<<run Dialog.open()>>
<</widget>>
<<widget "NpcClothingManagerBody">>
<<set _npcClothingDefeated = $npcClothingContext == "defeated">>
<<set _npcClothingChance = _npcClothingDefeated ? 100 : getNpcClothingAcceptanceChance($player, $interactionNpc)>>
<<set _npcEquippedItems = getNpcEquippedClothing($interactionNpc)>>
<<set _playerClothingChoices = getPlayerNpcClothingChoices($player)>>
<section id="npc-clothing-manager-body" class="npc-clothing-manager">
<header class="npc-clothing-manager__header">
<div>
<div class="npc-clothing-manager__eyebrow">Outfit exchange</div>
<h3><<print $interactionNpc.info.firstName>>'s clothing</h3>
</div>
<div class="npc-clothing-manager__chance">
<<if _npcClothingDefeated>>Victory access: guaranteed<<else>>Base acceptance today: <<print _npcClothingChance>>%<</if>>
</div>
</header>
<<if $npcClothingFeedback != undefined>>
<div @class="$npcClothingFeedback.success ? 'npc-clothing-feedback npc-clothing-feedback--success' : 'npc-clothing-feedback npc-clothing-feedback--failure'">
<<if $npcClothingFeedback.success>>
<<if $npcClothingFeedback.replacedItemName>>
<<print $interactionNpc.info.firstName>> puts on <b><<print $npcClothingFeedback.itemName>></b>. You receive <b><<print $npcClothingFeedback.replacedItemName>></b>.
<<elseif $npcClothingFeedback.itemName>>
Clothing moved successfully: <b><<print $npcClothingFeedback.itemName>></b>.
<</if>>
<<elseif $npcClothingFeedback.reason == "refused">>
<<print $interactionNpc.info.firstName>> refuses. The chance was <<print $npcClothingFeedback.chance>>%.
<<if $npcClothingFeedback.friendshipLoss != undefined>>
Friendship -<<print $npcClothingFeedback.friendshipLoss>>, anger +<<print $npcClothingFeedback.angerGain>>. Further attempts are harder today.
<<elseif $npcClothingFeedback.chance == 0>>
They will not consider another clothing change today.
<</if>>
<<elseif $npcClothingFeedback.reason == "already_equipped">>
That exact item is already equipped in this slot.
<<else>>
The clothing item is no longer available.
<</if>>
</div>
<</if>>
<div class="npc-clothing-manager__section-heading">
<div><span>On NPC</span><small>Take any equipped item</small></div>
<b><<print _npcEquippedItems.length>></b>
</div>
<<if _npcEquippedItems.length == 0>>
<div class="npc-clothing-manager__empty">No clothing is currently equipped.</div>
<<else>>
<div class="npc-clothing-manager__grid">
<<for _npcClothingItem range _npcEquippedItems>>
<article class="npc-clothing-card">
<img @src="_npcClothingItem.img" @alt="_npcClothingItem.name">
<div class="npc-clothing-card__body">
<span class="npc-clothing-card__slot"><<print getClothingSlotLabel(_npcClothingItem.slot)>></span>
<h4><<print _npcClothingItem.name>></h4>
<small><<print getClothingStyleLabel(_npcClothingItem.style)>> · <<print _npcClothingItem.gender>></small>
<div class="npc-clothing-card__stats">
<span>P <<print _npcClothingItem.stats.protection>></span>
<span>B <<print _npcClothingItem.stats.beauty>></span>
<span>S <<print _npcClothingItem.stats.sexuality>></span>
</div>
<<set _takeChance = _npcClothingDefeated ? 100 : getNpcClothingActionChance($player, $interactionNpc, _npcClothingItem)>>
<<set _takeButtonText = _npcClothingDefeated ? "Take" : "Take (" + _takeChance + "%)">>
<<capture _npcClothingItem>>
<<if _takeChance > 0>>
<<button _takeButtonText>>
<<set $npcClothingFeedback = takeNpcClothing($player, $interactionNpc, _npcClothingItem.id, _npcClothingDefeated)>>
<<replace "#npc-clothing-manager-body">><<NpcClothingManagerBody>><</replace>>
<</button>>
<<else>>
<button type="button" disabled>Take (0%)</button>
<</if>>
<</capture>>
</div>
</article>
<</for>>
</div>
<</if>>
<div class="npc-clothing-manager__section-heading npc-clothing-manager__section-heading--inventory">
<div><span>Your clothing</span><small>Choose any item to put on the NPC</small></div>
<b><<print _playerClothingChoices.length>></b>
</div>
<<if _playerClothingChoices.length == 0>>
<div class="npc-clothing-manager__empty">You have no clothing in your inventory.</div>
<<else>>
<div class="npc-clothing-manager__grid">
<<for _playerClothingItem range _playerClothingChoices>>
<article class="npc-clothing-card npc-clothing-card--inventory">
<img @src="_playerClothingItem.img" @alt="_playerClothingItem.name">
<div class="npc-clothing-card__body">
<span class="npc-clothing-card__slot"><<print getClothingSlotLabel(_playerClothingItem.slot)>></span>
<h4><<print _playerClothingItem.name>></h4>
<small><<print getClothingStyleLabel(_playerClothingItem.style)>> · <<print _playerClothingItem.gender>></small>
<div class="npc-clothing-card__stats">
<span>P <<print _playerClothingItem.stats.protection>></span>
<span>B <<print _playerClothingItem.stats.beauty>></span>
<span>S <<print _playerClothingItem.stats.sexuality>></span>
</div>
<<set _currentSlotItem = $interactionNpc.clothes.getFirstClothingItemByType(_playerClothingItem.slot)>>
<<set _equipChance = _npcClothingDefeated ? 100 : getNpcClothingActionChance($player, $interactionNpc, _playerClothingItem, _currentSlotItem)>>
<<set _equipButtonText = _npcClothingDefeated ? "Put on NPC" : "Put on NPC (" + _equipChance + "%)">>
<<capture _playerClothingItem>>
<<if _equipChance > 0>>
<<button _equipButtonText>>
<<set $npcClothingFeedback = equipNpcClothingFromPlayer($player, $interactionNpc, _playerClothingItem.id, _npcClothingDefeated)>>
<<replace "#npc-clothing-manager-body">><<NpcClothingManagerBody>><</replace>>
<</button>>
<<else>>
<button type="button" disabled>Put on NPC (0%)</button>
<</if>>
<</capture>>
</div>
</article>
<</for>>
</div>
<</if>>
</section>
<</widget>><<nobr>>
<<include "UpdateAll">>
<<set _phoneContacts = getPhoneContactCards($player)>>
<div class="phone-ui-shell">
<div class="phone-device">
<div class="phone-device-notch"></div>
<<PhoneStatusBar>>
<div class="phone-appbar">
<div class="phone-appbar-leading">
<div class="phone-nav-btn btn"><<button "Back" $player.info.currentLocation>><<set $gameSettings.allowSaves = true>><<set $canShowStatsBtn = true>><</button>></div>
</div>
<div class="phone-appbar-body">
<div class="phone-appbar-kicker">Viceburg Mobile</div>
<div class="phone-appbar-title">Contacts</div>
</div>
<div class="phone-appbar-trailing"></div>
<div class="phone-appbar-apps">
<<set _msgLabel = ($npcTextsUnread != undefined && $npcTextsUnread > 0) ? ("💬 " + $npcTextsUnread) : "💬">>
<div class="phone-nav-btn btn"><<button _msgLabel "PhoneMessages">><</button>></div>
<div class="phone-nav-btn btn"><<button "📖 Journal" "PhoneJournal">><</button>></div>
<<set _plansCount = setup.playerNpcMeetings.calendar().length>>
<<set _plansLabel = _plansCount > 0 ? ("📅 " + _plansCount) : "📅">>
<div class="phone-nav-btn btn"><<button _plansLabel "PhoneCalendar">><<unset $calendarResult>><</button>></div>
<div class="phone-nav-btn btn"><<button "🗺 Streets" "GangHub">><</button>></div>
</div>
</div>
<div class="phone-screen">
<div class="phone-content-stack">
<<if $pendingPhoneCall != undefined>>
<div class="phone-card" style="border: 1px solid #d4a04a; background: #d4a04a14;">
<div style="display:flex; align-items:center; gap:10px;">
<div style="font-size:24px;">📞</div>
<div style="flex:1; min-width:0;">
<div style="font-weight:600;">Incoming call</div>
<div style="font-size:13px; color:#9aa0b4;"><<print $pendingPhoneCall.firstName>> is trying to reach you.</div>
</div>
</div>
<div style="display:flex; gap:8px; margin-top:10px;">
<div class="btn" style="flex:1;"><<button "Answer" "PhoneCall_Incoming">><</button>></div>
<div class="btn" style="flex:1;"><<button "Dismiss">><<unset $pendingPhoneCall>><<goto "Phone">><</button>></div>
</div>
</div>
<</if>>
<<if _phoneContacts.length > 0>>
<div class="phone-card phone-card--search-only">
<label class="phone-search-field">
<input type="text" id="phone-contact-search-input" class="phone-search-input" placeholder="Search contacts" oninput="filterPhoneContacts(this.value)">
</label>
</div>
<div class="phone-empty-card phone-empty-card--search" id="phone-no-search-results" style="display: none;">
<div class="phone-empty-title">No matches found</div>
<div class="phone-empty-copy">Try a different name or clear the search field.</div>
</div>
<div class="phone-contact-list" id="phone-contact-list">
<<for _i = 0; _i < _phoneContacts.length; _i++>>
<<set _card = _phoneContacts[_i]>>
<<capture _card>>
<div class="phone-contact-card" @data-name="_card.nameLower" @style="'--phone-contact-accent: ' + _card.relationColor + ';'">
<div class="phone-contact-main">
<div class="phone-contact-avatar">
<img @src="_card.img" @alt="_card.name">
</div>
<div class="phone-contact-copy">
<div class="phone-contact-head">
<div class="phone-contact-name"><<print _card.name>></div>
<div class="phone-contact-badge" @style="'background: ' + _card.relationColor + '1f; color: ' + _card.relationColor + '; border-color: ' + _card.relationColor + '30;'"><<print _card.relationLabel>></div>
</div>
<div class="phone-contact-meters">
<div class="phone-contact-meter">
<div class="phone-contact-meter-top">
<span>Friendship</span>
<span><<print _card.friendVal>></span>
</div>
<div class="phone-contact-meter-bar">
<div class="phone-contact-meter-fill phone-contact-meter-fill--friendship" @style="'width: ' + _card.friendPct + '%;'"></div>
</div>
</div>
<div class="phone-contact-meter">
<div class="phone-contact-meter-top">
<span>Love</span>
<span><<print _card.loveVal>></span>
</div>
<div class="phone-contact-meter-bar">
<div class="phone-contact-meter-fill phone-contact-meter-fill--love" @style="'width: ' + _card.lovePct + '%;'"></div>
</div>
</div>
</div>
</div>
</div>
<div class="phone-contact-action">
<div class="phone-icon-btn phone-icon-btn--call btn">
<<button "Call" "PhoneCall">>
<<set $indexNPC = $Characters.findIndex(c => c.info.id == _card.id)>>
<<set $interactionNpc = $Characters[$indexNPC]>>
<</button>>
</div>
</div>
</div>
<</capture>>
<</for>>
</div>
<<else>>
<div class="phone-empty-card">
<div class="phone-empty-title">No contacts yet</div>
<div class="phone-empty-copy">Ask NPCs for their phone numbers to build your mobile list.</div>
</div>
<</if>>
</div>
</div>
<div class="phone-footer phone-footer--hint">
<div class="phone-footer-note">Tap the call action on any saved contact.</div>
</div>
</div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if $journalFilter == undefined>><<set $journalFilter = "all">><</if>>
<<set _allEntries = getJournalView({ limit: 50 })>>
<<set _good = ["memory_gifted","memory_helped","memory_flirted","memory_apologized","relation_jump","quest_completed"]>>
<<set _conflict = ["memory_hurt","memory_rejected","memory_caught_cheating","relation_drop","quest_failed"]>>
<<set _seen = ["memory_witnessed_violence","memory_witnessed_kindness","memory_witnessed_intimacy"]>>
<<set _entries = _allEntries>>
<<if $journalFilter == "good">>
<<set _entries = _allEntries.filter(e => _good.includes(e.type))>>
<<elseif $journalFilter == "conflict">>
<<set _entries = _allEntries.filter(e => _conflict.includes(e.type))>>
<<elseif $journalFilter == "seen">>
<<set _entries = _allEntries.filter(e => _seen.includes(e.type))>>
<</if>>
<div class="phone-ui-shell">
<div class="phone-device">
<div class="phone-device-notch"></div>
<<PhoneStatusBar>>
<div class="phone-appbar">
<div class="phone-appbar-leading">
<div class="phone-nav-btn btn"><<button "Back" "Phone">><</button>></div>
</div>
<div class="phone-appbar-body">
<div class="phone-appbar-kicker">Viceburg Mobile</div>
<div class="phone-appbar-title">Journal</div>
</div>
<div class="phone-appbar-trailing">
<div class="phone-appbar-counter"><<print _entries.length>></div>
</div>
</div>
<div class="phone-screen">
<div class="phone-content-stack">
<div class="phone-card phone-card--search-only">
<div style="display:flex; gap:6px; flex-wrap:wrap;">
<<set _chips = [["all","All"],["good","Good"],["conflict","Conflicts"],["seen","Seen out"]]>>
<<for _ci = 0; _ci < _chips.length; _ci++>>
<<set _chip = _chips[_ci]>>
<<capture _chip>>
<div class="btn" @style="$journalFilter == _chip[0] ? 'background: rgba(255,255,255,0.14);' : ''"><<button _chip[1]>><<set $journalFilter = _chip[0]>><<goto "PhoneJournal">><</button>></div>
<</capture>>
<</for>>
</div>
</div>
<<if _entries.length > 0>>
<<for _ei = 0; _ei < _entries.length; _ei++>>
<<set _e = _entries[_ei]>>
<<capture _e>>
<div class="phone-card" style="display:flex; gap:12px; align-items:flex-start;">
<div style="font-size:22px; line-height:1.1;"><<print _e.icon>></div>
<div style="flex:1; min-width:0;">
<div style="font-size:14px; line-height:1.4;"><<print _e.text>></div>
<div style="font-size:12px; margin-top:4px; color:#8b91a6;"><<print _e.when>><<if _e.place>> · <<print _e.place>><</if>></div>
</div>
<div @style="'flex:0 0 4px; align-self:stretch; min-height:34px; border-radius:3px; background:' + _e.accent"></div>
</div>
<</capture>>
<</for>>
<<else>>
<div class="phone-empty-card">
<div class="phone-empty-title">Nothing logged yet</div>
<div class="phone-empty-copy">Live a little - give gifts, flirt, get into fights, get seen in public - and the people of Viceburg will start to remember. It shows up here.</div>
</div>
<</if>>
</div>
</div>
<div class="phone-footer phone-footer--hint">
<div class="phone-footer-note">Your recent history - the last 50 noteworthy moments.</div>
</div>
</div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SpendTime 2>>
<<set _metrics = $player.getRelationship($interactionNpc.info.id, false)?.metrics ?? {}>>
<<set _playerLoc = $player.info.currentLocation>>
<<set _npcLoc = $interactionNpc.info.currentLocation>>
<<set _npcAlreadyHere = _npcLoc == _playerLoc>>
<<set _inviteBlock = typeof setup.getNpcInviteBlockReason === 'function' ? setup.getNpcInviteBlockReason($interactionNpc) : null>>
<<set _canInviteHere = setup.canInviteNpcToLocation(_playerLoc)>>
<<set _chance = setup.calculatePhoneInviteChance($player, $interactionNpc)>>
<<set _roll = random(1, 100)>>
<<set _success = _roll <= _chance>>
<<set _threadName = [$interactionNpc.info.firstName, $interactionNpc.info.secondName].filter(Boolean).join(" ").trim()>>
<<set _threadRelation = $player.getRelationship($interactionNpc.info.id, false)?.relation ?? "acquaintance">>
<<set _threadRelationLabel = _threadRelation.charAt(0).toUpperCase() + _threadRelation.slice(1).replace(/([A-Z])/g, " $1")>>
<<set _threadRelationColor = getRelationshipColor(_threadRelation)>>
<<if _npcAlreadyHere>>
<<set _phrase = [
"Uh... I'm already here! Look around you!",
"What do you mean? I'm standing right next to you!",
"Turn around, silly! I'm already with you!",
"I'm... literally right here. Did you forget?",
"Haha, very funny! I'm already at the same place as you!"
].random()>>
<<set _resultMsg = "They are already at your location.">>
<<elseif _inviteBlock>>
<<set _phrase = _inviteBlock.reason>>
<<set _resultMsg = "They refused because of what they remember.">>
<<elseif !_canInviteHere>>
<<set _phrase = "I can't come there right now. That place doesn't work for me.">>
<<set _resultMsg = "This location does not allow phone invites.">>
<<elseif _success>>
<<set _phrase = [
"Alright, I'll head over in a bit!",
"Sure thing! I'll be there soon.",
"Sounds good. I'll be on my way!",
"Yeah, I can come by. See you soon!",
"Alright, I'm coming! Just give me a few minutes."
].random()>>
<<set _resultMsg = "They are on their way to you.">>
<<set _lockRelocate = $player.info.currentLocation>>
<<set _phoneInviteSource = setup.isLocationInPlayerHome && setup.isLocationInPlayerHome(_lockRelocate) ? "phoneInviteHome" : "phoneInviteLocation">>
<<set _journeyResult = setup.requestNpcGuestJourney($Characters[$indexNPC], _lockRelocate, 2, _phoneInviteSource)>>
<<if !_journeyResult.ok>>
<<set _phrase = _journeyResult.reason>>
<<set _resultMsg = "They could not start the trip.">>
<<else>>
<<set _resultMsg = _journeyResult.reason>>
<</if>>
<<else>>
<<set _phrase = [
"Sorry, I can't make it right now.",
"I don't think I can come by today.",
"Thanks for the invite, but I'm not able to.",
"Nah, I'm just gonna stay where I am.",
"I'd love to, but I can't right now."
].random()>>
<<set _resultMsg = "They declined your invitation.">>
<</if>>
<div class="phone-ui-shell">
<div class="phone-device">
<div class="phone-device-notch"></div>
<<PhoneStatusBar>>
<div class="phone-appbar">
<div class="phone-appbar-leading">
<div class="phone-nav-btn btn"><<button "Back" "PhoneCall">><</button>></div>
</div>
<div class="phone-appbar-body">
<div class="phone-appbar-kicker">Voice call</div>
<div class="phone-appbar-title">Invite</div>
</div>
<div class="phone-appbar-trailing"></div>
</div>
<div class="phone-screen">
<div class="phone-content-stack">
<div class="phone-card phone-card--thread-header">
<div class="phone-thread-contact">
<div class="phone-thread-contact-avatar">
<img @src="$interactionNpc.getPhotoImage()" alt="Avatar">
</div>
<div class="phone-thread-contact-copy">
<div class="phone-thread-contact-name"><<print _threadName || "Unknown">></div>
<div class="phone-thread-contact-meta" @style="'color: ' + _threadRelationColor + ';'"><<print _threadRelationLabel>></div>
</div>
</div>
</div>
<div class="phone-thread">
<<PhoneThreadMessage $interactionNpc _phrase>>
<<PhoneThreadSystemNote _resultMsg>>
</div>
</div>
</div>
<div class="phone-footer">
<div class="phone-footer-action btn">
<<button "Continue" $player.info.currentLocation>>
<<unset $interactionNpc $indexNPC>>
<<set $gameSettings.allowSaves = true>>
<<set $canShowStatsBtn = true>>
<</button>>
</div>
</div>
</div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SpendTime 2>>
<<set _metrics = $player.getRelationship($interactionNpc.info.id, false)?.metrics ?? {}>>
<<set _playerHomeBedroom = setup.getPlayerResidenceBedroom ? setup.getPlayerResidenceBedroom() : "Player_Bedroom_PHome">>
<<set _npcAtHome = $interactionNpc.info.currentLocation == _playerHomeBedroom>>
<<set _inviteBlock = typeof setup.getNpcInviteBlockReason === 'function' ? setup.getNpcInviteBlockReason($interactionNpc) : null>>
<<set _chance = setup.calculatePhoneInviteChance($player, $interactionNpc, true)>>
<<set _roll = random(1, 100)>>
<<set _success = _roll <= _chance>>
<<set _threadName = [$interactionNpc.info.firstName, $interactionNpc.info.secondName].filter(Boolean).join(" ").trim()>>
<<set _threadRelation = $player.getRelationship($interactionNpc.info.id, false)?.relation ?? "acquaintance">>
<<set _threadRelationLabel = _threadRelation.charAt(0).toUpperCase() + _threadRelation.slice(1).replace(/([A-Z])/g, " $1")>>
<<set _threadRelationColor = getRelationshipColor(_threadRelation)>>
<<if _npcAtHome>>
<<set _phrase = [
"Um... I'm already at your place! Did you forget?",
"I'm literally in your house right now! Look around!",
"You called me to come to your place... where I already am?",
"Haha, silly! I'm already here at your home!",
"I'm already waiting for you at your place!"
].random()>>
<<set _resultMsg = "They are already at your home.">>
<<elseif _inviteBlock>>
<<set _phrase = _inviteBlock.reason>>
<<set _resultMsg = "They refused because of what they remember.">>
<<elseif _success>>
<<set _relType = $player.getRelationship($interactionNpc.info.id, false)?.relation ?? "acquaintance">>
<<switch _relType>>
<<case "dating" "soulmate">>
<<set _phrase = "I'd love to come over! See you soon, babe!">>
<<case "crush">>
<<set _phrase = "T-to your place? O-okay! I'll be right there!">>
<<case "fuckbuddy">>
<<set _phrase = "Oh, I know what that means~ I'm on my way!">>
<<case "bestFriend">>
<<set _phrase = "Your place? Sure! I'll bring snacks!">>
<<default>>
<<set _phrase = "Okay, I'll head to your place. See you there!">>
<</switch>>
<<set _resultMsg = "They are heading to your home.">>
<<set _journeyResult = setup.requestNpcGuestJourney($Characters[$indexNPC], _playerHomeBedroom, 2, "phoneInviteHome")>>
<<if !_journeyResult.ok>>
<<set _phrase = _journeyResult.reason>>
<<set _resultMsg = "They could not start the trip.">>
<<else>>
<<set _resultMsg = _journeyResult.reason>>
<</if>>
<<else>>
<<set _phrase = [
"To your place? I don't know... maybe another time.",
"I'm not really comfortable with that right now.",
"Sorry, but I'll pass on that for now.",
"Your place? That's a bit... I'll think about it.",
"Maybe when we know each other better?"
].random()>>
<<set _resultMsg = "They declined to come to your home.">>
<</if>>
<div class="phone-ui-shell">
<div class="phone-device">
<div class="phone-device-notch"></div>
<<PhoneStatusBar>>
<div class="phone-appbar">
<div class="phone-appbar-leading">
<div class="phone-nav-btn btn"><<button "Back" "PhoneCall">><</button>></div>
</div>
<div class="phone-appbar-body">
<div class="phone-appbar-kicker">Voice call</div>
<div class="phone-appbar-title">Invite home</div>
</div>
<div class="phone-appbar-trailing"></div>
</div>
<div class="phone-screen">
<div class="phone-content-stack">
<div class="phone-card phone-card--thread-header">
<div class="phone-thread-contact">
<div class="phone-thread-contact-avatar">
<img @src="$interactionNpc.getPhotoImage()" alt="Avatar">
</div>
<div class="phone-thread-contact-copy">
<div class="phone-thread-contact-name"><<print _threadName || "Unknown">></div>
<div class="phone-thread-contact-meta" @style="'color: ' + _threadRelationColor + ';'"><<print _threadRelationLabel>></div>
</div>
</div>
</div>
<div class="phone-thread">
<<PhoneThreadMessage $interactionNpc _phrase>>
<<PhoneThreadSystemNote _resultMsg>>
</div>
</div>
</div>
<div class="phone-footer">
<div class="phone-footer-action btn">
<<button "Continue" $player.info.currentLocation>>
<<unset $interactionNpc $indexNPC>>
<<set $gameSettings.allowSaves = true>>
<<set $canShowStatsBtn = true>>
<</button>>
</div>
</div>
</div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SpendTime 10>>
<<SpendEnergy $player 5>>
/* Register daily event - can only call once per day */
<<run $interactionNpc.dailyEvents.registerEvent($interactionNpc.info.id, "PhoneCallToday", 1)>>
<<set _roll = random(1, 100)>>
<<set _metrics = $player.getRelationship($interactionNpc.info.id).metrics>>
<<set _chance = 75 + Math.floor(_metrics.friendship / 4)>>
<<set _success = _roll <= _chance>>
<<set _threadName = [$interactionNpc.info.firstName, $interactionNpc.info.secondName].filter(Boolean).join(" ").trim()>>
<<set _threadRelation = $player.getRelationship($interactionNpc.info.id, false)?.relation ?? "acquaintance">>
<<set _threadRelationLabel = _threadRelation.charAt(0).toUpperCase() + _threadRelation.slice(1).replace(/([A-Z])/g, " $1")>>
<<set _threadRelationColor = getRelationshipColor(_threadRelation)>>
<<if _success>>
<<set _friendGain = random(1, 8)>>
<<set _phrase = [
"Hey! Good to hear from you! What's up?",
"Oh hi! I was just thinking about you!",
"Hello! How's your day going?",
"Hey there! It's nice to hear your voice!",
"Hi! I'm glad you called!",
"I've been thinking a lot lately... it's nice to have someone to talk to.",
"You know, I really appreciate that you listen to me.",
"Thanks for calling. It means a lot!"
].random()>>
<<set _resultMsg = "You had a nice conversation. (Friendship +" + _friendGain + ")">>
<<set _metrics.friendship = _metrics.friendship + _friendGain>>
<<else>>
<<set _phrase = [
"Sorry, I'm a bit busy right now...",
"Can we talk later? I'm in the middle of something.",
"Hey... not the best time, but what is it?",
"Oh, hi... I'm kind of distracted right now.",
"Yeah? What do you need?"
].random()>>
<<set _resultMsg = "They seemed distracted. No relationship change.">>
<</if>>
<div class="phone-ui-shell">
<div class="phone-device">
<div class="phone-device-notch"></div>
<<PhoneStatusBar>>
<div class="phone-appbar">
<div class="phone-appbar-leading">
<div class="phone-nav-btn btn"><<button "Back" "PhoneCall">><</button>></div>
</div>
<div class="phone-appbar-body">
<div class="phone-appbar-kicker">Voice call</div>
<div class="phone-appbar-title">Chat</div>
</div>
<div class="phone-appbar-trailing"></div>
</div>
<div class="phone-screen">
<div class="phone-content-stack">
<div class="phone-card phone-card--thread-header">
<div class="phone-thread-contact">
<div class="phone-thread-contact-avatar">
<img @src="$interactionNpc.getPhotoImage()" alt="Avatar">
</div>
<div class="phone-thread-contact-copy">
<div class="phone-thread-contact-name"><<print _threadName || "Unknown">></div>
<div class="phone-thread-contact-meta" @style="'color: ' + _threadRelationColor + ';'"><<print _threadRelationLabel>></div>
</div>
</div>
</div>
<div class="phone-thread">
<<PhoneThreadMessage $interactionNpc _phrase>>
<<PhoneThreadSystemNote _resultMsg>>
</div>
</div>
</div>
<div class="phone-footer">
<div class="phone-footer-action btn"><<button "Continue" "PhoneCall">><</button>></div>
</div>
</div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _threadName = [$interactionNpc.info.firstName, $interactionNpc.info.secondName].filter(Boolean).join(" ").trim()>>
<<set _threadRelation = $player.getRelationship($interactionNpc.info.id, false)?.relation ?? "acquaintance">>
<<set _threadRelationLabel = _threadRelation.charAt(0).toUpperCase() + _threadRelation.slice(1).replace(/([A-Z])/g, " $1")>>
<<set _threadRelationColor = getRelationshipColor(_threadRelation)>>
<<set _loc = $interactionNpc.info.currentLocation>>
<<set _nightDisclosure = setup.getPlayerNpcNightStatus ? setup.getPlayerNpcNightStatus($interactionNpc) : null>>
<<if _nightDisclosure and _nightDisclosure.actualActivity == "personal_errand" and _nightDisclosure.playerKnowledge != "known">>
<<set _msg = "I'm out on an errand. Don't ask, alright?">>
<<else>>
<<switch _loc>>
/* College */
<<case "CollegeHall">>
<<set _msg = "I'm at the college main hall. Lots of students around here.">>
<<case "Auditorium">>
<<set _msg = "I'm in the auditorium at college. Class is going on, so I should probably focus...">>
<<case "WomensRestroom" "MensRestroom">>
<<set _msg = "Uh... I'm in the college restroom. Can you call back in a minute?">>
<<case "Campus">>
<<set _msg = "I'm walking around the college campus. Nice weather out here!">>
/* Mall & Shops */
<<case "Mall">>
<<set _msg = "I'm at the city mall. So many stores here! Shopping is therapeutic, you know?">>
<<case "GiftShop">>
<<set _msg = "I'm at the gift shop in the mall. Looking for something special.">>
<<case "Pharmacy">>
<<set _msg = "I'm at the pharmacy in the mall. Just picking up some supplies.">>
<<case "Grocery">>
<<set _msg = "I'm at the grocery store. Need to stock up on food!">>
<<case "ClothingStore">>
<<set _msg = "I'm at the clothing store in the mall. Trying on some new outfits!">>
<<case "SexShop">>
<<set _msg = "I'm at... um... an adults-only store in the mall. Don't judge me!">>
/* Red Light District */
<<case "RedLightDistrict">>
<<set _msg = "I'm in the Red Light District. You know, that sketchy part of town with all the clubs and... stuff.">>
<<case "EntertainmentDistrict">>
<<set _msg = "I'm in the Entertainment District. Lots of bars and nightclubs around here.">>
/* Fitness */
<<case "FitnessClub">>
<<set _msg = "I'm at the Fitness Club. Working out and getting gains!">>
/* Park */
<<case "Park">>
<<set _msg = "I'm at the city park. It's really peaceful here, trees everywhere.">>
<<case "ParkRestrooms">>
<<set _msg = "I'm near the park restrooms. Not the most glamorous spot, I know.">>
/* Player's Home */
<<case "Player_Bedroom_PHome">>
<<set _msg = "I'm at your place! In your bedroom actually. Where are you?">>
<<case "Living_Room_PHome">>
<<set _msg = "I'm at your house, in the living room. Waiting for you!">>
<<case "Kitchen_PHome">>
<<set _msg = "I'm in your kitchen. Making myself comfortable, hope you don't mind!">>
<<case "Bathroom_PHome">>
<<set _msg = "I'm in your bathroom. Privacy please!">>
<<case "Basement_PHome">>
<<set _msg = "I'm in your basement. It's kinda creepy down here...">>
<<case "Oak_Street">>
<<set _msg = "I'm on Oak Street, near your house.">>
/* Family Bedrooms */
<<case "Ethan_Bedroom_PHome">>
<<set _msg = "I'm at your family's house, in Ethan's room.">>
<<case "Sarah_Bedroom_PHome">>
<<set _msg = "I'm at your family's house, in Sarah's room.">>
<<case "Amanda_Bedroom_PHome">>
<<set _msg = "I'm at your family's house, in Amanda's room.">>
/* Clinic */
<<case "Clinic">>
<<set _msg = "I'm at the medical clinic. Just getting a check-up.">>
/* Work locations */
<<case "PornStudio">>
<<set _msg = "I'm at a... film studio. For adult content. Yeah.">>
<<case "PhotoStudio">>
<<set _msg = "I'm at a photography studio. Doing a photoshoot!">>
<<case "Villa">>
<<set _msg = "I'm at some fancy villa. Rich people live here.">>
<<case "VillaBedroom">>
<<set _msg = "I'm in a bedroom at the villa.">>
/* Apartments */
<<case "Bedroom_Apartments">>
<<set _msg = "I'm in my apartment bedroom. Just relaxing at home.">>
<<case "LivingRoom_Apartments">>
<<set _msg = "I'm in my apartment living room. Watching TV.">>
/* Nightclub */
<<case "NC_VIP_Lounge">>
<<set _msg = "I'm in the VIP lounge at the nightclub. It's pretty exclusive here.">>
/* Brothel */
<<case "BrothelCorridor_Pimp">>
<<set _msg = "I'm at... a certain establishment. Don't ask.">>
<<case "BrothelHall_Pimp">>
<<set _msg = "I'm at a... entertainment venue. In the main hall.">>
/* Skid Row */
<<case "SR_SkidRow">>
<<set _msg = "I'm in Skid Row. It's not the safest area, but I'm managing.">>
<<default>>
<<set _msg = "I'm at " + setup.getCityLocationLabel(_loc) + ".">>
<</switch>>
<</if>>
<div class="phone-ui-shell">
<div class="phone-device">
<div class="phone-device-notch"></div>
<<PhoneStatusBar>>
<div class="phone-appbar">
<div class="phone-appbar-leading">
<div class="phone-nav-btn btn"><<button "Back" "PhoneCall">><</button>></div>
</div>
<div class="phone-appbar-body">
<div class="phone-appbar-kicker">Voice call</div>
<div class="phone-appbar-title">Location</div>
</div>
<div class="phone-appbar-trailing"></div>
</div>
<div class="phone-screen">
<div class="phone-content-stack">
<div class="phone-card phone-card--thread-header">
<div class="phone-thread-contact">
<div class="phone-thread-contact-avatar">
<img @src="$interactionNpc.getPhotoImage()" alt="Avatar">
</div>
<div class="phone-thread-contact-copy">
<div class="phone-thread-contact-name"><<print _threadName || "Unknown">></div>
<div class="phone-thread-contact-meta" @style="'color: ' + _threadRelationColor + ';'"><<print _threadRelationLabel>></div>
</div>
</div>
</div>
<div class="phone-thread">
<<PhoneThreadMessage $interactionNpc _msg>>
</div>
</div>
</div>
<div class="phone-footer">
<div class="phone-footer-action btn"><<button "Continue" "PhoneCall">><</button>></div>
</div>
</div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _characterIcon = $interactionNpc.getPhotoImage()>>
<<set _charName = [$interactionNpc.info.firstName, $interactionNpc.info.secondName].filter(Boolean).join(" ").trim()>>
<<set _relData = $player.getRelationship($interactionNpc.info.id, false) ?? {}>>
<<set _relType = _relData.relation ?? "acquaintance">>
<<set _relationLabel = _relType.charAt(0).toUpperCase() + _relType.slice(1).replace(/([A-Z])/g, " $1")>>
<<set _relationColor = getRelationshipColor(_relType)>>
<<set _playerLoc = $player.info.currentLocation>>
<<set _npcLoc = $interactionNpc.info.currentLocation>>
<<set _npcAlreadyHere = _npcLoc == _playerLoc>>
<<set _calledToday = $interactionNpc.dailyEvents.isEventRegistered($interactionNpc.info.id, "PhoneCallToday")>>
<<set _inviteBlock = typeof setup.getNpcInviteBlockReason === 'function' ? setup.getNpcInviteBlockReason($interactionNpc) : null>>
<<set _sharedGuestDecision = setup.isLocationInPlayerHome(_playerLoc) ? setup.canInviteNpcToSharedHome($interactionNpc) : { ok: true, reason: "" }>>
<<set _canInviteHere = !_npcAlreadyHere && !_inviteBlock && _sharedGuestDecision.ok && setup.canInviteNpcToLocation(_playerLoc)>>
<<set _inviteChance = _canInviteHere ? setup.calculatePhoneInviteChance($player, $interactionNpc) : 0>>
<<set _coupleView = setup.getPlayerNpcRelationshipView($interactionNpc)>>
<<set _partnerNight = _coupleView.active ? setup.getPlayerNpcNightStatus($interactionNpc) : null>>
<<set _homeBedroom = setup.getPlayerResidenceBedroom()>>
<<set _npcAtPlayerHomeBedroom = $interactionNpc.info.currentLocation == _homeBedroom>>
<<set _homeGuestDecision = setup.canInviteNpcToSharedHome($interactionNpc)>>
<div class="phone-ui-shell">
<div class="phone-device">
<div class="phone-device-notch"></div>
<<PhoneStatusBar>>
<div class="phone-appbar">
<div class="phone-appbar-leading">
<div class="phone-nav-btn btn"><<button "Back" "Phone">><<unset $interactionNpc $indexNPC>><</button>></div>
</div>
<div class="phone-appbar-body">
<div class="phone-appbar-kicker">Voice call</div>
<div class="phone-appbar-title">Connected</div>
</div>
<div class="phone-appbar-trailing"></div>
</div>
<div class="phone-screen">
<div class="phone-content-stack">
<div class="phone-card phone-card--call-hero">
<div class="phone-call-avatar">
<img @src="_characterIcon" alt="Avatar">
</div>
<div class="phone-call-name"><<print _charName || "Unknown">></div>
<div class="phone-call-status"><span class="phone-call-status-dot"></span>Connected</div>
<div class="phone-chip-row">
<div class="phone-info-chip" @style="'background: ' + _relationColor + '1f; color: ' + _relationColor + '; border-color: ' + _relationColor + '30;'"><<print _relationLabel>></div>
</div>
</div>
<div class="phone-action-grid">
<<if _coupleView.active>>
<div class="phone-action-tile">
<div class="phone-action-tile-title">Meet up</div>
<div class="phone-action-tile-copy">Choose a day, time and place that fit both your schedules.</div>
<<if _coupleView.plannedMeeting && ["planned", "traveling", "active"].includes(_coupleView.plannedMeeting.status)>>
<div class="phone-action-tile-meta"><<print setup.playerNpcDateTimeLabel(_coupleView.plannedMeeting.scheduledMinute)>></div>
<<if _coupleView.plannedMeeting.status !== "active">>
<div class="phone-action-btn btn"><<button "Cancel this outing" "enhanced_relationship_date_cancellation">><<set $relationshipDateReturnPassage = "PhoneCall">><</button>></div>
<</if>>
<<else>>
<div class="phone-action-btn btn"><<button "Plan a date" "enhanced_relationship_date_time">><<set $relationshipDateReturnPassage = "PhoneCall", $relationshipDateTimingMode = "calendar", $relationshipDateFormat = "standard">><</button>></div>
<div class="phone-action-btn btn"><<button "Arrange a 20-minute catch-up" "enhanced_relationship_date_time">><<set $relationshipDateReturnPassage = "PhoneCall", $relationshipDateTimingMode = "calendar", $relationshipDateFormat = "brief">><</button>></div>
<</if>>
</div>
<div class="phone-action-tile">
<div class="phone-action-tile-title">Partner status</div>
<div class="phone-action-tile-copy">Ask about their plans without revealing information you have not learned.</div>
<div class="phone-action-tile-meta"><<print _coupleView.cohabitationLabel>><<if _partnerNight>> · <<print (_partnerNight.declaredActivity ?? _partnerNight.actualActivity).replaceAll("_", " ")>><</if>></div>
<div class="phone-action-btn btn"><<button "Ask when they'll be home" "PhoneCall_PartnerStatus">><</button>></div>
</div>
<<if _coupleView.cohabitation.status == "cohabiting">>
<div class="phone-action-tile">
<div class="phone-action-tile-title">Come home</div>
<div class="phone-action-tile-copy">Ask them to return. Work, urgent needs and existing commitments still take priority.</div>
<div class="phone-action-btn btn"><<button "Ask them to come home" "PhoneCall_PartnerRequest">><<set $partnerHomeRequest = setup.requestPlayerPartnerComeHome($interactionNpc, "come_home")>><</button>></div>
</div>
<div class="phone-action-tile">
<div class="phone-action-tile-title">Evening together</div>
<div class="phone-action-tile-copy">Invite them home for a shared evening while respecting their schedule.</div>
<div class="phone-action-btn btn"><<button "Suggest an evening" "PhoneCall_PartnerRequest">><<set $partnerHomeRequest = setup.requestPlayerPartnerComeHome($interactionNpc, "shared_evening")>><</button>></div>
</div>
<</if>>
<</if>>
<div @class="'phone-action-tile' + (_calledToday ? ' is-disabled' : '')">
<div class="phone-action-tile-title">Talk</div>
<div class="phone-action-tile-copy">Spend a little time chatting and maybe improve the relationship.</div>
<div class="phone-action-tile-meta"><<print _calledToday ? "Already called today" : "Available now">></div>
<div @class="'phone-action-btn btn' + (_calledToday ? ' phone-action-btn--disabled' : '')">
<<if _calledToday>>
<<button "Unavailable">><</button>>
<<else>>
<<button "Start chat" "PhoneCall_Talk">><</button>>
<</if>>
</div>
</div>
/* Money by phone: pay back a debt or send a gift (npcMoneyLedger). */
<<set _moneyView = setup.npcMoney.view($player, $interactionNpc)>>
<div class="phone-action-tile">
<div class="phone-action-tile-title">Send money</div>
<div class="phone-action-tile-copy">Pay back what you owe, or send them a little something.</div>
<<if _moneyView.youOwe > 0>><div class="phone-action-tile-meta">You owe $<<= _moneyView.youOwe>><<if _moneyView.overdue>> (overdue)<</if>></div><</if>>
<div class="phone-action-btn btn"><<button "Send money" "PhoneSendMoney">><<unset $moneyResult>><</button>></div>
</div>
<div @class="'phone-action-tile' + (_npcAlreadyHere || _inviteBlock || !_canInviteHere ? ' is-disabled' : '')">
<div class="phone-action-tile-title">Come to me</div>
<div class="phone-action-tile-copy">Invite them to your current location if the place allows it.</div>
<<if _npcAlreadyHere>>
<<set _inviteMeta = "Already here with you">>
<<elseif _inviteBlock>>
<<set _inviteMeta = _inviteBlock.reason>>
<<elseif !_sharedGuestDecision.ok>>
<<set _inviteMeta = _sharedGuestDecision.reason>>
<<elseif !_canInviteHere>>
<<set _inviteMeta = "Not allowed at this location">>
<<else>>
<<set _inviteMeta = _inviteChance + "% success chance">>
<</if>>
<div class="phone-action-tile-meta"><<print _inviteMeta>></div>
<div @class="'phone-action-btn btn' + (_npcAlreadyHere || _inviteBlock || !_canInviteHere ? ' phone-action-btn--disabled' : '')">
<<if _npcAlreadyHere>>
<<button "Already here">><</button>>
<<elseif _inviteBlock>>
<<button "Too soon">><</button>>
<<elseif !_canInviteHere>>
<<button "Unavailable">><</button>>
<<else>>
<<button "Send invite" "PhoneCall_ComeToMe">><</button>>
<</if>>
</div>
</div>
<div @class="'phone-action-tile' + (_npcAtPlayerHomeBedroom || _inviteBlock || !_homeGuestDecision.ok ? ' is-disabled' : '')">
<div class="phone-action-tile-title">Come to my place</div>
<div class="phone-action-tile-copy">Invite them to your primary home. They will travel through each city stop.</div>
<div class="phone-action-tile-meta"><<print _npcAtPlayerHomeBedroom ? "Already there" : _inviteBlock ? _inviteBlock.reason : !_homeGuestDecision.ok ? _homeGuestDecision.reason : "Travel invitation">></div>
<div class="phone-action-btn btn">
<<if _npcAtPlayerHomeBedroom or _inviteBlock or !_homeGuestDecision.ok>>
<<button "Unavailable">><</button>>
<<else>>
<<button "Invite home" "PhoneCall_ComeToMyPlace">><</button>>
<</if>>
</div>
</div>
<div @class="'phone-action-tile' + (_npcAlreadyHere ? ' is-disabled' : '')">
<div class="phone-action-tile-title">Where are you?</div>
<div class="phone-action-tile-copy">Ask for their current location to figure out where they are.</div>
<div class="phone-action-tile-meta"><<print _npcAlreadyHere ? "They are with you right now" : "Request live location">></div>
<div @class="'phone-action-btn btn' + (_npcAlreadyHere ? ' phone-action-btn--disabled' : '')">
<<if _npcAlreadyHere>>
<<button "Same place">><</button>>
<<else>>
<<button "Ask now" "PhoneCall_WhereAreYou">><</button>>
<</if>>
</div>
</div>
</div>
</div>
</div>
<div class="phone-footer">
<div class="phone-footer-action phone-footer-action--destructive btn">
<<button "End call" "Phone">><<unset $interactionNpc $indexNPC>><</button>>
</div>
</div>
</div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _night = setup.getPlayerNpcNightStatus($interactionNpc)>>
<<set _travel = typeof GetNpcTravelStatus === "function" ? GetNpcTravelStatus($interactionNpc) : null>>
<<if _night and _night.actualActivity == "personal_errand" and _night.playerKnowledge != "known">>
<<set _msg = "I've got something on tonight. I'll tell you about it sometime.">>
<<elseif _night>>
<<set _activity = (_night.declaredActivity ?? _night.actualActivity).replaceAll("_", " ")>>
<<set _msg = "Tonight I'm " + _activity + ".">>
<<if _travel and _travel.nextLabel>><<set _msg += " My next stop is " + _travel.nextLabel + ".">><</if>>
<<if _night.plannedReturnMinute>><<set _msg += " I'll be back once I'm done.">><</if>>
<<elseif _travel>>
<<set _msg = "I'm heading toward " + _travel.destinationLabel + ".">>
<<if _travel.nextLabel>><<set _msg += " Next is " + _travel.nextLabel + ".">><</if>>
<<else>>
<<set _msg = "I don't have a special plan tonight.">>
<</if>>
<<PhoneThreadMessage $interactionNpc _msg>>
<div class="btn padding-top"><<button "Continue" "PhoneCall">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<PhoneThreadMessage $interactionNpc $partnerHomeRequest.reason>>
<div class="btn padding-top"><<button "Continue" "PhoneCall">><<unset $partnerHomeRequest>><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<div class="phone-ui-shell">
<div class="phone-device">
<div class="phone-device-notch"></div>
<<PhoneStatusBar>>
<div class="phone-appbar">
<div class="phone-appbar-leading">
<div class="phone-nav-btn btn"><<button "Back" "PhoneCompose">><<run typeof aiStopSpeaking === "function" && aiStopSpeaking()>><</button>></div>
</div>
<div class="phone-appbar-body">
<div class="phone-appbar-kicker">Viceburg Mobile</div>
<div class="phone-appbar-title">Messages</div>
</div>
<div class="phone-appbar-trailing"></div>
</div>
<div class="phone-screen">
<div id="ai-phone-chat-root" class="ai-chat"><div class="options-warning">The chat could not load. Try reloading the page.</div></div>
</div>
</div>
</div>
<<done>><<run typeof mountAiPhoneChat === "function" && mountAiPhoneChat(document.getElementById("ai-phone-chat-root"))>><</done>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _plans = setup.playerNpcMeetings.calendar()>>
<div class="phone-ui-shell">
<div class="phone-device">
<div class="phone-device-notch"></div>
<<PhoneStatusBar>>
<div class="phone-appbar">
<div class="phone-appbar-leading">
<div class="phone-nav-btn btn"><<button "Back" "Phone">><<unset $calendarResult>><</button>></div>
</div>
<div class="phone-appbar-body">
<div class="phone-appbar-kicker">Viceburg Mobile</div>
<div class="phone-appbar-title">Plans</div>
</div>
<div class="phone-appbar-trailing">
<div class="phone-appbar-counter"><<print _plans.length>></div>
</div>
</div>
<div class="phone-screen">
<div class="phone-content-stack">
<<if $calendarResult>>
<div class="phone-card">
<<if $calendarResult.npcLine>><div class="phone-card-copy">"<<print $calendarResult.npcLine>>"</div><</if>>
<div class="phone-card-copy"><<print $calendarResult.reason>></div>
</div>
<</if>>
<<if _plans.length > 0>>
<<for _pi = 0; _pi < _plans.length; _pi++>>
<<set _plan = _plans[_pi]>>
<<capture _plan>>
<div class="phone-card">
<div class="phone-card-title"><<print _plan.kind == "date" ? "💕" : "📅">> <<print _plan.name>> · <<print _plan.place>></div>
<div class="phone-card-copy"><<print _plan.when>> · <<print _plan.statusLabel>></div>
<<if _plan.canCancelByPhone>>
<div class="btn"><<button "Call it off" "PhoneCalendar">><<set $calendarResult = setup.playerNpcMeetings.cancel(_plan.id)>><</button>></div>
<<elseif _plan.canCancel>>
<div class="phone-card-copy">You do not have their number. Tell them in person.</div>
<</if>>
</div>
<</capture>>
<</for>>
<<else>>
<div class="phone-empty-card">
<div class="phone-empty-title">No plans yet</div>
<div class="phone-empty-copy">Ask someone to meet up from the interaction menu. If they agree, they will really come and wait for you.</div>
</div>
<</if>>
</div>
</div>
<div class="phone-footer phone-footer--hint">
<div class="phone-footer-note">Calling a meeting off two hours ahead is fine. Any later and they will mind.</div>
</div>
</div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if $pendingPhoneCall == undefined>>
<<goto "Phone">>
<<else>>
<<set $indexNPC = $Characters.findIndex(c => c.info.id == $pendingPhoneCall.npcId)>>
<<if $indexNPC < 0>>
<<unset $pendingPhoneCall>>
<<goto "Phone">>
<<else>>
<<set $interactionNpc = $Characters[$indexNPC]>>
<<set _scn = "Phone">>
<<switch $pendingPhoneCall.trigger>>
<<case "positive">><<set _scn = (["PhoneCall_Favor", "PhoneCall_Favor2", "PhoneCall_Favor3"])[Random(0, 2)]>>
<<case "highLove">><<set _scn = (["PhoneCall_Date", "PhoneCall_Date2", "PhoneCall_Date3"])[Random(0, 2)]>>
<<case "negative">><<set _scn = (["PhoneCall_Threat", "PhoneCall_Threat2"])[Random(0, 1)]>>
<<default>><<unset $pendingPhoneCall>>
<</switch>>
<<goto _scn>>
<</if>>
<</if>>
<</nobr>>
/* ============================================================
POSITIVE - a friend you've helped asks for a favour
============================================================ */<<nobr>>
<<include "UpdateAll">>
<<Chat $interactionNpc "Hey, it's me. You've been really good to me lately, and... I'm in a bit of a spot. Any chance you could lend me $100? I'm good for it, I swear.">>
<div class="npc-event-actions">
<<if $player.money >= 100>>
<div class="btn"><<button "Lend $100" "PhoneCall_Favor_Help">><</button>></div>
<<else>>
<div class="btn non-interacting"><<button "Lend $100 (need $100)">><</button>></div>
<</if>>
<div class="btn"><<button "Sorry, not right now" "PhoneCall_Favor_Decline">><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
/* Real money to the caller, and a loan they remember (npcMoneyLedger). */
<<set _lent = setup.npcMoney.phoneLend($interactionNpc, 100, "phone-lend:" + $interactionNpc.info.id + ":" + getCurrentAbsoluteDay())>>
<<set _rel = $player.getRelationship($interactionNpc.info.id, false)>>
<<if _rel>><<set _rel.metrics.friendship += 10>><</if>>
<<run window.recordNpcMemory($interactionNpc.info.id, 'helped', { intensity: 3 })>>
<<Chat $player "Sure, I've got you. Sending it over now.">>
<<set _msg = "You lend " + $interactionNpc.info.firstName + " $100. They're over the moon - they won't forget this.">>
<<ChatMessage _msg>>
<<PhoneCall_End>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _rel = $player.getRelationship($interactionNpc.info.id, false)>>
<<if _rel>><<set _rel.metrics.friendship -= 3>><</if>>
<<Chat $player "Sorry, I really can't right now.">>
<<set _msg = $interactionNpc.info.firstName + " sounds let down, but says they understand.">>
<<ChatMessage _msg>>
<<PhoneCall_End>>
<</nobr>>
/* ============================================================
HIGH LOVE - a lover wants to come over
============================================================ */<<nobr>>
<<include "UpdateAll">>
<<Chat $interactionNpc "Hey you~ I can't stop thinking about you. Want me to come over? I miss your face.">>
<div class="npc-event-actions">
<div class="btn"><<button "Come over" "PhoneCall_Date_Accept">><</button>></div>
<div class="btn"><<button "Maybe another time" "PhoneCall_Date_Decline">><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _rel = $player.getRelationship($interactionNpc.info.id, false)>>
<<set _phoneInviteSource = setup.isLocationInPlayerHome && setup.isLocationInPlayerHome($player.info.currentLocation) ? "phoneInviteHome" : "phoneInviteLocation">>
<<set _journeyResult = setup.requestNpcGuestJourney($interactionNpc, $player.info.currentLocation, 2, _phoneInviteSource)>>
<<if _journeyResult.ok>>
<<if _rel>><<set _rel.metrics.love += 5>><</if>>
<<Chat $player "I'd love that. Come over.">>
<<set _msg = $interactionNpc.info.firstName + " sounds delighted and starts travelling to you through the city.">>
<<else>>
<<Chat $player "I'd love that, if you can make it.">>
<<set _msg = _journeyResult.reason>>
<</if>>
<<ChatMessage _msg>>
<<PhoneCall_End>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _rel = $player.getRelationship($interactionNpc.info.id, false)>>
<<if _rel>><<set _rel.metrics.love -= 3>><</if>>
<<Chat $player "Not tonight - I've got a lot on. Rain check?">>
<<set _msg = $interactionNpc.info.firstName + " hides their disappointment. 'Okay... next time, then.'">>
<<ChatMessage _msg>>
<<PhoneCall_End>>
<</nobr>>
/* ============================================================
NEGATIVE - someone you wronged shakes you down
============================================================ */<<nobr>>
<<include "UpdateAll">>
<<Chat $interactionNpc "You've got nerve picking up. You think I forgot what you did? You owe me. A hundred and fifty makes it go away. Don't make me come find you.">>
<div class="npc-event-actions">
<<if $player.money >= 150>>
<div class="btn"><<button "Pay them off ($150)" "PhoneCall_Threat_Pay">><</button>></div>
<<else>>
<div class="btn non-interacting"><<button "Pay them off (need $150)">><</button>></div>
<</if>>
<div class="btn"><<button "Go to hell" "PhoneCall_Threat_Refuse">><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<run setup.npcMoney.payTo($interactionNpc, 150, "phone-threat:" + $interactionNpc.info.id + ":" + getCurrentAbsoluteDay())>>
<<set _rel = $player.getRelationship($interactionNpc.info.id, false)>>
<<if _rel>><<set _rel.metrics.anger = Math.max(0, _rel.metrics.anger - 25)>><</if>>
<<Chat $player "Fine. Take it. We're square.">>
<<set _msg = "You wire over $150. '...Smart. We're done - for now.'">>
<<ChatMessage _msg>>
<<PhoneCall_End>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _rel = $player.getRelationship($interactionNpc.info.id, false)>>
<<if _rel>><<set _rel.metrics.anger += 10>><</if>>
<<Chat $player "Go to hell. Don't call me again.">>
<<set _msg = "You hang up. The threats only get uglier - this isn't over.">>
<<ChatMessage _msg>>
<<PhoneCall_End>>
<</nobr>>
/* ---- Variant scenarios (router picks one of two per trigger) ---- */<<nobr>>
<<include "UpdateAll">>
<<Chat $interactionNpc "You around? I could really use a hand moving some stuff later - won't take long, and I'll owe you one. You're the only person I trust with this.">>
<div class="npc-event-actions">
<div class="btn"><<button "Sure, I'll help" "PhoneCall_Favor2_Help">><</button>></div>
<div class="btn"><<button "Can't today, sorry" "PhoneCall_Favor2_Decline">><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SpendTime 60>>
<<SpendEnergy $player 10>>
<<set _rel = $player.getRelationship($interactionNpc.info.id, false)>>
<<if _rel>><<set _rel.metrics.friendship += 8>><</if>>
<<run window.recordNpcMemory($interactionNpc.info.id, 'helped', { intensity: 3 })>>
<<Chat $player "Yeah, I've got time. Let's do it.">>
<<set _msg = "You spend an hour helping " + $interactionNpc.info.firstName + " out. They're genuinely thankful.">>
<<ChatMessage _msg>>
<<PhoneCall_End>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _rel = $player.getRelationship($interactionNpc.info.id, false)>>
<<if _rel>><<set _rel.metrics.friendship -= 3>><</if>>
<<Chat $player "Sorry, I'm swamped today.">>
<<set _msg = $interactionNpc.info.firstName + " says it's fine, but you can hear the disappointment.">>
<<ChatMessage _msg>>
<<PhoneCall_End>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<Chat $interactionNpc "I want us to go somewhere nice tonight - just the two of us. Please say yes?">>
<div class="npc-event-actions">
<div class="btn"><<button "I'd love that" "PhoneCall_Date2_Accept">><</button>></div>
<div class="btn"><<button "Not tonight" "PhoneCall_Date2_Decline">><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _rel = $player.getRelationship($interactionNpc.info.id, false)>>
<<set _npcRel = $interactionNpc.getRelationship($player.info.id, false)>>
<<set _isOfficialCouple = (_rel && (_rel.relation == "dating" || _rel.relation == "soulmate")) || (_npcRel && (_npcRel.relation == "dating" || _npcRel.relation == "soulmate"))>>
<<set _dateResult = null>>
<<set _journeyResult = null>>
<<if _isOfficialCouple>>
<<set _dateOptions = setup.getPlayerNpcDateOptions($player, $interactionNpc)>>
<<set _chosenDate = null>>
<<for _dateOption range _dateOptions>>
<<if !_chosenDate && _dateOption.available>><<set _chosenDate = _dateOption>><</if>>
<</for>>
<<if _chosenDate>><<set _dateResult = setup.schedulePlayerNpcDate($player, $interactionNpc, _chosenDate.venue, "auto")>><</if>>
<<else>>
<<set _phoneInviteSource = setup.isLocationInPlayerHome && setup.isLocationInPlayerHome($player.info.currentLocation) ? "phoneInviteHome" : "phoneInviteLocation">>
<<set _journeyResult = setup.requestNpcGuestJourney($interactionNpc, $player.info.currentLocation, 2, _phoneInviteSource)>>
<</if>>
<<if (_dateResult && _dateResult.ok) || (_journeyResult && _journeyResult.ok)>>
<<if _rel>><<set _rel.metrics.love += 6>><</if>>
<<run window.recordNpcMemory($interactionNpc.info.id, 'flirted', { intensity: 2 })>>
<<Chat $player "I'd love that. Let me know when you're on the way.">>
<<set _msg = _dateResult && _dateResult.ok ? _dateResult.reason : $interactionNpc.info.firstName + " sounds thrilled and starts travelling to you through the city.">>
<<else>>
<<Chat $player "I'd love that, if we can make the timing work.">>
<<set _msg = _dateResult?.reason ?? _journeyResult?.reason ?? "There is no suitable open destination right now, so you agree to make plans later.">>
<</if>>
<<ChatMessage _msg>>
<<PhoneCall_End>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _rel = $player.getRelationship($interactionNpc.info.id, false)>>
<<if _rel>><<set _rel.metrics.love -= 3>><</if>>
<<Chat $player "I can't tonight - sorry.">>
<<set _msg = $interactionNpc.info.firstName + " tries to laugh it off, but they're clearly hurt.">>
<<ChatMessage _msg>>
<<PhoneCall_End>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<Chat $interactionNpc "I haven't forgotten what you did. I know where you spend your time. You'd better watch your back from now on.">>
<div class="npc-event-actions">
<div class="btn"><<button "I'm sorry - let me make it right" "PhoneCall_Threat2_Apologize">><</button>></div>
<div class="btn"><<button "Try me" "PhoneCall_Threat2_Refuse">><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _rel = $player.getRelationship($interactionNpc.info.id, false)>>
<<if _rel>><<set _rel.metrics.anger = Math.max(0, _rel.metrics.anger - 15)>><</if>>
<<run window.recordNpcMemory($interactionNpc.info.id, 'apologized', { intensity: 2 })>>
<<Chat $player "Look - I'm sorry. I mean it. Tell me how to fix this.">>
<<set _msg = $interactionNpc.info.firstName + " goes quiet. 'Words are cheap... but fine. We'll see if you mean it.'">>
<<ChatMessage _msg>>
<<PhoneCall_End>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _rel = $player.getRelationship($interactionNpc.info.id, false)>>
<<if _rel>><<set _rel.metrics.anger += 10>><</if>>
<<Chat $player "Try me, then. Don't call this number again.">>
<<set _msg = "They go silent, then hang up. You haven't heard the last of them.">>
<<ChatMessage _msg>>
<<PhoneCall_End>>
<</nobr>>
/* ---- Reciprocity: a close NPC gives back instead of asking (payoff for the relationship) ---- */<<nobr>>
<<include "UpdateAll">>
<<if $pendingPhoneCall == undefined>>
<<goto "Phone">>
<<else>>
/* Apply the gift exactly once; the stored amount survives a re-render so a
back-navigation can't re-collect it. */
<<if $pendingPhoneCall.gift == undefined>>
/* Only cash the NPC can spare; if it owes the player, this is the repayment. */
<<set _sent = setup.npcMoney.phoneGift($interactionNpc, 60, 120, "phone-favor:" + $interactionNpc.info.id + ":" + $pendingPhoneCall.day)>>
<<set $pendingPhoneCall.gift = _sent.amount>>
<<set $pendingPhoneCall.repaid = _sent.repaid>>
<<set _rel = $player.getRelationship($interactionNpc.info.id, false)>>
<<if _rel>><<set _rel.metrics.friendship += 4>><</if>>
<</if>>
<<set _gift = $pendingPhoneCall.gift>>
<<if ($pendingPhoneCall.repaid ?? 0) > 0>>
<<Chat $interactionNpc "Hey - remember when you were there for me? I finally got back on my feet, and I don't forget who had my back. Sending you what I owe, plus a little extra. Thank you.">>
<<elseif _gift > 0>>
<<Chat $interactionNpc "Hey - remember when you were there for me? I don't forget who had my back. Sending you a little something. Thank you.">>
<<else>>
<<Chat $interactionNpc "Hey - remember when you were there for me? I wanted to send you something, but money's tight until payday. I won't forget it, promise.">>
<</if>>
<<Chat $player "You really didn't have to - but thank you.">>
<<if _gift > 0>>
<<set _msg = $interactionNpc.info.firstName + " sends over $" + _gift + ". It's good to have people in your corner.">>
<<else>>
<<set _msg = $interactionNpc.info.firstName + " has nothing to send right now, but the thought counts. It's good to have people in your corner.">>
<</if>>
<<ChatMessage _msg>>
<<PhoneCall_End>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if $pendingPhoneCall == undefined>>
<<goto "Phone">>
<<else>>
<<if $pendingPhoneCall.gift == undefined>>
<<set _sent = setup.npcMoney.phoneGift($interactionNpc, 50, 100, "phone-date:" + $interactionNpc.info.id + ":" + $pendingPhoneCall.day)>>
<<set $pendingPhoneCall.gift = _sent.amount>>
<<set _rel = $player.getRelationship($interactionNpc.info.id, false)>>
<<if _rel>><<set _rel.metrics.love += 4>><</if>>
<</if>>
<<set _gift = $pendingPhoneCall.gift>>
<<if _gift > 0>>
<<Chat $interactionNpc "I saw something today that made me think of you and I couldn't help myself. Sent a little surprise your way 💝 Don't argue - just enjoy it 😘">>
<<Chat $player "You spoil me 🥰">>
<<set _msg = $interactionNpc.info.firstName + " sends you $" + _gift + " and a string of hearts. They really care about you.">>
<<else>>
<<Chat $interactionNpc "I saw something today that made me think of you 💝 I'm broke until payday, so consider this an IOU 😘">>
<<Chat $player "Just hearing from you is enough 🥰">>
<<set _msg = $interactionNpc.info.firstName + " sends a string of hearts. They really care about you.">>
<</if>>
<<ChatMessage _msg>>
<<PhoneCall_End>>
<</if>>
<</nobr>>
/* Shared outcome footer: clear the pending call and return to where you are. */<<widget "PhoneCall_End">>
<div class="npc-event-actions">
<div class="btn"><<button "Continue" $player.info.currentLocation>>
<<unset $pendingPhoneCall $interactionNpc $indexNPC>>
<<set $gameSettings.allowSaves = true>>
<<set $canShowStatsBtn = true>>
<</button>></div>
</div>
<</widget>><<nobr>>
<<include "UpdateAll">>
<<if $playerTextCooldowns == undefined>><<set $playerTextCooldowns = {}>><</if>>
<<set _contacts = getNpcContactCards($player)>>
<<set _today = $dateTime.year * 12 * 31 + $dateTime.month * 31 + $dateTime.day>>
<div class="phone-ui-shell">
<div class="phone-device">
<div class="phone-device-notch"></div>
<<PhoneStatusBar>>
<div class="phone-appbar">
<div class="phone-appbar-leading">
<div class="phone-nav-btn btn"><<button "Back" "PhoneMessages">><</button>></div>
</div>
<div class="phone-appbar-body">
<div class="phone-appbar-kicker">Viceburg Mobile</div>
<div class="phone-appbar-title">Reach out</div>
</div>
<div class="phone-appbar-trailing">
<div class="phone-appbar-counter"><<print _contacts.length>></div>
</div>
</div>
<div class="phone-screen">
<div class="phone-content-stack">
<<if _contacts.length > 0>>
<<for _ci = 0; _ci < _contacts.length; _ci++>>
<<set _c = _contacts[_ci]>>
<<capture _c>>
<<set _cd = $playerTextCooldowns[_c.id]>>
<div class="phone-card">
<div style="font-weight:600; color:#cdd2e4;"><<print _c.name>></div>
/* AI texting (AIC8): free text, judged by the engine. */
<<if typeof aiPhoneChatAvailable === "function" && aiPhoneChatAvailable(_c.id)>>
<div class="btn" style="margin-top:6px;"><<button "💬 Chat" "PhoneAiChat">><<set $phoneChatNpcId = _c.id>><</button>></div>
<</if>>
<<if _cd == undefined || _today >= _cd>>
<div style="display:flex; gap:6px; margin-top:8px; flex-wrap:wrap;">
<div class="btn"><<button "👋 Check in">><<PhoneTextReply _c.id 'friendly' true>><<set $playerTextCooldowns[_c.id] = ($dateTime.year * 12 * 31 + $dateTime.month * 31 + $dateTime.day) + 1>><<goto "PhoneCompose">><</button>></div>
<<if _c.loveVal >= 30>>
<div class="btn"><<button "❤️ Flirt">><<PhoneTextReply _c.id 'romantic' true>><<set $playerTextCooldowns[_c.id] = ($dateTime.year * 12 * 31 + $dateTime.month * 31 + $dateTime.day) + 1>><<goto "PhoneCompose">><</button>></div>
<</if>>
<<if _c.angerVal >= 30>>
<div class="btn"><<button "🕊️ Apologise">><<PhoneTextReply _c.id 'grudge' true>><<set $playerTextCooldowns[_c.id] = ($dateTime.year * 12 * 31 + $dateTime.month * 31 + $dateTime.day) + 1>><<goto "PhoneCompose">><</button>></div>
<</if>>
</div>
<<else>>
<div style="font-size:11px; color:#6b7280; margin-top:6px;">✓ You've already messaged them today.</div>
<</if>>
</div>
<</capture>>
<</for>>
<<else>>
<div class="phone-empty-card">
<div class="phone-empty-title">No contacts</div>
<div class="phone-empty-copy">Meet people around town to start texting them.</div>
</div>
<</if>>
</div>
</div>
</div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<run window.normalizeNpcTexts(State.variables)>>
<<set $npcTextsUnread = 0>>
<<set _texts = Array.isArray($npcTexts) ? $npcTexts.slice().reverse() : []>>
<<set _todayNum = $dateTime.year * 12 * 31 + $dateTime.month * 31 + $dateTime.day>>
<div class="phone-ui-shell">
<div class="phone-device">
<div class="phone-device-notch"></div>
<<PhoneStatusBar>>
<div class="phone-appbar">
<div class="phone-appbar-leading">
<div class="phone-nav-btn btn"><<button "Back" "Phone">><</button>></div>
</div>
<div class="phone-appbar-body">
<div class="phone-appbar-kicker">Viceburg Mobile</div>
<div class="phone-appbar-title">Messages</div>
</div>
<div class="phone-appbar-trailing">
<div class="phone-appbar-counter"><<print _texts.length>></div>
</div>
</div>
<div class="phone-screen">
<div class="phone-content-stack">
<div class="btn" style="margin-bottom:10px;"><<button "✏️ Reach out to someone" "PhoneCompose">><</button>></div>
<<if _texts.length > 0>>
<<for _ti = 0; _ti < _texts.length; _ti++>>
<<set _t = _texts[_ti]>>
<<capture _t>>
<<set _age = _todayNum - _t.day>>
<<set _when = _age <= 0 ? "Today" : (_age == 1 ? "Yesterday" : _age + " days ago")>>
<<set _warmLabel = _t.tone === "romantic" ? "❤️ Flirt back" : (_t.tone === "grudge" ? "🕊️ Say sorry" : (_t.tone === "positive" ? "🙂 You're welcome" : "👍 Sounds good"))>>
<<set _coldLabel = _t.tone === "grudge" ? "Ignore it" : "Leave on read">>
<div class="phone-card" style="display:flex; gap:12px; align-items:flex-start;">
<div style="font-size:22px; line-height:1.1;">💬</div>
<div style="flex:1; min-width:0;">
<div style="font-size:13px; font-weight:600; color:#cdd2e4;"><<print _t.name>></div>
<div style="font-size:14px; line-height:1.4; margin-top:2px;"><<print _t.text>></div>
<div style="font-size:12px; margin-top:4px; color:#8b91a6;"><<print _when>></div>
<<if not _t.replied>>
<div style="display:flex; gap:8px; margin-top:8px; flex-wrap:wrap;">
<<if _t.afterBreakup>>
<div class="btn"><<button "We can talk when we meet">><<run window.replyToNpcAfterBreakupText(_t.npcId, _t.afterBreakup.cycle, _t.afterBreakup.sentMinute, 'talk')>><<goto "PhoneMessages">><</button>></div>
<div class="btn"><<button "I need more time apart">><<run window.replyToNpcAfterBreakupText(_t.npcId, _t.afterBreakup.cycle, _t.afterBreakup.sentMinute, 'space')>><<goto "PhoneMessages">><</button>></div>
<div class="btn"><<button "Please leave our relationship in the past">><<run window.replyToNpcAfterBreakupText(_t.npcId, _t.afterBreakup.cycle, _t.afterBreakup.sentMinute, 'close')>><<goto "PhoneMessages">><</button>></div>
<div class="btn"><<button "Leave without replying">><<run window.replyToNpcAfterBreakupText(_t.npcId, _t.afterBreakup.cycle, _t.afterBreakup.sentMinute, 'dismiss')>><<goto "PhoneMessages">><</button>></div>
<<elseif _t.followUp>>
<div class="btn"><<button "Thanks for telling me">><<run window.replyToNpcFollowUpText(_t.npcId, _t.followUp.eventId, 'acknowledge')>><<goto "PhoneMessages">><</button>></div>
<div class="btn"><<button "I need some time">><<run window.replyToNpcFollowUpText(_t.npcId, _t.followUp.eventId, 'space')>><<goto "PhoneMessages">><</button>></div>
<div class="btn"><<button "Leave without replying">><<run window.replyToNpcFollowUpText(_t.npcId, _t.followUp.eventId, 'dismiss')>><<goto "PhoneMessages">><</button>></div>
<<else>>
<div class="btn"><<button _warmLabel>><<PhoneTextReply _t.npcId _t.tone true>><<set _t.replied = true>><<goto "PhoneMessages">><</button>></div>
<div class="btn"><<button _coldLabel>><<PhoneTextReply _t.npcId _t.tone false>><<set _t.replied = true>><<goto "PhoneMessages">><</button>></div>
<</if>>
</div>
<<else>>
<div style="font-size:11px; margin-top:6px; color:#6b7280;"><span>✓ </span><<print (_t.followUp || _t.afterBreakup) ? (_t.replySummary || "Message handled") : "Replied">></div>
<</if>>
</div>
</div>
<</capture>>
<</for>>
<<else>>
<div class="phone-empty-card">
<div class="phone-empty-title">No messages</div>
<div class="phone-empty-copy">Get close to people - or get on their bad side - and they'll start texting you. Their messages land here.</div>
</div>
<</if>>
</div>
</div>
</div>
</div>
<</nobr>>
/* Applies the small relationship nudge for a text reply. _args: npcId, tone, warm(bool).
A text reply is intentionally lighter than a real in-person interaction. */<<widget "PhoneTextReply">>
<<set _trid = _args[0]>>
<<set _trtone = _args[1]>>
<<set _trwarm = _args[2]>>
<<set _trrel = $player.getRelationship(_trid, false)>>
<<if _trrel>>
<<switch _trtone>>
<<case "romantic">>
<<if _trwarm>>
<<set _trrel.metrics.love += 3>>
<<run window.recordNpcMemory(_trid, 'flirted', { intensity: 1 })>>
<<else>>
<<set _trrel.metrics.love -= 2>>
<</if>>
<<case "grudge">>
<<if _trwarm>>
<<set _trrel.metrics.anger -= 8>>
<<run window.recordNpcMemory(_trid, 'apologized', { intensity: 1 })>>
<<else>>
<<set _trrel.metrics.anger += 4>>
<</if>>
<<case "positive">>
<<if _trwarm>><<set _trrel.metrics.friendship += 2>><</if>>
<<case "friendly">>
<<if _trwarm>><<set _trrel.metrics.friendship += 2>><</if>>
<</switch>>
<</if>>
<</widget>><<nobr>>
<<include "UpdateAll">>
<<set _m = setup.npcMoney.view($player, $interactionNpc)>>
<<set _charName = [$interactionNpc.info.firstName, $interactionNpc.info.secondName].filter(Boolean).join(" ").trim()>>
<div class="phone-ui-shell">
<div class="phone-device">
<div class="phone-device-notch"></div>
<<PhoneStatusBar>>
<div class="phone-appbar">
<div class="phone-appbar-leading">
<div class="phone-nav-btn btn"><<button "Back" "PhoneCall">><<unset $moneyResult>><</button>></div>
</div>
<div class="phone-appbar-body">
<div class="phone-appbar-kicker">Send money</div>
<div class="phone-appbar-title"><<print _charName>></div>
</div>
<div class="phone-appbar-trailing"></div>
</div>
<div class="phone-screen">
<div class="phone-content-stack">
<<if $moneyResult>>
<div class="phone-card">
<<if $moneyResult.npcLine>><div class="phone-card-copy">"<<print $moneyResult.npcLine>>"</div><</if>>
<div class="phone-card-copy"><<print $moneyResult.message>></div>
</div>
<</if>>
<div class="phone-card">
<<if _m.youOwe > 0>>
<div class="phone-card-copy">You owe <<print _charName>> $<<= _m.youOwe>><<if _m.overdue>>, and it is overdue<</if>>.</div>
<</if>>
<<if _m.theyOwe > 0>>
<div class="phone-card-copy"><<print _charName>> owes you $<<= _m.theyOwe>>.</div>
<</if>>
<div class="phone-card-copy">You have $<<= _m.playerMoney>>.</div>
</div>
<<if _m.youOwe > 0>>
<div class="phone-card">
<div class="phone-card-title">Pay back</div>
<div class="money-panel__buttons">
<<set _label = "Pay all $" + _m.youOwe>>
<<if _m.playerMoney >= _m.youOwe>>
<div class="btn"><<button _label "PhoneSendMoney">><<set $moneyResult = setup.npcMoney.run("repay", $player, $interactionNpc, _m.youOwe)>><</button>></div>
<</if>>
<<for _amt range [20, 50]>>
<<capture _amt>>
<<set _label = "Pay $" + _amt>>
<<if _amt < _m.youOwe && _m.playerMoney >= _amt>>
<div class="btn"><<button _label "PhoneSendMoney">><<set $moneyResult = setup.npcMoney.run("repay", $player, $interactionNpc, _amt)>><</button>></div>
<</if>>
<</capture>>
<</for>>
</div>
</div>
<</if>>
<div class="phone-card">
<div class="phone-card-title">Send a gift</div>
<div class="money-panel__buttons">
<<for _amt range _m.amounts>>
<<capture _amt>>
<<set _label = "Send $" + _amt>>
<<if _m.playerMoney >= _amt>>
<div class="btn"><<button _label "PhoneSendMoney">><<set $moneyResult = setup.npcMoney.run("give", $player, $interactionNpc, _amt)>><</button>></div>
<</if>>
<</capture>>
<</for>>
</div>
</div>
</div>
</div>
</div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _nakedTokenMatches = $policeNakedStop and $policeNakedStop.day is getCurrentAbsoluteDay() and $policeNakedStop.location is $player.info.currentLocation>>
<<set _nakedActuallyExposed = $player.clothes.IndecentlyDressed($player.gender() == "Male")>>
<<set _nakedIncidentPending = ($policeStopCrime is "indecency") and hasWarrant($police, "indecency")>>
<<if not _nakedTokenMatches or not _nakedActuallyExposed or policeDayPassTaken($police, $policeDayPass)>>
/* Only PoliceChecker may open this encounter. A direct, stale, dressed, or
already-resolved entry cannot create a charge. */
<<LeaveInteractionSettings>>
<<set _policeReturn = $policeReturnPassage || $player.info.currentLocation>>
<<unset $policeNakedStop $policeReturnPassage>>
<<goto _policeReturn>>
<<else>>
<<LockSettings>>
<<set _nakedWanted = getWanted($police)>>
<<if isFugitive($police) or hasFelonyWarrant($police) or _nakedWanted gte 75>>
/* The generic serious-stop route now owns the encounter. Do not leave a
reusable naked-stop credential behind. */
<<unset $policeNakedStop>>
<<set $policeStopMsg = "">>
<<unset $policeResisting>>
<<set $policeStopCrime = worstWarrant($police) || (isFugitive($police) ? "escape" : "wanted")>>
<<goto "Police_Stop">>
<<else>>
/* Public indecency is stamped once. On a restored render, the matching token and
still-open stop prove that the first render already raised the charge. */
<<if not _nakedIncidentPending>>
<<run raiseWanted($police, 'indecency', getCurrentAbsoluteDay(), $player.info.currentLocation)>>
<<set $policeStopCrime = "indecency">>
<</if>>
/* <<set $randomPolicemen = Random(0,100) > 50 ? "policeman" : "policewoman">> */
<<set $randomPolicemen = "policeman">>
<<set $imgPolice = 'Media\\Characters\\QuestChars\\Other\\Police\\' + $randomPolicemen + '.jpg'>>
<<DrawImg $imgPolice>>
<<ChatWithoutNPC 'Officer' $imgPolice 'Stop right there. You are indecently exposed in public. Cover yourself and keep your hands where I can see them.'>>
<<Chat $player 'Come on, officer. Nobody got hurt. Can we keep this off the paperwork?'>>
<<ChatMessage 'Public indecency carries a $500 fine. Pay it, or I take you in. Decide.'>>
<<if $player.money >= 500>>
<div class="btn padding-top"><<button "Pay the fine ($500)" "PayTheFine_PoliceTalkNaked">><</button>></div>
<<else>>
<div class="btn non-interacting"><<button "Pay the fine ($500)">><</button>></div>
<</if>>
<div class="btn padding-top"><<button "Go to the station" "Arrest_PoliceTalkNaked">><</button>></div>
<<if CheckContentFilter('Male', $player)>>
<div class="btn padding-top"><<button "Offer to perform oral sex" "OralSex_PoliceTalkNaked">><</button>></div>
<</if>>
<div class="btn padding-top"><<button "Fight" "PoliceFight">><</button>></div>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
/* The choice is only authoritative while this exact stop still owns an open
indecency charge. Revalidate on entry so a restored/reloaded result passage
cannot debit the player again, and a direct visit cannot buy unrelated paper. */
<<set _nakedFineToken = $policeNakedStop and $policeNakedStop.day is getCurrentAbsoluteDay() and $policeNakedStop.location is $player.info.currentLocation>>
<<set _nakedFinePending = ($policeStopCrime is "indecency") and hasWarrant($police, "indecency")>>
<<if _nakedFineToken and _nakedFinePending and $player.money gte 500>>
<<unset $policeNakedStop>>
<<Chat $player 'Here is the five hundred. Let us be done.'>>
<<ChatWithoutNPC 'Officer' $imgPolice '*writes the citation* Put some clothes on before another cop sees you.'>>
<<set $player.money = Math.max(0, $player.money - 500)>>
<<run clearWarrant($police, "indecency")>>
<<run adjustWanted($police, -10)>>
<<set $police.dayPass = true>><<set $policeDayPass = true>>
<<unset $policeStopCrime>>
<div class="btn padding-top"><<button "Continue">>
<<LeaveInteractionSettings>>
<<set _policeReturn = $policeReturnPassage || $player.info.currentLocation>>
<<unset $policeReturnPassage>>
<<goto _policeReturn>>
<</button>></div>
<<else>>
/* Stale, unaffordable, or direct entry fails closed without mutating money,
heat, warrants, or the active charge. */
<<LeaveInteractionSettings>>
<<set _policeReturn = $policeReturnPassage || $player.info.currentLocation>>
<<unset $policeNakedStop $policeReturnPassage>>
<<goto _policeReturn>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _nakedArrestToken = $policeNakedStop and $policeNakedStop.day is getCurrentAbsoluteDay() and $policeNakedStop.location is $player.info.currentLocation>>
<<set _nakedArrestPending = ($policeStopCrime is "indecency") and hasWarrant($police, "indecency")>>
<<if _nakedArrestToken and _nakedArrestPending>>
<<ChatWithoutNPC 'Officer' $imgPolice 'Turn around. Hands behind your back. You are under arrest.'>>
/* Let the shared severity catalog route this low-level charge normally. */
<div class="btn padding-top"><<button "Continue">>
<<unset $policeNakedStop>>
<<set $playerInitFight = 0>>
<<set $policeStopCrime = "indecency">>
<<goto "Police_Booking">>
<</button>></div>
<<else>>
<<LeaveInteractionSettings>>
<<set _policeReturn = $policeReturnPassage || $player.info.currentLocation>>
<<unset $policeNakedStop $policeReturnPassage>>
<<goto _policeReturn>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _nakedOralToken = $policeNakedStop and $policeNakedStop.day is getCurrentAbsoluteDay() and $policeNakedStop.location is $player.info.currentLocation>>
<<set _nakedOralPending = ($policeStopCrime is "indecency") and hasWarrant($police, "indecency")>>
<<if _nakedOralToken and _nakedOralPending and CheckContentFilter('Male', $player)>>
<<unset $policeNakedStop>>
<<Chat $player 'Maybe I can make this worth your time. Somewhere private.'>>
<<ChatWithoutNPC 'Officer' $imgPolice '*checks the street* Behind the building. On your knees. You have two minutes.'>>
<<if $player.gender() == "Male">>
<<run _pic = "Media\\Events\\Police\\Street\\Male_Cop_Blowjob.mp4">>
<<else>>
<<run _pic = "Media\\Events\\Police\\Street\\Female_Cop_Blowjob.mp4">>
<</if>>
<<Video _pic>>
<<PrisonProse "A male officer stands over you as you kneel and pulls out his hard cock. You take it into your mouth while he holds your head and thrusts. He cums down your throat and makes you swallow.">>
<<set $playerInitFight = 0>>
/* This bargain answers only the indecency incident that opened this encounter.
Its four heat points are removed; unrelated heat and warrants remain. */
<<run clearWarrant($police, "indecency")>>
<<run adjustWanted($police, -4)>>
<<set $police.dayPass = true>><<set $policeDayPass = true>>
<<unset $policeStopCrime>>
<div class="btn padding-top"><<button "Continue">>
<<LeaveInteractionSettings>>
<<set _policeReturn = $policeReturnPassage || $player.info.currentLocation>>
<<unset $policeReturnPassage>>
<<goto _policeReturn>>
<</button>></div>
<<else>>
<<LeaveInteractionSettings>>
<<set _policeReturn = $policeReturnPassage || $player.info.currentLocation>>
<<unset $policeNakedStop $policeReturnPassage>>
<<goto _policeReturn>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _nakedFightTokenPresent = $policeNakedStop>>
<<set _nakedFightToken = $policeNakedStop and $policeNakedStop.day is getCurrentAbsoluteDay() and $policeNakedStop.location is $player.info.currentLocation>>
<<set _nakedFightPending = ($policeStopCrime is "indecency") and hasWarrant($police, "indecency")>>
/* PoliceFight is also shared by Police_Stop, Police_Raid, and PoliceFightArrest.
Their buttons issue a one-shot source token. This keeps every authored entry
working even after an unrelated fight today, while direct/replayed entry is
rejected and cannot mint a fresh assault warrant. */
<<set _genericFightToken = $policeFightSource and $policeFightSource.day is getCurrentAbsoluteDay() and $policeFightSource.location is $player.info.currentLocation and $policeFightSource.crime is $policeStopCrime and ($policeFightSource.source is "stop" or $policeFightSource.source is "raid" or $policeFightSource.source is "arrest")>>
<<set _genericPoliceFight = not _nakedFightTokenPresent and _genericFightToken and $policeStopCrime and $policeResisting isnot true and (hasWarrant($police, $policeStopCrime) or $policeStopCrime is "loitering" or $policeStopCrime is "wanted" or $policeStopCrime is "escape")>>
<<if (_nakedFightToken and _nakedFightPending) or _genericPoliceFight>>
<<set _fightOrigin = _nakedFightToken ? "naked" : $policeFightSource.source>>
<<if _nakedFightToken>><<unset $policeNakedStop>><</if>>
/* Resisting a stop is a new assault charge of its own. Stamp it before combat so
both a win and a loss leave the same answerable paper trail. */
<<run raiseWanted($police, 'assault', getCurrentAbsoluteDay(), $player.info.currentLocation)>>
<<set $policeStopCrime = "assault">>
<<set $policeResisting = true>>
/* Keep a one-shot battle receipt until an authored outcome consumes or advances
it. Result passages can no longer be entered directly for free day-pass or
arrest effects. */
<<set $policeFightSource = { source: "fight-active", day: getCurrentAbsoluteDay(), location: $player.info.currentLocation, crime: "assault", origin: _fightOrigin }>>
<<include "Create_policeman">>
<<set _battleSetControls = {attack: true, seduce: false, items: true, actions: true}>>
<<StartFight $player $interactionNpc _battleSetControls "PoliceFightWin" "PoliceFightLoose">>
<<else>>
<<LeaveInteractionSettings>>
<<set _policeReturn = $policeReturnPassage || $player.info.currentLocation>>
<<unset $policeNakedStop $policeFightSource $policeReturnPassage>>
<<goto _policeReturn>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _fightWinAuthority = $policeFightSource and $policeFightSource.source is "fight-active" and $policeFightSource.day is getCurrentAbsoluteDay() and $policeFightSource.location is $player.info.currentLocation and $policeFightSource.crime is "assault" and $policeStopCrime is "assault" and $policeResisting is true and hasWarrant($police, "assault")>>
<<if _fightWinAuthority>>
<<unset $policeFightSource $finishLock $finishLockLoose>>
<<set $dayFight = getCurrentAbsoluteDay()>>
<<set $police.dayPass = true>><<set $policeDayPass = true>>
<<unset $policeResisting>>
<<DeleteCharacter $interactionNpc>>
<<else>>
<<if $policeFightSource and ($policeFightSource.source is "fight-active" or $policeFightSource.source is "fight-loss-choice")>><<unset $policeFightSource>><</if>>
<</if>>
<<LeaveInteractionSettings>>
<<set _policeReturn = $policeReturnPassage || $player.info.currentLocation>>
<<unset $policeReturnPassage>>
<<goto _policeReturn>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _fightLossActive = $policeFightSource and $policeFightSource.source is "fight-active" and $policeFightSource.day is getCurrentAbsoluteDay() and $policeFightSource.location is $player.info.currentLocation and $policeFightSource.crime is "assault" and $policeStopCrime is "assault" and $policeResisting is true and hasWarrant($police, "assault")>>
<<set _fightLossChoice = $policeFightSource and $policeFightSource.source is "fight-loss-choice" and $policeFightSource.day is getCurrentAbsoluteDay() and $policeFightSource.location is $player.info.currentLocation and $policeFightSource.crime is "assault" and hasWarrant($police, "assault")>>
<<if _fightLossActive>>
<<DeleteCharacter $interactionNpc>>
<<unset $finishLock $finishLockLoose>>
<<set $policeFightSource = { source: "fight-loss-choice", day: getCurrentAbsoluteDay(), location: $player.info.currentLocation, crime: "assault" }>>
<<set _fightLossAuthorized = true>>
<<elseif _fightLossChoice>>
<<set _fightLossAuthorized = true>>
<<else>>
<<set _fightLossAuthorized = false>>
<</if>>
<<if _fightLossAuthorized>>
<<LockSettings>>
<<ChatWithoutNPC 'Officer' $imgPolice 'On your stomach. Hands behind your back. You are done fighting.'>>
<<set $playerInitFight = 0>>
/* Police_Booking is the single severity/warrant route for every lost stop. */
<<set $policeStopCrime = "assault">>
<<set $policeResisting = true>>
<div class="btn padding-top"><<button "Continue">>
<<set _fightLossStillAuthorized = $policeFightSource and $policeFightSource.source is "fight-loss-choice" and $policeFightSource.day is getCurrentAbsoluteDay() and $policeFightSource.location is $player.info.currentLocation and $policeFightSource.crime is "assault" and hasWarrant($police, "assault")>>
<<if _fightLossStillAuthorized>>
<<unset $policeFightSource>>
<<set $policeStopCrime = "assault">>
<<set $policeResisting = true>>
<<goto "Police_Booking">>
<<else>>
<<goto "PoliceFightLoose">>
<</if>>
<</button>></div>
<<else>>
<<if $policeFightSource and ($policeFightSource.source is "fight-active" or $policeFightSource.source is "fight-loss-choice")>><<unset $policeFightSource>><</if>>
<<LeaveInteractionSettings>>
<<set _policeReturn = $policeReturnPassage || $player.info.currentLocation>>
<<unset $policeReturnPassage>>
<<goto _policeReturn>>
<</if>>
<</nobr>><<nobr>>
<<include "CharactersData">>
<<set _copFemale = ($randomPolicemen is "policewoman")>>
<<run _policeman = CreateCharacter({
isPlayer: false,
isQuestCharacter: true,
questCharID: 11,
currentQuestID: 0,
currentCharImg: $imgPolice,
currentCharState: _copFemale ? "Policewoman" : "Policeman",
characterWork: _copFemale ? "Policewoman" : "Policeman",
SexRole: "Active",
dominance: 10,
gender: _copFemale ? "Female" : "Male",
fat: 40,
strength: 7,
vitality: 5,
endurance: 6,
dexterity: 5,
defense: 6,
sexualPreference: "Bi",
clothesPreference: _copFemale ? "women" : "men",
skin: "White",
age: 34,
}, true)>>
<<set $indexNPC = $Characters.indexOf(_policeman)>>
<<set $interactionNpc = $Characters[$indexNPC]>>
<<unset $maleNames $femaleNames $surnames>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _fightArrestEntry = $policeFightSource and $policeFightSource.source is "arrest-pending" and $policeFightSource.day is getCurrentAbsoluteDay() and $policeFightSource.location is $player.info.currentLocation and $policeFightSource.crime is "assault" and $playerInitFight > 0>>
<<set _fightArrestChoice = $policeFightSource and $policeFightSource.source is "arrest-choice" and $policeFightSource.day is getCurrentAbsoluteDay() and $policeFightSource.location is $player.info.currentLocation and $policeFightSource.crime is "assault" and hasWarrant($police, "assault")>>
<<set _fightArrestAuthorized = false>>
<<if _fightArrestEntry>>
/* The ambient checker is the only authority for this legacy delayed arrest.
Charge it once, consume the legacy marker, then retain a second-phase choice
token so reload cannot either duplicate the charge or escape the collar. */
<<set $playerInitFight = 0>>
<<run raiseWanted($police, 'assault', getCurrentAbsoluteDay(), $player.info.currentLocation)>>
<<set $policeStopCrime = "assault">>
<<set $policeFightSource = { source: "arrest-choice", day: getCurrentAbsoluteDay(), location: $player.info.currentLocation, crime: "assault" }>>
<<set _fightArrestAuthorized = true>>
<<elseif _fightArrestChoice>>
<<set $policeStopCrime = "assault">>
<<set _fightArrestAuthorized = true>>
<</if>>
<<if _fightArrestAuthorized>>
<<LockSettings>>
<<set $randomPolicemen = (random(1, 100) gt 50) ? "policewoman" : "policeman">>
<<set $imgPolice = 'Media\\Characters\\QuestChars\\Other\\Police\\' + $randomPolicemen + '.jpg'>>
<<DrawImg $imgPolice>>
<<ChatWithoutNPC 'Officer' $imgPolice 'You are under arrest for assault. The victim identified you. Turn around and put your hands behind your back.'>>
/* Surrendering to an assault collar routes through the severity model like every
other crime (doc 19.9) - a felony rides to state prison (with bail/plea to buy
out), not the flat drunk-tank the legacy naked-indecency stop used. Clearing
$playerInitFight stops the ambient checker from re-arresting for the same fight. */
<div class="btn padding-top"><<button "Give it up">>
<<set _giveUpAuthority = $policeFightSource and $policeFightSource.source is "arrest-choice" and $policeFightSource.day is getCurrentAbsoluteDay() and $policeFightSource.location is $player.info.currentLocation and $policeFightSource.crime is "assault" and hasWarrant($police, "assault")>>
<<if _giveUpAuthority>>
<<unset $policeFightSource>>
<<set $policeStopCrime = "assault">>
<<goto "Police_Booking">>
<<else>>
<<goto "PoliceFightArrest">>
<</if>>
<</button>></div>
<div class="btn padding-top"><<button "Fight">>
<<set _fightAuthority = $policeFightSource and $policeFightSource.source is "arrest-choice" and $policeFightSource.day is getCurrentAbsoluteDay() and $policeFightSource.location is $player.info.currentLocation and $policeFightSource.crime is "assault" and hasWarrant($police, "assault")>>
<<if _fightAuthority>>
<<set $policeFightSource = { source: "arrest", day: getCurrentAbsoluteDay(), location: $player.info.currentLocation, crime: $policeStopCrime }>>
<<goto "PoliceFight">>
<<else>>
<<goto "PoliceFightArrest">>
<</if>>
<</button>></div>
<<else>>
<<unset $policeFightSource>>
<<LeaveInteractionSettings>>
<<set _policeReturn = $policeReturnPassage || $player.info.currentLocation>>
<<unset $policeReturnPassage>>
<<goto _policeReturn>>
<</if>>
<</nobr>>/* The player's rap sheet HUD (doc 19). Built in TS (policeSheetHtml) so this stays
a one-liner and clear of the macro-in-attribute pitfall (dynamic meter bars). */
<<widget "PoliceSheet">>
<<= policeSheetHtml($police)>>
<</widget>>
/* A compact one-line wanted read for a location fieldset - the tier label and heat,
shown only when the player is on the radar at all. */
<<widget "WantedLine">>
<<set _wl = wantedTier(getWanted($police))>>
<<if _wl.key isnot "clean">>
<div class="centre-text" style="font-size:13px;color:#d98b8b;"><<= _wl.label>> · heat <<= getWanted($police)>>/100</div>
<</if>>
<</widget>><<nobr>>
<<include "UpdateAll">>
<<SaveLocation>>
<<SetBackground "Media/Locations/Downtown/Police Station/PoliceRoom.jpg">>
<div class="centre-text">The Front Desk</div>
<div class="chat-container"><p class="text">A bored duty sergeant sits behind bulletproof glass. Most-wanted flyers cover one wall, and a row of plastic chairs holds people waiting on reports, bail and bad news.</p></div>
<<PoliceSheet>>
<<set _wc = warrantCount($police)>>
<<set _fine = warrantFine($police)>>
<<set _fug = isFugitive($police)>>
<fieldset>
<legend>Square your account</legend>
<div class="btn-container">
<<if _wc gt 0>>
<<if not _fug>>
<<if $player.money gte _fine>>
<<set _fineLbl = "Grease the clerk to lose the paperwork ($" + _fine + ")">>
<div class="btn"><<button _fineLbl>>
<<set _wcNow = warrantCount($police)>>
<<set _fineNow = warrantFine($police)>>
<<set _fugNow = isFugitive($police)>>
<<if _wcNow gt 0 and _wcNow is _wc and _fineNow is _fine and not _fugNow and $player.money gte _fineNow>>
<<set $player.money -= _fineNow>>
<<run clearAllWarrants($police)>>
<<run adjustWanted($police, -40)>>
<<goto "PoliceFrontDesk_Cleared">>
<<else>>
<<goto "PoliceFrontDesk">>
<</if>>
<</button>></div>
<<else>>
<<set _needLbl = "Grease the clerk (need $" + _fine + ")">>
<div class="btn non-interacting"><<button _needLbl>><</button>></div>
<</if>>
<<else>>
<div class="centre-text" style="font-size:13px;color:#ff8b8b;">There is a manhunt out for you - no clerk on earth will quietly lose that paper. You answer it or you run.</div>
<</if>>
<div class="btn"><<button "Turn yourself in and answer the charges" "PoliceTurnIn">><</button>></div>
<<else>>
<div class="centre-text" style="font-size:14px;color:#8fbf8f;">Nothing outstanding on the books. Walk out of here while that is still true.</div>
<</if>>
</div>
</fieldset>
<div class="btn padding-top"><<button "Leave the desk" "PoliceRoom">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/Downtown/Police Station/PoliceRoom.jpg">>
<div class="centre-text">Off the Books</div>
<div class="chat-container"><p class="text">A few bills change hands in the camera blind. The clerk feeds your warrant sheets into the shredder and drops the empty folder back in the cabinet. Your record remains, but the active warrants are gone.</p></div>
<<PoliceSheet>>
<div class="btn padding-top"><<button "Leave the station" "PoliceStation">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
/* The underworld way off a manhunt (doc 13.5): a fixer sells a fugitive new paper.
Expensive, but it cuts the thread - clears the fugitive flag, buries the open
warrants and heat, and shaves (not erases) the notoriety that legend built. */
<<set _cost = 2000>>
<div class="centre-text">The Fixer</div>
<div class="chat-container prison-prose"><p class="text">The fixer meets you in a back room behind a check-cashing place and never offers a name. <span class='dialogue-speech'>"You need a license, a Social Security card and a birth certificate that survive a database check. Two grand up front. I call when the envelope is ready."</span></p></div>
<<if not isFugitive($police)>>
<div class="chat-container"><p class="text">He looks you over and shakes his head. "You are not running from anything I need to fix today. Come back when the dogs are actually out."</p></div>
<div class="btn padding-top"><<button "Leave" `$player.info.currentLocation`>><</button>></div>
<<else>>
<div class="btn-container">
<<if $player.money gte _cost>>
<div class="btn"><<button "Buy a new identity ($2000)">>
<<set _costNow = 2000>>
<<if isFugitive($police) and $player.money gte _costNow>>
<<set $player.money -= _costNow>>
<<run clearFugitive($police)>>
<<run adjustWanted($police, -100)>>
<<run clearAllWarrants($police)>>
<<set $police.notoriety = Math.max(0, ($police.notoriety || 0) - 30)>>
<<SpendTime 10080>>
<<goto "Fixer_Done">>
<<else>>
<<goto "Fixer_NewIdentity">>
<</if>>
<</button>></div>
<<else>>
<div class="btn non-interacting"><<button "Buy a new identity (need $2000)">><</button>></div>
<</if>>
<div class="btn"><<button "Not today" `$player.info.currentLocation`>><</button>></div>
</div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<div class="centre-text">A New Identity</div>
<div class="chat-container prison-prose"><p class="text">Seven days later, the fixer hands you a manila envelope. The license carries your face under a stranger's name. The Social Security card and birth certificate match it. Your record still exists, but patrol officers no longer know the name you give them.</p></div>
<<PoliceSheet>>
<div class="btn padding-top"><<button "Walk out someone new" `$player.info.currentLocation`>><</button>></div>
<</nobr>><<goto "Downtown">><<goto "Downtown">><<goto "Downtown">><<nobr>>
<<include "UpdateAll">>
<<SetBackground "Media/Locations/Downtown/Police Station/PoliceRoom.jpg">>
/* Rendering is only a proposal. The terminal button re-fetches the worst warrant
and severity before atomically clearing the sheet and entering custody. */
<<set _wcrime = worstWarrant($police)>>
<<if not _wcrime>>
<<goto "PoliceFrontDesk">>
<<else>>
<<set _sev = computeSeverity(_wcrime, { priors: ($prison ? $prison.priors : 0), wanted: getWanted($police), notoriety: getNotoriety($police), warrants: warrantCount($police) })>>
<<set $imgPolice = 'Media\\Characters\\QuestChars\\Other\\Police\\policeman.jpg'>>
<<ChatWithoutNPC 'Duty Sergeant' $imgPolice 'You saved us the trip. Put your hands on the counter and keep them there while I process you.'>>
<<if routesToPrison(_sev)>>
<div class="btn padding-top"><<button "Get processed">>
<<set _turnCrimeNow = worstWarrant($police)>>
<<set _turnSevNow = _turnCrimeNow ? computeSeverity(_turnCrimeNow, { priors: ($prison ? $prison.priors : 0), wanted: getWanted($police), notoriety: getNotoriety($police), warrants: warrantCount($police) }) : 0>>
<<if _turnCrimeNow and _turnCrimeNow is _wcrime and _turnSevNow is _sev and routesToPrison(_turnSevNow)>>
<<run clearAllWarrants($police)>>
<<run clearFugitive($police)>>
<<set $playerInitFight = 0>>
<<run adjustWanted($police, -100)>>
<<unset $policeBookingAuthority $policeFightSource $policeResisting $policeReturnPassage>>
<<run arrestPlayer(_turnSevNow)>>
<<LeaveInteractionSettings>>
<<goto "Prison_Intake">>
<<else>>
<<goto "PoliceTurnIn">>
<</if>>
<</button>></div>
<<else>>
<div class="centre-text">Booked</div>
<div class="chat-container"><p class="text">The sergeant books you on the outstanding charges and writes twenty-one days on the holding sheet. If you still have time left when county transport arrives, you will finish it upstate.</p></div>
<div class="btn padding-top"><<button "Continue">>
<<set _turnCrimeNow = worstWarrant($police)>>
<<set _turnSevNow = _turnCrimeNow ? computeSeverity(_turnCrimeNow, { priors: ($prison ? $prison.priors : 0), wanted: getWanted($police), notoriety: getNotoriety($police), warrants: warrantCount($police) }) : 0>>
<<if _turnCrimeNow and _turnCrimeNow is _wcrime and _turnSevNow is _sev and not routesToPrison(_turnSevNow)>>
<<run clearAllWarrants($police)>>
<<run clearFugitive($police)>>
<<set $playerInitFight = 0>>
<<run adjustWanted($police, -100)>>
<<unset $policeBookingAuthority $policeFightSource $policeResisting $policeReturnPassage>>
<<set $ArrestDay = TANK_SENTENCE_DAYS>>
<<set $ArrestDayStamp = getCurrentAbsoluteDay()>>
<<set $TankDaysServed = 0>>
<<set $TankSeverity = _turnSevNow>>
<<run onArrested()>>
<<LeaveInteractionSettings>>
<<goto "HoldingCell">>
<<else>>
<<goto "PoliceTurnIn">>
<</if>>
<</button>></div>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<LockSettings>>
/* A fresh stop has its message cleared and rolls a cop. Keep the prior roll only
for a legacy/restored stop that still carries its matching failure message. */
<<if not $policeStopMsg or $policeStopMsg is "">>
<<set $randomPolicemen = (random(1, 100) gt 50) ? "policewoman" : "policeman">>
<</if>>
<<set $imgPolice = 'Media\\Characters\\QuestChars\\Other\\Police\\' + $randomPolicemen + '.jpg'>>
<<set _copFem = ($randomPolicemen is "policewoman")>>
<<set $copSubj = _copFem ? "She" : "He">>
<<set $copObj = _copFem ? "her" : "him">>
<<set _copGender = _copFem ? "Female" : "Male">>
<<DrawImg $imgPolice>>
<<set _wanted = getWanted($police)>>
/* Compare the authored/in-progress charge with the worst open warrant instead of
blindly replacing one with the other. The more serious charge wins. On a tie,
a concrete caught charge stays authoritative; paper only wins over heat-only
loitering so the booking still answers a real warrant. */
<<set _stopCurrentCrime = $policeStopCrime || (isFugitive($police) ? "escape" : "loitering")>>
<<set _stopWarrant = worstWarrant($police)>>
<<set _stopCurrentSeverity = computeSeverity(_stopCurrentCrime)>>
<<set _stopWarrantSeverity = _stopWarrant ? computeSeverity(_stopWarrant) : 0>>
<<set _stopWarrantWins = _stopWarrant and (_stopWarrantSeverity gt _stopCurrentSeverity or (_stopCurrentCrime is "loitering" and _stopWarrantSeverity is _stopCurrentSeverity))>>
<<if _stopWarrantWins>>
<<set $policeStopCrime = _stopWarrant>>
<<else>>
<<set $policeStopCrime = _stopCurrentCrime>>
<</if>>
<<set _stopCopy = policeStopCopy($policeStopCrime || "burglary", _wanted, isFugitive($police))>>
/* A cash ticket is only available when this booking would stay below the prison
threshold. The old unconditional button let a felony disappear for $500. */
<<set _streetSeverity = computeSeverity($policeStopCrime || "burglary", { priors: ($prison ? $prison.priors : 0), wanted: _wanted, notoriety: getNotoriety($police), warrants: warrantCount($police) })>>
<<if $policeStopCrime is "loitering" and _streetSeverity gte 3>><<set _streetSeverity = 2>><</if>>
<<set _seriousStop = routesToPrison(_streetSeverity) or hasFelonyWarrant($police) or _wanted gte 75>>
<div class="centre-text"><<= _stopCopy.title>></div>
<<ChatWithoutNPC 'Officer' $imgPolice _stopCopy.dialogue>>
<div class="chat-container"><p class="text"><<= _stopCopy.scene>></p></div>
<<if $policeStopMsg and $policeStopMsg isnot "">>
<div class="chat-container"><p class="text"><<= $policeStopMsg>></p></div>
<<set $policeStopMsg = "">>
<</if>>
<div class="btn-container">
<<if not _seriousStop and $player.money gte 500>>
<div class="btn"><<button "Pay the fine ($500)">>
<<set _fineWantedNow = getWanted($police)>>
<<set _fineCrimeNow = $policeStopCrime || (isFugitive($police) ? "escape" : "loitering")>>
<<set _fineWarrantNow = worstWarrant($police)>>
<<set _fineCrimeSeverityNow = computeSeverity(_fineCrimeNow)>>
<<set _fineWarrantSeverityNow = _fineWarrantNow ? computeSeverity(_fineWarrantNow) : 0>>
<<set _fineWarrantWinsNow = _fineWarrantNow and (_fineWarrantSeverityNow gt _fineCrimeSeverityNow or (_fineCrimeNow is "loitering" and _fineWarrantSeverityNow is _fineCrimeSeverityNow))>>
<<if _fineWarrantWinsNow>><<set _fineCrimeNow = _fineWarrantNow>><</if>>
<<set _fineSeverityNow = computeSeverity(_fineCrimeNow, { priors: ($prison ? $prison.priors : 0), wanted: _fineWantedNow, notoriety: getNotoriety($police), warrants: warrantCount($police) })>>
<<if _fineCrimeNow is "loitering" and _fineSeverityNow gte 3>><<set _fineSeverityNow = 2>><</if>>
<<set _fineSeriousNow = routesToPrison(_fineSeverityNow) or hasFelonyWarrant($police) or _fineWantedNow gte 75>>
<<if $player.money gte 500 and not _fineSeriousNow and _fineCrimeNow is $policeStopCrime>>
<<set $player.money -= 500>>
<<run clearWarrant($police, $policeStopCrime || "")>>
<<run adjustWanted($police, -10)>>
<<set $police.dayPass = true>><<set $policeDayPass = true>>
<<LeaveInteractionSettings>>
<<set _policeReturn = $policeReturnPassage || $player.info.currentLocation>>
<<unset $policeReturnPassage>>
<<goto _policeReturn>>
<<else>>
<<goto "Police_Stop">>
<</if>>
<</button>></div>
<</if>>
<<set _bribeCost = 200 + Math.round(_wanted * 2)>>
<<set _bribeLbl = "Slip " + $copObj + " a bribe ($" + _bribeCost + ")">>
<<if $player.money gte _bribeCost>>
<div class="btn"><<button _bribeLbl>>
/* This is a one-off offer to the officer currently handling the stop. The cash
leaves your pocket whenever the cop pockets it (accept OR betray); only a
refusal hands it back. */
<<set _bribeWantedNow = getWanted($police)>>
<<set _bribeCostNow = 200 + Math.round(_bribeWantedNow * 2)>>
<<if $player.money gte _bribeCostNow and _bribeCostNow is _bribeCost>>
<<set _out = copBribe({ corrupt: 45, greed: 55, lust: 25, trust: 0 }, "money", _bribeWantedNow)>>
<<if _out is "accept">>
<<set $player.money -= _bribeCostNow>><<run adjustWanted($police, -6)>><<set $police.dayPass = true>><<set $policeDayPass = true>><<LeaveInteractionSettings>><<set _policeReturn = $policeReturnPassage || $player.info.currentLocation>><<unset $policeReturnPassage>><<goto _policeReturn>>
<<elseif _out is "betray">>
<<set $player.money -= _bribeCostNow>><<goto "Police_Booking">>
<<else>>
<<run adjustWanted($police, 6)>><<set $policeStopMsg = $copSubj + " steps back from the money and tells you to keep both hands visible. 'Now I am adding attempted bribery.'">><<goto "Police_Booking">>
<</if>>
<<else>>
<<goto "Police_Stop">>
<</if>>
<</button>></div>
<<else>>
<<set _bribeNeed = "Slip " + $copObj + " a bribe (need $" + _bribeCost + ")">>
<div class="btn non-interacting"><<button _bribeNeed>><</button>></div>
<</if>>
<<if CheckContentFilter(_copGender, $player)>>
<<set _sexLbl = _copFem ? "Offer to eat her pussy in private" : "Offer to suck him off in private">>
<div class="btn"><<button _sexLbl>>
<<if CheckContentFilter(_copGender, $player)>>
<<set _sexWantedNow = getWanted($police)>>
<<set _out = copBribe({ corrupt: 55, greed: 25, lust: 75, trust: 0 }, "sex", _sexWantedNow)>>
<<if _out is "accept">>
<<run adjustWanted($police, -8)>>
/* The payoff kills this stop's paper, not the rest of the docket. */
<<run clearWarrant($police, $policeStopCrime || "")>>
<<set $police.dayPass = true>><<set $policeDayPass = true>>
<<set $policeSexPartnerGender = _copGender>>
<<set $policeSexNonConsent = false>>
<<set $policeSexOutcome = policeSexBribeScene(_copGender)>>
<<goto "Police_StopSex">>
<<elseif _out is "betray">>
<<set $policeResisting = false>>
<<goto "Police_Booking">>
<<else>>
<<run adjustWanted($police, 4)>>
<<set $policeStopMsg = $copSubj + " lets you finish, reaches for the cuffs and says, 'That offer is going in the report.'">>
<<goto "Police_Booking">>
<</if>>
<<else>>
<<goto "Police_Stop">>
<</if>>
<</button>></div>
<</if>>
<<if not _seriousStop>>
<div class="btn"><<button "Talk your way out">>
<<set _talkWantedNow = getWanted($police)>>
<<set _talkCrimeNow = $policeStopCrime || (isFugitive($police) ? "escape" : "loitering")>>
<<set _talkWarrantNow = worstWarrant($police)>>
<<set _talkCrimeSeverityNow = computeSeverity(_talkCrimeNow)>>
<<set _talkWarrantSeverityNow = _talkWarrantNow ? computeSeverity(_talkWarrantNow) : 0>>
<<set _talkWarrantWinsNow = _talkWarrantNow and (_talkWarrantSeverityNow gt _talkCrimeSeverityNow or (_talkCrimeNow is "loitering" and _talkWarrantSeverityNow is _talkCrimeSeverityNow))>>
<<if _talkWarrantWinsNow>><<set _talkCrimeNow = _talkWarrantNow>><</if>>
<<set _talkSeverityNow = computeSeverity(_talkCrimeNow, { priors: ($prison ? $prison.priors : 0), wanted: _talkWantedNow, notoriety: getNotoriety($police), warrants: warrantCount($police) })>>
<<if _talkCrimeNow is "loitering" and _talkSeverityNow gte 3>><<set _talkSeverityNow = 2>><</if>>
<<set _talkSeriousNow = routesToPrison(_talkSeverityNow) or hasFelonyWarrant($police) or _talkWantedNow gte 75>>
<<if not _talkSeriousNow and _talkCrimeNow is $policeStopCrime>>
<<set _sp = $player.attributes.speech ? $player.attributes.speech.value : 3>>
<<if random(1, 100) lte (20 + _sp * 6)>>
<<run adjustWanted($police, -4)>><<set $police.dayPass = true>><<set $policeDayPass = true>><<LeaveInteractionSettings>><<set _policeReturn = $policeReturnPassage || $player.info.currentLocation>><<unset $policeReturnPassage>><<goto _policeReturn>>
<<else>>
<<run adjustWanted($police, 5)>><<set $policeStopMsg = $copSubj + " is not buying a word of it.">><<goto "Police_Booking">>
<</if>>
<<else>>
<<goto "Police_Stop">>
<</if>>
<</button>></div>
<</if>>
<div class="btn"><<button "Run for it">>
<<set _r = resolvePursuit({ stealth: $player.attributes.dexterity.value, dexterity: $player.attributes.dexterity.value, wanted: getWanted($police) })>>
<<if _r.escaped>>
<<run adjustWanted($police, _r.wantedDelta)>><<set $police.dayPass = true>><<set $policeDayPass = true>><<set $policeStopMsg = "">><<LeaveInteractionSettings>><<set _policeReturn = $policeReturnPassage || $player.info.currentLocation>><<unset $policeReturnPassage>><<goto _policeReturn>>
<<else>>
<<run adjustWanted($police, _r.wantedDelta)>><<set $policeResisting = true>><<goto "Police_Booking">>
<</if>>
<</button>></div>
<div class="btn"><<button "Fight">>
<<set $policeFightSource = { source: "stop", day: getCurrentAbsoluteDay(), location: $player.info.currentLocation, crime: $policeStopCrime }>>
<<goto "PoliceFight">>
<</button>></div>
<div class="btn"><<button "Give it up" "Police_Booking">><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<LockSettings>>
/* A restored/direct entry must still describe a real accepted outcome with a
known partner whose pairing is currently enabled. This consensual payoff is
intentionally independent of the non-consent toggle. */
<<set _sexPartnerGender = $policeSexPartnerGender || (($randomPolicemen is "policewoman") ? "Female" : (($randomPolicemen is "policeman") ? "Male" : ""))>>
<<set _sexOutcomeValid = (typeof $policeSexOutcome is "string") and (_sexPartnerGender is "Male" or _sexPartnerGender is "Female") and $policeSexOutcome is policeSexBribeScene(_sexPartnerGender) and (not $policeSexNonConsent or $gameSettings.contentFilter.nonConsent === true) and CheckContentFilter(_sexPartnerGender, $player)>>
<<if not _sexOutcomeValid>>
<<set $policeSexOutcome = "">><<unset $policeSexPartnerGender $policeSexNonConsent>>
<<set $policeStopMsg = "">>
<<LeaveInteractionSettings>>
<<set _policeReturn = $policeReturnPassage || $player.info.currentLocation>>
<<unset $policeReturnPassage>>
<<goto _policeReturn>>
<<else>>
<<set $randomPolicemen = (_sexPartnerGender is "Female") ? "policewoman" : "policeman">>
<<set $imgPolice = 'Media\\Characters\\QuestChars\\Other\\Police\\' + $randomPolicemen + '.jpg'>>
<<DrawImg $imgPolice>>
<div class="centre-text">Off the record</div>
<<PrisonProse $policeSexOutcome>>
<div class="btn padding-top"><<button "Straighten up and leave">>
<<set $policeSexOutcome = "">>
<<unset $policeSexPartnerGender $policeSexNonConsent>>
<<set $policeStopMsg = "">>
<<LeaveInteractionSettings>>
<<set _policeReturn = $policeReturnPassage || $player.info.currentLocation>>
<<unset $policeReturnPassage>>
<<goto _policeReturn>>
<</button>></div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
/* The first valid entry snapshots the complete incident, including the one-shot
resisting escalation. Reloads reuse this canonical token; they must not
recompute a softer charge after that source flag is consumed. */
<<set _bookingDay = getCurrentAbsoluteDay()>>
<<set _bookingLocation = $player.info.currentLocation>>
<<set _bookingAuthority = $policeBookingAuthority>>
<<set _bookingAuthorityValid = _bookingAuthority and _bookingAuthority.day is _bookingDay and _bookingAuthority.location is _bookingLocation and (typeof _bookingAuthority.crime is "string") and Number.isFinite(_bookingAuthority.severity) and _bookingAuthority.severity gte 0 and _bookingAuthority.severity lte 6>>
<<if _bookingAuthorityValid>>
<<set $policeStopCrime = _bookingAuthority.crime>>
<<set _sev = _bookingAuthority.severity>>
<<else>>
<<unset $policeBookingAuthority>>
<<set _bookingPending = warrantCount($police) gt 0 or getWanted($police) gt 0 or isFugitive($police) or $policeResisting === true>>
<<if _bookingPending>>
<<set _bookingCurrentCrime = $policeStopCrime || (isFugitive($police) ? "escape" : "loitering")>>
<<set _bookingWarrant = worstWarrant($police)>>
<<set _bookingCurrentSeverity = computeSeverity(_bookingCurrentCrime)>>
<<set _bookingWarrantSeverity = _bookingWarrant ? computeSeverity(_bookingWarrant) : 0>>
<<set _bookingWarrantWins = _bookingWarrant and (_bookingWarrantSeverity gt _bookingCurrentSeverity or (_bookingCurrentCrime is "loitering" and _bookingWarrantSeverity is _bookingCurrentSeverity))>>
<<if _bookingWarrantWins>>
<<set $policeStopCrime = _bookingWarrant>>
<<else>>
<<set $policeStopCrime = _bookingCurrentCrime>>
<</if>>
<<set _sev = computeSeverity($policeStopCrime || "burglary", { resisting: !!$policeResisting, priors: ($prison ? $prison.priors : 0), wanted: getWanted($police), notoriety: getNotoriety($police), warrants: warrantCount($police) })>>
/* "loitering" is a heat-only pull-over, not a fresh charge. */
<<if $policeStopCrime is "loitering" and _sev gte 3>><<set _sev = 2>><</if>>
<<set $policeBookingAuthority = { day: _bookingDay, location: _bookingLocation, crime: $policeStopCrime, severity: _sev }>>
<<set _bookingAuthority = $policeBookingAuthority>>
<<set _bookingAuthorityValid = true>>
<<unset $policeResisting>>
<</if>>
<</if>>
<<if not _bookingAuthorityValid>>
<<set _policeReturn = $policeReturnPassage || $player.info.currentLocation>>
<<unset $policeResisting $policeFightSource $policeReturnPassage>>
<<LeaveInteractionSettings>>
<<goto _policeReturn>>
<<else>>
<<if $policeStopMsg and $policeStopMsg isnot "">>
<div class="chat-container"><p class="text"><<= $policeStopMsg>></p></div>
<<set $policeStopMsg = "">>
<</if>>
<<if not routesToPrison(_sev)>>
<<ChatWithoutNPC 'Officer' $imgPolice 'You are spending the next three weeks in holding. Turn around.'>>
<div class="btn padding-top"><<button "Continue">>
<<set _tankAuthority = $policeBookingAuthority>>
<<set _tankAuthorityValid = _tankAuthority and _tankAuthority.day is getCurrentAbsoluteDay() and _tankAuthority.location is $player.info.currentLocation and _tankAuthority.crime is $policeStopCrime and _tankAuthority.severity is _sev and not routesToPrison(_tankAuthority.severity)>>
<<if _tankAuthorityValid>>
<<unset $policeBookingAuthority $policeFightSource $policeResisting>>
<<set $ArrestDay = TANK_SENTENCE_DAYS>>
<<set $ArrestDayStamp = getCurrentAbsoluteDay()>>
<<run onArrested()>>
/* The tank is a way station: after TANK_TRANSFER_DAYS served days
the county bus hauls an outstanding balance to state prison. */
<<set $TankDaysServed = 0>>
<<set $TankSeverity = _sev>>
<<run clearWarrant($police, $policeStopCrime || "")>>
<<unset $policeReturnPassage>>
<<LeaveInteractionSettings>>
<<goto "HoldingCell">>
<<else>>
<<goto "Police_Booking">>
<</if>>
<</button>></div>
<<else>>
<<set _bail = _sev * 400>>
<<set _plea = _sev * 250>>
<<set _bailLbl = "Post bail ($" + _bail + ")">>
<<set _pleaLbl = "Pay for a reduced plea ($" + _plea + ")">>
<<ChatWithoutNPC 'Officer' $imgPolice 'This is a felony booking. Post bail, take the deal or wait for transport.'>>
<div class="btn-container">
<<if $player.money gte _bail>>
<div class="btn"><<button _bailLbl>>
<<set _bailAuthority = $policeBookingAuthority>>
<<set _bailAuthorityValid = _bailAuthority and _bailAuthority.day is getCurrentAbsoluteDay() and _bailAuthority.location is $player.info.currentLocation and _bailAuthority.crime is $policeStopCrime and _bailAuthority.severity is _sev and routesToPrison(_bailAuthority.severity)>>
<<set _bailNow = _bailAuthorityValid ? _bailAuthority.severity * 400 : 0>>
<<if _bailAuthorityValid and _bailNow is _bail and $player.money gte _bailNow>>
<<set $player.money -= _bailNow>>
<<set $policeFightSource = { source: "bail", day: getCurrentAbsoluteDay(), location: $player.info.currentLocation, crime: _bailAuthority.crime, cost: _bailNow }>>
<<goto "Police_Bailed">>
<<else>>
<<goto "Police_Booking">>
<</if>>
<</button>></div>
<</if>>
<<if $player.money gte _plea>>
<div class="btn"><<button _pleaLbl>>
<<set _pleaAuthority = $policeBookingAuthority>>
<<set _pleaAuthorityValid = _pleaAuthority and _pleaAuthority.day is getCurrentAbsoluteDay() and _pleaAuthority.location is $player.info.currentLocation and _pleaAuthority.crime is $policeStopCrime and _pleaAuthority.severity is _sev and routesToPrison(_pleaAuthority.severity)>>
<<set _pleaNow = _pleaAuthorityValid ? _pleaAuthority.severity * 250 : 0>>
<<if _pleaAuthorityValid and _pleaNow is _plea and $player.money gte _pleaNow>>
<<set $player.money -= _pleaNow>>
<<unset $policeBookingAuthority $policeFightSource $policeResisting>>
<<unset $policeReturnPassage>>
<<run arrestPlayer(Math.max(1, _pleaAuthority.severity - 1))>>
<<LeaveInteractionSettings>>
<<goto "Prison_Intake">>
<<else>>
<<goto "Police_Booking">>
<</if>>
<</button>></div>
<</if>>
<div class="btn"><<button "Decline the deal">>
<<set _prisonAuthority = $policeBookingAuthority>>
<<set _prisonAuthorityValid = _prisonAuthority and _prisonAuthority.day is getCurrentAbsoluteDay() and _prisonAuthority.location is $player.info.currentLocation and _prisonAuthority.crime is $policeStopCrime and _prisonAuthority.severity is _sev and routesToPrison(_prisonAuthority.severity)>>
<<if _prisonAuthorityValid>>
<<unset $policeBookingAuthority $policeFightSource $policeResisting>>
<<unset $policeReturnPassage>>
<<run arrestPlayer(_prisonAuthority.severity)>>
<<LeaveInteractionSettings>>
<<goto "Prison_Intake">>
<<else>>
<<goto "Police_Booking">>
<</if>>
<</button>></div>
</div>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _bailReceipt = $policeFightSource>>
<<set _bailAuthority = $policeBookingAuthority>>
<<set _bailBookingActive = _bailAuthority and _bailAuthority.day is getCurrentAbsoluteDay() and _bailAuthority.location is $player.info.currentLocation and _bailAuthority.crime is $policeStopCrime and Number.isFinite(_bailAuthority.severity)>>
<<set _bailReceiptValid = _bailReceipt and _bailAuthority and _bailReceipt.source is "bail" and _bailReceipt.day is getCurrentAbsoluteDay() and _bailReceipt.location is $player.info.currentLocation and _bailReceipt.crime is _bailAuthority.crime and _bailReceipt.cost is (_bailAuthority.severity * 400) and _bailAuthority.day is _bailReceipt.day and _bailAuthority.location is _bailReceipt.location and _bailAuthority.crime is $policeStopCrime and routesToPrison(_bailAuthority.severity)>>
<<if not _bailReceiptValid>>
<<if _bailReceipt and _bailReceipt.source is "bail">><<unset $policeFightSource>><</if>>
<<if _bailBookingActive>>
<<goto "Police_Booking">>
<<else>>
<<unset $policeBookingAuthority>>
<<LeaveInteractionSettings>>
<<set _policeReturn = $policeReturnPassage || $player.info.currentLocation>>
<<unset $policeReturnPassage>>
<<goto _policeReturn>>
<</if>>
<<else>>
/* Consume both receipts before granting either replayable result effect. */
<<unset $policeFightSource $policeBookingAuthority $policeResisting>>
<<run unlockPrisonAchievement('bailed')>>
<<set $police.dayPass = true>><<set $policeDayPass = true>>
<div class="centre-text">Out on Bail</div>
<div class="chat-container"><p class="text">The clerk counts the cash twice, prints a court date and returns your property in a clear plastic bag. Outside, the receipt still lists the charge and your next appearance.</p></div>
<div class="btn padding-top"><<button "Leave the station">>
<<LeaveInteractionSettings>>
<<set _policeReturn = $policeReturnPassage || $player.info.currentLocation>>
<<unset $policeReturnPassage>>
<<goto _policeReturn>>
<</button>></div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<LockSettings>>
/* Book the raid on the most serious real warrant. A heat-only Most Wanted raid
(warrants quashed, heat still >= 75) books as the "wanted" warrant-team charge,
which keeps its escalation and can still route to prison - falling back to
"loitering" turned the raid into a free night in the tank. */
<<set $policeStopCrime = worstWarrant($police) || "wanted">>
<<set $randomPolicemen = (random(1, 100) gt 50) ? "policewoman" : "policeman">>
<<set $imgPolice = 'Media\\Characters\\QuestChars\\Other\\Police\\' + $randomPolicemen + '.jpg'>>
<<DrawImg $imgPolice>>
<<ChatWithoutNPC 'Officer' $imgPolice 'Police! On the ground, now! Hands out where we can see them.'>>
<div class="chat-container"><p class="text">The door comes off its hinges. Officers fill the entrance, the hall and the window below. A shield team moves straight toward you.</p></div>
<div class="btn-container">
<div class="btn"><<button "Give it up" "Police_Booking">><</button>></div>
<div class="btn"><<button "Fight your way out">>
<<set $policeFightSource = { source: "raid", day: getCurrentAbsoluteDay(), location: $player.info.currentLocation, crime: $policeStopCrime }>>
<<goto "PoliceFight">>
<</button>></div>
<div class="btn"><<button "Bolt for the window">>
<<set _r = resolvePursuit({ stealth: $player.attributes.dexterity.value, dexterity: $player.attributes.dexterity.value, wanted: getWanted($police) })>>
<<if _r.escaped>>
<<run adjustWanted($police, _r.wantedDelta)>>
<<LeaveInteractionSettings>>
<<goto "Oak_Street">>
<<else>>
<<run adjustWanted($police, _r.wantedDelta)>>
<<set $policeResisting = true>>
<<goto "Police_Booking">>
<</if>>
<</button>></div>
</div>
<</nobr>><<nobr>>
<<if $playerFollowers && $playerFollowers.length > 0>>
/* Use passage() to get current location since SaveLocation hasn't run yet */
<<set _currentPassage = passage()>>
<<for _i = 0; _i < $Characters.length; _i++>>
<<if setup.playerFollowerHas ? setup.playerFollowerHas($Characters[_i].info.id) : $playerFollowers.includes($Characters[_i].info.id)>>
/* Move follower to player's current passage */
<<set _char = $Characters[_i]>>
<<set _oldLoc = _char.info.currentLocation>>
<<set _newLoc = _currentPassage>>
/* Skip if already in the right location */
<<if _oldLoc == _newLoc>>
<<continue>>
<</if>>
/* Remove from old location */
<<if $Locations[_oldLoc]>>
<<set _idx = $Locations[_oldLoc].indexOf(_i)>>
<<if _idx > -1>>
<<run $Locations[_oldLoc].splice(_idx, 1)>>
<</if>>
<</if>>
/* Set new location */
<<set _char.info.currentLocation = _newLoc>>
/* Add to new location - create array if needed */
<<if !$Locations[_newLoc]>>
<<set $Locations[_newLoc] = []>>
<</if>>
<<if !$Locations[_newLoc].includes(_i)>>
<<run $Locations[_newLoc].push(_i)>>
<</if>>
<</if>>
<</for>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateStatBars">>
<<SetBackground>>
<<include "UpdateAll">>
<<include "CheckQuestShopItems">>
/* Initialize shop inventory */
<<run $shopInventory = new Inventory(100)>>
<<if $itemType == "Clothing">>
<<run $shopInventory.addRandomClothesToInventory(50)>>
<<else>>
<<run $shopInventory.stockShop($itemType)>>
<</if>>
/* Initialize shop state variables */
<<if $shopSearchQuery == undefined>><<set $shopSearchQuery = "">><</if>>
<<if $shopSortBy == undefined>><<set $shopSortBy = "name-asc">><</if>>
<<if $shopQuantities == undefined>><<set $shopQuantities = {}>><</if>>
/* Convert items to array for filtering/sorting */
<<set _itemsArray = Array.from($shopInventory.items.values())>>
/* Apply search filter */
<<if $shopSearchQuery != "">>
<<set _searchLower = $shopSearchQuery.toLowerCase()>>
<<set _itemsArray = _itemsArray.filter(item => item.name.toLowerCase().includes(_searchLower))>>
<</if>>
/* Apply sorting */
<<switch $shopSortBy>>
<<case "price-asc">>
<<set _itemsArray.sort((a, b) => a.price - b.price)>>
<<case "price-desc">>
<<set _itemsArray.sort((a, b) => b.price - a.price)>>
<<case "name-asc">>
<<set _itemsArray.sort((a, b) => a.name.localeCompare(b.name))>>
<<case "name-desc">>
<<set _itemsArray.sort((a, b) => b.name.localeCompare(a.name))>>
<</switch>>
<div class="shop-wrapper">
/* Shop Header with Search, Sort, and Money */
<div class="shop-header">
<div class="shop-search-container">
<<textbox "$shopSearchQuery" $shopSearchQuery "Shop">>
</div>
<div class="shop-sort-container">
<span class="shop-sort-label">Sort by:</span>
<<listbox "$shopSortBy" autoselect>>
<<option "Name (A-Z)" "name-asc">>
<<option "Name (Z-A)" "name-desc">>
<<option "Price (Low to High)" "price-asc">>
<<option "Price (High to Low)" "price-desc">>
<</listbox>>
<div class="btn"><<button "Apply" "Shop">><</button>></div>
</div>
<div class="shop-money-display">
<span class="shop-money-icon">💰</span>
<span>$<<print $player.money>></span>
</div>
</div>
/* Items Count */
<div style="color: var(--text-secondary); margin-bottom: var(--spacing-md); font-size: var(--font-size-sm);">
Showing <<print _itemsArray.length>> items
<<if $shopSearchQuery != "">>
for "<<print $shopSearchQuery>>"
<</if>>
</div>
/* Items Grid */
<<if _itemsArray.length > 0>>
<div class="item-shop-container">
<<for _item range _itemsArray>>
<<set _finalCost = _item.price>>
<<set _itemKey = _item.name.replace(/\s+/g, '_')>>
/* Initialize quantity if not set */
<<if $shopQuantities[_itemKey] == undefined>>
<<set $shopQuantities[_itemKey] = 1>>
<</if>>
<<set _quantity = $shopQuantities[_itemKey]>>
<<set _totalCost = _finalCost * _quantity>>
<<set _canAfford = $player.money >= _totalCost>>
/* Determine item type for styling */
<<set _itemTypeStr = "item">>
<<if _item.type == 0>><<set _itemTypeStr = "consumables">>
<<elseif _item.type == 1>><<set _itemTypeStr = "clothing">>
<<elseif _item.type == 2>><<set _itemTypeStr = "drug">>
<<elseif _item.type == 3>><<set _itemTypeStr = "gift">>
<<elseif _item.type == 4>><<set _itemTypeStr = "food">>
<<elseif _item.type == 5>><<set _itemTypeStr = "sextoy">>
<<elseif _item.type == 6>><<set _itemTypeStr = "weapon">>
<<elseif _item.type == 7>><<set _itemTypeStr = "ammunition">>
<</if>>
<<capture _item _finalCost _itemKey _quantity _totalCost _canAfford _itemTypeStr>>
<<set _imgHtml = _item.getImg()>>
<<set _itemName = _item.name>>
<div class="shop-item" data-type="<<print _itemTypeStr>>">
/* Item Image - clickable to enlarge */
<div class="shop-item-image-container" @data-item-img="_imgHtml" @data-item-name="_itemName">
<<if _item.img && _item.img != "">>
<img class="shop-item-image shop-img-clickable" @src="_item.img" @alt="_item.name">
<<else>>
<div class="shop-item-no-image">📦</div>
<</if>>
<span class="shop-item-badge"><<print _itemTypeStr>></span>
</div>
/* Item Content */
<div class="shop-item-content">
/* Title - clickable to view image */
<h3 class="shop-item-title">
<<capture _item>>
<<link _item.name>>
<<run Dialog.create(_item.name)>>
<<run Dialog.wiki(_item.getImg())>>
<<run Dialog.open()>>
<</link>>
<</capture>>
</h3>
/* Effect/Description */
<<if _item.effect && _item.effect.description>>
<div class="shop-item-effect">
<span class="shop-item-effect-icon">✨</span>
<span><<print _item.effect.description>></span>
</div>
<</if>>
/* Weight */
<<if _item.weight && _item.weight > 0>>
<div class="shop-item-weight">Weight: <<print _item.weight>></div>
<</if>>
/* Price */
<div class="shop-item-price">
<span class="shop-item-price-icon">💵</span>
<span>$<<print _finalCost>></span>
</div>
/* Quantity Selector */
<div class="shop-quantity-selector">
<div class="shop-quantity-btn">
<<button "-" "Shop">>
<<if $shopQuantities[_itemKey] > 1>>
<<set $shopQuantities[_itemKey]-->>
<</if>>
<</button>>
</div>
<span class="shop-quantity-display"><<print _quantity>></span>
<div class="shop-quantity-btn">
<<button "+" "Shop">>
<<if $shopQuantities[_itemKey] < 99>>
<<set $shopQuantities[_itemKey]++>>
<</if>>
<</button>>
</div>
</div>
/* Buy Button */
<div class="shop-buy-btn <<if !_canAfford>>disabled<</if>>">
<<if _canAfford>>
<<button "🛒 Buy" "Shop">>
<<set _buyQuantity = $shopQuantities[_itemKey]>>
<<set _buyTotal = _finalCost * _buyQuantity>>
<<if $player.money >= _buyTotal>>
<<set $player.money -= _buyTotal>>
<<run $player.inventory.addItem(_item.copy(_buyQuantity))>>
<</if>>
<<set $shopQuantities[_itemKey] = 1>>
<</button>>
<<if _quantity > 1>>
<span class="shop-buy-total">$<<print _totalCost>> (x<<print _quantity>>)</span>
<</if>>
<<else>>
<<button "💸 Not enough money">><</button>>
<</if>>
</div>
</div>
</div>
<</capture>>
<</for>>
</div>
<<else>>
<div class="item-shop-container">
<div class="shop-empty-state">
<div class="shop-empty-state-icon">🔍</div>
<div class="shop-empty-state-text">No items found</div>
</div>
</div>
<</if>>
/* Back Button */
<div class="shop-back-btn padding-top">
<<BackButton "<<set $canShowStatsBtn = true>> <<unset $shopInventory>> <<unset $shopSearchQuery>> <<unset $shopSortBy>> <<unset $shopQuantities>> <<set $gameSettings.allowSaves = true>> <<unset $itemType>>">>
</div>
</div>
<<done>>
<<script>>
$('.shop-img-clickable').off('click').on('click', function() {
var container = $(this).closest('.shop-item-image-container');
var imgHtml = container.attr('data-item-img');
var itemName = container.attr('data-item-name');
Dialog.create(itemName);
Dialog.wiki(imgHtml);
Dialog.open();
});
<</script>>
<</done>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _tempNPC = {
name: "Temp NPC",
gender: "Male",
photo: "Media\\Characters\\QuestChars\\Other\\Unknown.jpg",
data: [],
}>>
<</nobr>><<nobr>>
<<done>>
<<run updateAllStatBars()>>
<</done>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetCharProgression $player 'strength' 20 true>>
<div class="btn padding-top"><<button "Back" "CharacterInteractions">><</button>></div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<SetCharProgression $player 'strength' -20 true>>
<div class="btn padding-top"><<button "Back" "CharacterInteractions">><</button>></div>
<</nobr>><<nobr>>
<<removeclass "#energy-bar" "leftbar-menu-green">>
<<removeclass "#energy-bar" "leftbar-menu-yellow">>
<<removeclass "#energy-bar" "leftbar-menu-red">>
<<if _getPlayerEnergy.value > 66>>
<<addclass "#energy-bar" "leftbar-menu-green">>
<<elseif _getPlayerEnergy.value > 33 && _getPlayerEnergy.value <= 66>>
<<addclass "#energy-bar" "leftbar-menu-yellow">>
<<elseif _getPlayerEnergy.value <= 33>>
<<addclass "#energy-bar" "leftbar-menu-red">>
<</if>>
<<removeclass "#health-bar" "leftbar-menu-green">>
<<removeclass "#health-bar" "leftbar-menu-yellow">>
<<removeclass "#health-bar" "leftbar-menu-red">>
<<if _getPlayerHealth.value > 66>>
<<addclass "#health-bar" "leftbar-menu-green">>
<<elseif _getPlayerHealth.value > 33 && _getPlayerHealth.value <= 66>>
<<addclass "#health-bar" "leftbar-menu-yellow">>
<<elseif _getPlayerHealth.value <= 33>>
<<addclass "#health-bar" "leftbar-menu-red">>
<</if>>
<<removeclass "#drunkenness-bar" "leftbar-menu-green">>
<<removeclass "#drunkenness-bar" "leftbar-menu-yellow">>
<<removeclass "#drunkenness-bar" "leftbar-menu-red">>
<<if _getPlayerDrunkenness.value > 80>>
<<addclass "#drunkenness-bar" "leftbar-menu-red">>
<<elseif _getPlayerDrunkenness.value > 50 && _getPlayerDrunkenness.value <= 80>>
<<addclass "#drunkenness-bar" "leftbar-menu-yellow">>
<<elseif _getPlayerDrunkenness.value <= 50>>
<<addclass "#drunkenness-bar" "leftbar-menu-green">>
<</if>>
<</nobr>><<nobr>>
<<run UpdateSaveAllow()>>
<<run window.maybeQueueNpcAfterBreakupText(State.variables)>>
<<if passage() != "PlayerHome_GuestDeparturePrompt" && passage() != "PlayerHome_GuestDepartureResolve">>
<<set _playerLocationForGuestDeparture = ($player && $player.info && $player.info.currentLocation) ? $player.info.currentLocation : passage()>>
<<run typeof ProcessExpiredPlayerHomeGuestDepartures === 'function' && ProcessExpiredPlayerHomeGuestDepartures(_playerLocationForGuestDeparture, false)>>
<</if>>
<<UpdateNPCVar>>
<<include "UpdateStatBars">>
<<SetBackground>>
<<if !$startQuestCreated>><<include "CreateStartQuest">><</if>>
<<done>>
/* The travel buttons live in the sidebar Movement panel, which is hidden aboard
the cruise and in prison. Match that guard here; otherwise the <<replace>> calls
below throw "no elements matched the selector" when those targets do not exist. */
<<if not isOnBoard() && (!$prison || !$prison.inside)>>
<<include "Update_Travel_Mode_Buttons">>
<</if>>
<</done>>
<</nobr>><<nobr>>
<<if $player.status.potency.value > $player.status.potency.min>>
<<run $player.status.horny.increase(2)>>
<</if>>
<<if $player.info.currentLocation != passage()>>
<<SpendTime 2>>
<</if>>
<</nobr>><<nobr>>
<<switch $badEnding>>
<<case "EtheriumInfected">>
<<set $canShowStatsBtn = false>>
<<goto "Bad_Ending_EtheriumInfected">>
<</switch>>
<</nobr>><<nobr>>
<<LeaveInteractionSettings>>
<<goto $walkNextLocation>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _walkPool = ["Walk_Event_Catcall", "Walk_Event_AlleyEncounter", "Walk_Event_LostWallet", "Walk_Event_FlirtyStranger"]>>
<<set _walkPick = _walkPool.random()>>
<<include _walkPick>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
/* Events that only make sense behind the wheel - rolled from the car branch of
the Travel widget (the hitchhiker scene is written entirely in-car:
headlights, the cab, foot on the gas). */
/* A street behind the windshield, not whatever room the drive started from. */
<<SetBackground "Media/Locations/Downtown/Downtown.jpg">>
<<set _carPool = ["Walk_Event_Hitchhiker"]>>
<<set _carPick = _carPool.random()>>
<<include _carPick>>
<</nobr>><<nobr>>
<<set _catcallGender = getWeightedRandomGender()>>
<<set _catcallPronoun = (_catcallGender == "Male" ? "him" : "her")>>
<<set $npcType = Random(1,2)>>
<<if $npcType == 1>>
<<set $npc = {name:'Catcaller', gender:_catcallGender, photo:'Media/Characters/QuestChars/Other/Unknown.jpg', type:'dominant'}>>
<<else>>
<<set $npc = {name:'Nervous catcaller', gender:_catcallGender, photo:'Media/Characters/QuestChars/Other/Unknown.jpg', type:'submissive'}>>
<</if>>
<<ChatMessage 'As you move along the crowded street, someone in a doorway gives a sharp whistle. "Hey-wow. You look incredible. Come say hi!"'>>
<<set _msg = ($npc.type == 'dominant' ? 'Don\'t be shy. You like being noticed, right? Give me a smile.' : 'Sorry if that was forward. Could we talk? Maybe swap numbers?')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<if $player.gender() == 'Female'>>
<<Chat $player 'Seriously? Eyes to yourself.'>>
<<set _msg = ($npc.type == 'dominant' ? 'Feisty. I like confidence.' : 'Okay, okay - no offense meant.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'Back off. I\'m not your toy.'>>
<<set _msg = ($npc.type == 'dominant' ? 'Relax, I\'m just talking.' : 'Got it. I\'m leaving.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<elseif $player.gender() == 'Male'>>
<<Chat $player 'What\'s your problem? Knock it off.'>>
<<set _msg = ($npc.type == 'dominant' ? 'Tough guy, huh? Keep walking.' : 'My mistake, man.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'Last warning.'>>
<<set _msg = ($npc.type == 'dominant' ? 'Or what? Make me.' : 'I\'m gone - no drama.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<else>>
<<Chat $player 'Not okay. You don\'t talk to people like that.'>>
<<set _msg = ($npc.type == 'dominant' ? 'You\'re gorgeous. Come closer.' : 'Wow-sorry. You\'re stunning. Can I make it up to you with a drink?')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'Start with respect.'>>
<<set _msg = ($npc.type == 'dominant' ? 'Respect, huh? I can work with that.' : 'Understood. I\'ll back off.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<</if>>
<div class="npc-event-actions">
<div class="btn"><<button "Ignore and keep walking" "Walk_GoToNextLocation">><</button>></div>
<<set _tellOffLabel = "Tell " + _catcallPronoun + " off">>
<div class="btn"><<button _tellOffLabel "Walk_Catcall_TellOff">><</button>></div>
<<if $player.attributes.corruption.value >= 2>>
<div class="btn"><<button "Flirt back" "Walk_Catcall_Flirt">><</button>></div>
<<else>>
<div class="btn non-interacting" id='catcall-flirt'><<button "Flirt back">><</button>></div>
<<done>>
<<run addHoverTooltip('catcall-flirt', 'Requires corruption level 2 or higher')>>
<</done>>
<</if>>
<<if $player.attributes.dominance.value >= 2>>
<<set _domLabel = "Dominate " + _catcallPronoun>>
<div class="btn"><<button _domLabel "Walk_Catcall_Dominate">><</button>></div>
<<else>>
<<set _domLabel = "Dominate " + _catcallPronoun>>
<div class="btn non-interacting" id='catcall-dom'><<button _domLabel>><</button>></div>
<<done>>
<<run addHoverTooltip('catcall-dom', 'Requires dominance level 2 or higher')>>
<</done>>
<</if>>
</div>
<</nobr>><<nobr>>
<<if $player.gender() == 'Female'>>
<<Chat $player 'Zip it and learn some manners.'>>
<<set _msg = ($npc.type == 'dominant' ? 'Overrated? Please. You\'re not that special.' : 'I\'m sorry-really. I was out of line.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'Walk away. Now.'>>
<<set _msg = ($npc.type == 'dominant' ? 'We\'ll see each other again.' : 'I\'m going. Sorry!')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'Good choice.'>>
<<set _msg = ($npc.type == 'dominant' ? 'You\'re a handful.' : 'Take care.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<elseif $player.gender() == 'Male'>>
<<Chat $player 'Cut it out. I\'m not here for games.'>>
<<set _msg = ($npc.type == 'dominant' ? 'Not into it? Your loss.' : 'My bad. Won\'t happen again.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'Move along.'>>
<<set _msg = ($npc.type == 'dominant' ? 'Fine. For now.' : 'Already gone!')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'Keep it that way.'>>
<<set _msg = ($npc.type == 'dominant' ? 'You\'re fun when you\'re angry.' : 'Understood.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<else>>
<<Chat $player 'That\'s not how you talk to anyone. Fix it.'>>
<<set _msg = ($npc.type == 'dominant' ? 'Hard to focus when you look like that.' : 'You\'re right. Sorry.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'Apology accepted. Don\'t repeat it.'>>
<<set _msg = ($npc.type == 'dominant' ? 'Maybe you\'ll miss the attention.' : 'Never again.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'We\'re done.'>>
<<set _msg = ($npc.type == 'dominant' ? 'For now.' : 'Got it.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<</if>>
<<set _randomValueChange = Random(1,3)>>
<<SetCharProgression $player "dominance" _randomValueChange true>>
<div class="npc-event-actions">
<div class="btn"><<button "Continue" "Walk_GoToNextLocation">><</button>></div>
</div>
<</nobr>><<nobr>>
<<if $player.gender() == 'Female'>>
<<Chat $player 'Like what you see? Then say something worth my time.'>>
<<set _msg = ($npc.type == 'dominant' ? 'I\'m up for the chase. Prove you can keep up.' : 'Wow, bold. I\'d love to get to know you.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'Don\'t just stand there. Make a move.'>>
<<set _msg = ($npc.type == 'dominant' ? 'Somewhere private. Now.' : 'There\'s a quiet spot nearby.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'Don\'t waste it.'>>
<<set _msg = ($npc.type == 'dominant' ? 'You\'re going to remember me.' : 'I won\'t. Promise.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<elseif $player.gender() == 'Male'>>
<<Chat $player 'Think you can keep up? Let\'s see.'>>
<<set _msg = ($npc.type == 'dominant' ? 'Oh, I can. Let\'s get close.' : 'Really? I\'m in!')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'Show me your best.'>>
<<set _msg = ($npc.type == 'dominant' ? 'I\'ll make it personal.' : 'How about a drink first?')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'Prove it.'>>
<<set _msg = ($npc.type == 'dominant' ? 'I intend to.' : 'You won\'t regret it.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<else>>
<<Chat $player 'Caught your eye? I\'m more than a pretty face.'>>
<<set _msg = ($npc.type == 'dominant' ? 'I\'m curious. Let\'s find out more.' : 'You\'re unreal. Can we keep this going?')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'Words are cheap. Show me.'>>
<<set _msg = ($npc.type == 'dominant' ? 'Skip the small talk.' : 'There\'s a quiet corner nearby.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'I don\'t wait.'>>
<<set _msg = ($npc.type == 'dominant' ? 'Then follow me.' : 'Right behind you.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<</if>>
<<set _randomValueChange = Random(1,3)>>
<<SetCharProgression $player "corruption" _randomValueChange true>>
<div class="npc-event-actions">
<div class="btn"><<button "Continue walking" "Walk_GoToNextLocation">><</button>></div>
</div>
<</nobr>><<nobr>>
<<if $player.gender() == 'Female'>>
<<Chat $player 'You think a whistle impresses me? Kneel and apologize.'>>
<<set _msg = ($npc.type == 'dominant' ? 'You\'ve got fire. Maybe I\'ll play along.' : 'I\'m sorry! I went too far.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'Good. Now disappear.'>>
<<set _msg = ($npc.type == 'dominant' ? 'You\'re unforgettable.' : 'Yes, ma\'am. I\'m gone.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'Eyes down.'>>
<<set _msg = ($npc.type == 'dominant' ? 'We\'ll see next time.' : 'Not looking back.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<elseif $player.gender() == 'Male'>>
<<Chat $player 'Catcalling me? Kneel and say you\'re sorry.'>>
<<set _msg = ($npc.type == 'dominant' ? 'Bold. Maybe I\'ll kneel - maybe not.' : 'Sorry, okay? I messed up.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'Mean it.'>>
<<set _msg = ($npc.type == 'dominant' ? 'You win this round.' : 'I mean it. Sorry.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'Now go.'>>
<<set _msg = ($npc.type == 'dominant' ? 'I\'m not done with you.' : 'I\'m leaving.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<else>>
<<Chat $player 'That tone? Try respect. Kneel.'>>
<<set _msg = ($npc.type == 'dominant' ? 'You\'re different. I like it.' : 'I\'m sorry. Please don\'t be mad.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'Quiet. Back off.'>>
<<set _msg = ($npc.type == 'dominant' ? 'For now.' : 'I\'m going.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'Don\'t try me again.'>>
<<set _msg = ($npc.type == 'dominant' ? 'Round two will be interesting.' : 'Understood.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<</if>>
<<set _randomValueChange = Random(1,3)>>
<<SetCharProgression $player "dominance" _randomValueChange true>>
<div class="npc-event-actions">
<div class="btn"><<button "Continue walking" "Walk_GoToNextLocation">><</button>></div>
</div>
<</nobr>><<nobr>>
<<ChatMessage 'You spot a scuffed leather wallet half-buried by an overfilled trash can. People rush past without noticing.'>>
<<if $player.gender() == 'Female'>>
<<Chat $player 'Someone\'s wallet. I\'ll check for an ID and try to return it.'>>
<<ChatMessage 'The street hums around you. A small dilemma tugs at your thoughts.'>>
<<elseif $player.gender() == 'Male'>>
<<Chat $player 'Huh. A wallet. Let\'s see whose it is.'>>
<<ChatMessage 'Crowds stream by. No one else seems to have seen it.'>>
<<else>>
<<Chat $player 'A wallet, huh? Maybe there\'s an ID.'>>
<<ChatMessage 'People rush around you, blind to the find.'>>
<</if>>
<div class="npc-event-actions">
<div class="btn"><<button "Pick it up" "Walk_Wallet_PickUp">><</button>></div>
<div class="btn"><<button "Leave it" "Walk_GoToNextLocation">><</button>></div>
<<if $player.attributes.corruption.value >= 3>>
<div class="btn"><<button "Check for cash and cards" "Walk_Wallet_Steal">><</button>></div>
<<else>>
<div class="btn non-interacting" id='wallet-steal'><<button "Check for cash and cards">><</button>></div>
<<done>>
<<run addHoverTooltip('wallet-steal', 'Requires corruption level 3 or higher')>>
<</done>>
<</if>>
<<if $player.attributes.dominance.value >= 2>>
<div class="btn"><<button "Look for the owner" "Walk_Wallet_LookOwner">><</button>></div>
<<else>>
<div class="btn non-interacting" id='wallet-owner'><<button "Look for the owner">><</button>></div>
<<done>>
<<run addHoverTooltip('wallet-owner', 'Requires dominance level 2 or higher')>>
<</done>>
<</if>>
</div>
<</nobr>><<nobr>>
<<ChatMessage 'You pick up the wallet and flip it open. It\'s empty - just a few receipts and an expired metro card. Looks like someone beat you to it.'>>
<<if $player.gender() == 'Female'>>
<<Chat $player 'Nothing to return. I\'ll leave it where it was.'>>
<<ChatMessage 'You set the wallet back down and step away.'>>
<<elseif $player.gender() == 'Male'>>
<<Chat $player 'Empty. Figures.'>>
<<ChatMessage 'You place the wallet back and move on.'>>
<<else>>
<<Chat $player 'No cash, no cards. Just scraps.'>>
<<ChatMessage 'You drop it where you found it and continue.'>>
<</if>>
<div class="npc-event-actions">
<div class="btn"><<button "Continue" "Walk_GoToNextLocation">><</button>></div>
</div>
<</nobr>><<nobr>>
<<ChatMessage 'You search the lining and find a hidden pocket with cash and a credit card. You pocket the bills and leave the wallet by the trash.'>>
<<if $player.gender() == 'Female'>>
<<Chat $player 'Jackpot. Tonight just got easier.'>>
<<ChatMessage 'You tuck the cash away and merge back into the flow of people.'>>
<<elseif $player.gender() == 'Male'>>
<<Chat $player 'Found money is still money.'>>
<<ChatMessage 'You slip the bills into your pocket and keep moving.'>>
<<else>>
<<Chat $player 'Guess luck\'s on my side.'>>
<<ChatMessage 'You pocket the cash and fade into the crowd.'>>
<</if>>
<<set _randomValueChange = Random(2,5)>>
<<SetCharProgression $player "corruption" _randomValueChange true>>
<div class="npc-event-actions">
<div class="btn"><<button "Continue" "Walk_GoToNextLocation">><</button>></div>
</div>
<</nobr>><<nobr>>
<<ChatMessage 'You find an ID inside. Looking up, you spot someone nearby patting their pockets in a panic.'>>
<<if $player.gender() == 'Female'>>
<<Chat $player 'Hey, is this yours? I found it by the trash can.'>>
<<ChatMessage 'They turn, relief washing over their face as they take the wallet.'>>
<<set _msg = 'Thank you! I thought I was in serious trouble.'>>
<<ChatWithoutNPC 'Stranger' 'Media/Characters/QuestChars/Other/Unknown.jpg' _msg>>
<<Chat $player 'No problem. Keep a closer eye on it.'>>
<<elseif $player.gender() == 'Male'>>
<<Chat $player 'Yo, this yours? Found it on the ground.'>>
<<ChatMessage 'They spin around, grateful as they take it back.'>>
<<set _msg = 'You\'re a lifesaver. Thanks!'>>
<<ChatWithoutNPC 'Stranger' 'Media/Characters/QuestChars/Other/Unknown.jpg' _msg>>
<<Chat $player 'Glad it made it back to you.'>>
<<else>>
<<Chat $player 'This yours? It was by the trash.'>>
<<ChatMessage 'They turn, visibly relieved, and accept the wallet.'>>
<<set _msg = 'Thank you so much. I didn\'t even notice it was gone.'>>
<<ChatWithoutNPC 'Stranger' 'Media/Characters/QuestChars/Other/Unknown.jpg' _msg>>
<<Chat $player 'Stay safe out here.'>>
<</if>>
<<set _randomValueChange = Random(1,3)>>
<<SetCharProgression $player "dominance" _randomValueChange true>>
<div class="npc-event-actions">
<div class="btn"><<button "Continue" "Walk_GoToNextLocation">><</button>></div>
</div>
<</nobr>><<nobr>>
<<set _alleyGender = getWeightedRandomGender()>>
<<set _alleyPronoun = (_alleyGender == "Male" ? "him" : "her")>>
<<set $npcType = Random(1,2)>>
<<if $npcType == 1>>
<<set $npc = {name:'Thug', gender:_alleyGender, photo:'Media/Characters/QuestChars/Other/Unknown.jpg', type:'dominant'}>>
<<else>>
<<set $npc = {name:'Shady drifter', gender:_alleyGender, photo:'Media/Characters/QuestChars/Other/Unknown.jpg', type:'submissive'}>>
<</if>>
<<ChatMessage 'You slip into a dim alley as a shortcut. A figure steps from the shadows, blocking your path with a self-satisfied grin.'>>
<<set _msg = ($npc.type == 'dominant' ? 'Nice night. Stay a while - we could have some fun.' : 'Hey, easy. You look amazing… want some company?')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<if $player.gender() == 'Female'>>
<<Chat $player 'Move. I\'m not interested.'>>
<<set _msg = ($npc.type == 'dominant' ? 'Not even curious? Shame.' : 'Right, sorry. I\'ll step aside.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'Good. I\'m going through.'>>
<<set _msg = ($npc.type == 'dominant' ? 'We\'ll meet again.' : 'All clear.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<elseif $player.gender() == 'Male'>>
<<Chat $player 'Out of the way.'>>
<<set _msg = ($npc.type == 'dominant' ? 'Relax. I\'m just testing your nerve.' : 'Chill, man. I\'m not looking for trouble.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'Don\'t test me.'>>
<<set _msg = ($npc.type == 'dominant' ? 'Maybe later.' : 'Got it.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<else>>
<<Chat $player 'Step aside. Not buying whatever you\'re selling.'>>
<<set _msg = ($npc.type == 'dominant' ? 'With a look like that? Hard to resist.' : 'Sorry-didn\'t mean to crowd you.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'You don\'t run this alley.'>>
<<set _msg = ($npc.type == 'dominant' ? 'Tonight I do.' : 'Understood. I\'m moving.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<</if>>
<div class="npc-event-actions">
<<set _pushLabel = "Push past " + _alleyPronoun>>
<div class="btn"><<button _pushLabel "Walk_Alley_PushPast">><</button>></div>
<div class="btn"><<button "Flirt or tease" "Walk_Alley_Flirt">><</button>></div>
<<if $player.attributes.corruption.value >= 4>>
<<set _gropeLabel = "Let " + _alleyPronoun + " grope you">>
<div class="btn"><<button _gropeLabel "Walk_Alley_Grope">><</button>></div>
<<else>>
<<set _gropeLabel = "Let " + _alleyPronoun + " grope you">>
<div class="btn non-interacting" id='alley-grope'><<button _gropeLabel>><</button>></div>
<<done>>
<<run addHoverTooltip('alley-grope', 'Requires corruption level 4 or higher')>>
<</done>>
<</if>>
<<if $player.attributes.dominance.value >= 3>>
<<set _domAlleyLabel = "Dominate " + _alleyPronoun>>
<div class="btn"><<button _domAlleyLabel "Walk_Alley_Dominate">><</button>></div>
<<else>>
<<set _domAlleyLabel = "Dominate " + _alleyPronoun>>
<div class="btn non-interacting" id='alley-dom'><<button _domAlleyLabel>><</button>></div>
<<done>>
<<run addHoverTooltip('alley-dom', 'Requires dominance level 3 or higher')>>
<</done>>
<</if>>
</div>
<</nobr>><<nobr>>
<<if $player.gender() == 'Female'>>
<<Chat $player 'Move. I\'ve got places to be.'>>
<<set _msg = ($npc.type == 'dominant' ? 'No fun. Maybe next time.' : 'My bad-go ahead.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'Keep walking.'>>
<<set _msg = ($npc.type == 'dominant' ? 'We\'re not done.' : 'Already gone.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'Don\'t follow.'>>
<<set _msg = ($npc.type == 'dominant' ? 'Tempting.' : 'Wouldn\'t dare.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<elseif $player.gender() == 'Male'>>
<<Chat $player 'Step aside.'>>
<<set _msg = ($npc.type == 'dominant' ? 'I like a challenge.' : 'No beef here.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'Good choice.'>>
<<set _msg = ($npc.type == 'dominant' ? 'This isn\'t over.' : 'We\'re cool.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'Don\'t try me.'>>
<<set _msg = ($npc.type == 'dominant' ? 'Round two, later.' : 'Noted.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<else>>
<<Chat $player 'Clear out. Now.'>>
<<set _msg = ($npc.type == 'dominant' ? 'That edge is… interesting.' : 'Yes. Moving.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'Do not follow.'>>
<<set _msg = ($npc.type == 'dominant' ? 'No promises.' : 'I\'m out.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'Try it and regret it.'>>
<<set _msg = ($npc.type == 'dominant' ? 'We\'ll see.' : 'I\'m gone.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<</if>>
<<set _randomValueChange = Random(1,3)>>
<<SetCharProgression $player "dominance" _randomValueChange true>>
<div class="npc-event-actions">
<div class="btn"><<button "Continue walking" "Walk_GoToNextLocation">><</button>></div>
</div>
<</nobr>><<nobr>>
<<if $player.gender() == 'Female'>>
<<Chat $player 'Like what you see? Catch me if you can.'>>
<<set _msg = ($npc.type == 'dominant' ? 'I will. And you\'ll want more.' : 'You\'re a tease-in the best way. Somewhere private?')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'Then keep up.'>>
<<set _msg = ($npc.type == 'dominant' ? 'Lead the way.' : 'I\'m right behind you.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'Don\'t fall behind.'>>
<<set _msg = ($npc.type == 'dominant' ? 'Front row for the show.' : 'Wouldn\'t miss it.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<elseif $player.gender() == 'Male'>>
<<Chat $player 'Think you can handle me? Prove it.'>>
<<set _msg = ($npc.type == 'dominant' ? 'I\'ll do more than that.' : 'Down if you are!')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'Let\'s see your moves.'>>
<<set _msg = ($npc.type == 'dominant' ? 'Up close and personal.' : 'Drink first? Then we\'ll see.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'Impress me.'>>
<<set _msg = ($npc.type == 'dominant' ? 'Watch closely.' : 'I\'m trying here!')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<else>>
<<Chat $player 'Wanna play? Then show some courage.'>>
<<set _msg = ($npc.type == 'dominant' ? 'Oh, I\'ve got plenty.' : 'You\'re gorgeous. I\'m in.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'Then move.'>>
<<set _msg = ($npc.type == 'dominant' ? 'Right here, right now.' : 'Lead on.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'Don\'t waste my time.'>>
<<set _msg = ($npc.type == 'dominant' ? 'This will be unforgettable.' : 'Hurrying!')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<</if>>
<<set _randomValueChange = Random(2,4)>>
<<SetCharProgression $player "corruption" _randomValueChange true>>
<div class="npc-event-actions">
<div class="btn"><<button "Continue walking" "Walk_GoToNextLocation">><</button>></div>
</div>
<</nobr>><<nobr>>
<<if $player.gender() == 'Female'>>
<<ChatMessage 'You let him pin you against the gritty alley wall, his hands roaming with brazen hunger. His fingers tease under your clothes, tracing your curves with a possessive heat that makes your pulse race. The shadows amplify the thrill of being caught.'>>
<<set _msg = ($npc.type == 'dominant' ? 'Fuck, you\'re begging for it, aren\'t you? Say it, and I\'ll take you apart right here.' : 'Your body’s unreal… I’m shaking just touching you like this.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'Don’t stop-make me feel every filthy second.'>>
<<set _msg = ($npc.type == 'dominant' ? 'I’ll have you screaming my name.' : 'You’re driving me wild - I’ll give you everything.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'Harder. I want to burn for you.'>>
<<set _msg = ($npc.type == 'dominant' ? 'Greedy slut. You’ll get it.' : 'Anything you want, I’m yours.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<elseif $player.gender() == 'Male'>>
<<ChatMessage 'You let him press you against the cold wall, his grip tight and demanding. His hands slide under your shirt, fingers digging into your skin, the raw thrill of the dark alley making your cock throb with need.'>>
<<set _msg = ($npc.type == 'dominant' ? 'Already hard for me? I’m going to own you.' : 'Fuck, you feel so good… didn’t think you’d let me this close.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'Keep going-touch me everywhere.'>>
<<set _msg = ($npc.type == 'dominant' ? 'I’ll mark every inch of you.' : 'I’m all over you, can’t get enough.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'Make me fucking lose it.'>>
<<set _msg = ($npc.type == 'dominant' ? 'You’ll be begging for my cock.' : 'I’m giving you everything I’ve got.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<else>>
<<ChatMessage 'He pins you against the rough wall, his hands exploring with a desperate edge. Fingers slip beneath your clothes, igniting your skin with every bold caress. The alley’s darkness makes every touch feel forbidden and electric.'>>
<<set _msg = ($npc.type == 'dominant' ? 'I want to fuck every inch of you.' : 'You’re perfection - I’m losing it just touching you.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'Then take me. Make me yours, right now.'>>
<<set _msg = ($npc.type == 'dominant' ? 'You’re mine to ruin.' : 'This is unreal - I’ll do anything you want.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'Don’t hold back. I want it all.'>>
<<set _msg = ($npc.type == 'dominant' ? 'You’ll feel me for days.' : 'I’m giving you every fucking thing.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<</if>>
<<set _randomValueChange = Random(4,8)>>
<<SetCharProgression $player "corruption" _randomValueChange true>>
<div class="npc-event-actions">
<div class="btn"><<button "Continue walking" "Walk_GoToNextLocation">><</button>></div>
<<if $player.attributes.corruption.value >= 5>>
<div class="btn"><<button "Let him take it further" "Walk_Alley_Fuck">><</button>></div>
<<else>>
<div class="btn non-interacting" id='alley-fuck'><<button "Let him take it further">><</button>></div>
<<done>>
<<run addHoverTooltip('alley-fuck', 'Requires corruption level 5 or higher')>>
<</done>>
<</if>>
</div>
<</nobr>><<nobr>>
<<if $player.gender() == 'Female'>>
<<ChatMessage 'You pull him closer, hiking your skirt to bare your thighs. His hands grip your hips, and he thrusts into you with raw need, your slick heat clenching around him. The alley’s shadows hide your moans, but the risk of discovery makes you wetter.'>>
<<set _msg = ($npc.type == 'dominant' ? 'So fucking tight… you’re mine, and this dirty alley knows it.' : 'You’re so wet for me… I can’t believe I’m fucking you here.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'Harder-fuck me until I can’t think.'>>
<<set _msg = ($npc.type == 'dominant' ? 'Scream my name, you needy slut.' : 'I’m trying - your pussy’s driving me insane.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'Don’t stop-make me come all over you.'>>
<<set _msg = ($npc.type == 'dominant' ? 'You’ll come when I let you.' : 'Fuck, I’m so close-come with me.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<elseif $player.gender() == 'Male'>>
<<ChatMessage 'You guide him closer, unzipping just enough to free yourself. He presses into you, his cock sliding deep, each thrust a jolt of pleasure through the dark alley. The danger of being seen makes you harder.'>>
<<set _msg = ($npc.type == 'dominant' ? 'Take my cock - you’re loving this, aren’t you?' : 'You’re so tight… this is fucking unreal.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'Fuck me deeper - don’t hold back.'>>
<<set _msg = ($npc.type == 'dominant' ? 'I’ll make you beg for every inch.' : 'I’m giving you everything - fuck.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'Make me come - now.'>>
<<set _msg = ($npc.type == 'dominant' ? 'You’ll come when I say.' : 'I’m so close - let’s do this.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<else>>
<<ChatMessage 'You draw him into the shadows, shedding just enough to feel him. He thrusts into you, filling you completely, each movement a pulse of raw desire. The alley’s hush makes your shared gasps louder, the risk making you clench around his cock.'>>
<<set _msg = ($npc.type == 'dominant' ? 'I’m going to fuck you senseless-right here.' : 'You feel like a dream… I’m lost in you.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'Fuck me until I’m shaking.'>>
<<set _msg = ($npc.type == 'dominant' ? 'You’ll be mine in every way.' : 'I’m giving you all of me-fuck.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'Don’t stop-make me come undone.'>>
<<set _msg = ($npc.type == 'dominant' ? 'You’ll come when I’m done with you.' : 'I’m there-come with me.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<</if>>
<<set _randomValueChange = Random(5,10)>>
<<SetCharProgression $player "corruption" _randomValueChange true>>
<div class="npc-event-actions">
<div class="btn"><<button "Continue walking" "Walk_GoToNextLocation">><</button>></div>
</div>
<</nobr>><<nobr>>
<<if $player.gender() == 'Female'>>
<<Chat $player 'Blocking my way? Kneel and apologize.'>>
<<set _msg = ($npc.type == 'dominant' ? 'You\'re a spark plug. Maybe I\'ll kneel.' : 'I\'m sorry! Please, don\'t be mad.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'Know your place. Back to the shadows.'>>
<<set _msg = ($npc.type == 'dominant' ? 'I\'ll be dreaming of you.' : 'Yes, ma\'am. I\'m out.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'Don\'t look back.'>>
<<set _msg = ($npc.type == 'dominant' ? 'We\'ll clash again.' : 'Not looking.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<elseif $player.gender() == 'Male'>>
<<Chat $player 'Trying to scare me? Beg for mercy.'>>
<<set _msg = ($npc.type == 'dominant' ? 'Let\'s see who bends first.' : 'Alright! I\'m sorry.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'Mean it.'>>
<<set _msg = ($npc.type == 'dominant' ? 'Fine. You win-for now.' : 'I mean it. Sorry, man.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'Scram.'>>
<<set _msg = ($npc.type == 'dominant' ? 'I\'d pay to see you really angry.' : 'I\'m out.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<else>>
<<Chat $player 'You picked the wrong person. Kneel.'>>
<<set _msg = ($npc.type == 'dominant' ? 'Submitting to you could be fun.' : 'I messed up. I\'m sorry!')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'Ask for forgiveness.'>>
<<set _msg = ($npc.type == 'dominant' ? 'I\'d rather test your limits.' : 'Please-forgive me.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'Leave before I change my mind.'>>
<<set _msg = ($npc.type == 'dominant' ? 'We\'re not finished.' : 'I\'m gone. Promise.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<</if>>
<<set _randomValueChange = Random(3,6)>>
<<SetCharProgression $player "dominance" _randomValueChange true>>
<div class="npc-event-actions">
<div class="btn"><<button "Continue walking" "Walk_GoToNextLocation">><</button>></div>
</div>
<</nobr>><<nobr>>
<<set _flirtyGender = getWeightedRandomGender()>>
<<set _flirtyPronoun = (_flirtyGender == "Male" ? "him" : "her")>>
<<set $npcType = Random(1,2)>>
<<if $npcType == 1>>
<<set _flirtyName = (_flirtyGender == "Male" ? "Flirty guy" : "Flirty girl")>>
<<set $npc = {name:_flirtyName, gender:_flirtyGender, photo:'Media/Characters/QuestChars/Other/Unknown.jpg', type:'dominant'}>>
<<else>>
<<set $npc = {name:'Flirty stranger', gender:_flirtyGender, photo:'Media/Characters/QuestChars/Other/Unknown.jpg', type:'submissive'}>>
<</if>>
<<set _flirtyPerson = (_flirtyGender == "Male" ? "guy" : "girl")>>
<<set _cm = 'A well-dressed ' + _flirtyPerson + ' strolls up with easy confidence. "Well, hello. You\'re stunning. I bet you\'d look even better on my arm."'>>
<<ChatMessage _cm>>
<<set _msg = ($npc.type == 'dominant' ? 'Come with me - I\'ll give you a night you won\'t forget.' : 'You seem fun. Want to grab a drink or take a walk?')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<if $player.gender() == 'Female'>>
<<Chat $player 'Smooth line. What kind of night are we talking about?'>>
<<set _msg = ($npc.type == 'dominant' ? 'The kind that leaves you smiling by sunrise.' : 'Whatever you\'re in the mood for.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'Big promises. Can you back them up?'>>
<<set _msg = ($npc.type == 'dominant' ? 'Easily.' : 'I\'ll do my best - you deserve it.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<elseif $player.gender() == 'Male'>>
<<Chat $player 'A sidekick, huh? Why would I need one?'>>
<<set _msg = ($npc.type == 'dominant' ? 'Call it a hunch. You look like a good time.' : 'You just seem like a cool guy.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'What\'s the plan then?'>>
<<set _msg = ($npc.type == 'dominant' ? 'Less talk, more action.' : 'No plan - just good company.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<else>>
<<Chat $player 'Company, huh? What\'s on your mind, charmer?'>>
<<set _msg = ($npc.type == 'dominant' ? 'Something bold. You look like you can keep up.' : 'Maybe a walk, maybe something more if you\'re into it.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'Bold is fine. Your next move?'>>
<<set _msg = ($npc.type == 'dominant' ? 'You and me. Somewhere quiet.' : 'Your call - what do you like?')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<</if>>
<div class="npc-event-actions">
<div class="btn"><<button "Smile and walk on" "Walk_GoToNextLocation">><</button>></div>
<div class="btn"><<button "Flirt back" "Walk_FlirtyStranger_Flirt">><</button>></div>
<<if $player.attributes.corruption.value >= 4>>
<<set _inviteLabel = "Invite " + _flirtyPronoun + " somewhere private">>
<div class="btn"><<button _inviteLabel "Walk_FlirtyStranger_Private">><</button>></div>
<<else>>
<<set _inviteLabel = "Invite " + _flirtyPronoun + " somewhere private">>
<div class="btn non-interacting" id='flirty-private'><<button _inviteLabel>><</button>></div>
<<done>>
<<run addHoverTooltip('flirty-private', 'Requires corruption level 4 or higher')>>
<</done>>
<</if>>
<<if $player.attributes.dominance.value >= 3>>
<<set _domFlirtyLabel = "Dominate " + _flirtyPronoun>>
<div class="btn"><<button _domFlirtyLabel "Walk_FlirtyStranger_Dominate">><</button>></div>
<<else>>
<<set _domFlirtyLabel = "Dominate " + _flirtyPronoun>>
<div class="btn non-interacting" id='flirty-dom'><<button _domFlirtyLabel>><</button>></div>
<<done>>
<<run addHoverTooltip('flirty-dom', 'Requires dominance level 3 or higher')>>
<</done>>
<</if>>
</div>
<</nobr>><<nobr>>
<<if $player.gender() == 'Female'>>
<<Chat $player 'Not bad. Maybe I\'ll bite - what\'s the plan?'>>
<<set _msg = ($npc.type == 'dominant' ? 'Knew you would. I know a place that\'s all fun.' : 'Yes! I\'m glad I said hi.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'Lead on - and make it worth my time.'>>
<<set _msg = ($npc.type == 'dominant' ? 'You\'ll be hooked.' : 'There\'s a great spot nearby - you\'ll love it.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'Don\'t disappoint.'>>
<<set _msg = ($npc.type == 'dominant' ? 'I won\'t.' : 'I\'ll make it special.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<elseif $player.gender() == 'Male'>>
<<Chat $player 'Not bad yourself. Let\'s see where this goes.'>>
<<set _msg = ($npc.type == 'dominant' ? 'I\'ve got ideas better than talk.' : 'For real? I\'m down.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'Alright. Your big idea?'>>
<<set _msg = ($npc.type == 'dominant' ? 'Less talk, more action.' : 'Let\'s find a quiet spot to get cozy.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'Impress me.'>>
<<set _msg = ($npc.type == 'dominant' ? 'Watch me.' : 'I\'m trying!')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<else>>
<<Chat $player 'Charming. I might play along.'>>
<<set _msg = ($npc.type == 'dominant' ? 'Play? I\'ll make it unforgettable.' : 'You just made my night. Keep going?')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'Show me you\'ve got game. What\'s next?'>>
<<set _msg = ($npc.type == 'dominant' ? 'Somewhere wild.' : 'Maybe a drink-if you\'re in.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'Don\'t stall.'>>
<<set _msg = ($npc.type == 'dominant' ? 'It\'s on.' : 'Right away. You won\'t be disappointed.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<</if>>
<<set _randomValueChange = Random(2,4)>>
<<SetCharProgression $player "corruption" _randomValueChange true>>
<div class="npc-event-actions">
<div class="btn"><<button "Continue walking" "Walk_GoToNextLocation">><</button>></div>
</div>
<</nobr>><<nobr>>
<<if $player.gender() == 'Female'>>
<<ChatMessage 'You lead him into a shadowed alley, your bodies pressed close as you undo just enough to tempt. His lips crash against yours, hands sliding under your clothes to grip your bare skin, the thrill of being caught making you ache with need.'>>
<<set _msg = ($npc.type == 'dominant' ? 'Fuck, you’re dripping for me already. I’m going to have you right here.' : 'Your body’s perfect… I’m losing it just kissing you.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'Then take me-fuck me until I’m trembling.'>>
<<set _msg = ($npc.type == 'dominant' ? 'Spread those legs wider, I’m not gentle.' : 'I’ll go slow - unless you want it rough.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'Hurry - make me come before someone sees.'>>
<<set _msg = ($npc.type == 'dominant' ? 'You’ll come screaming my name first.' : 'Fuck, you’re driving me wild - I’m so close.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<elseif $player.gender() == 'Male'>>
<<ChatMessage 'You pull him into a dark corner, lips locking as you tug his shirt aside. His hands grip your cock through your pants, stroking with intent, the public risk making every touch burn hotter.'>>
<<set _msg = ($npc.type == 'dominant' ? 'Hard already? I’m going to make you mine.' : 'You’re so fucking hot… I can’t believe you’re letting me do this.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'Don’t stop-make me feel it all.'>>
<<set _msg = ($npc.type == 'dominant' ? 'I’ll have you begging for my cock.' : 'I’m giving you everything - fuck.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'Make me come-hard.'>>
<<set _msg = ($npc.type == 'dominant' ? 'You’ll come when I’m ready.' : 'I’m so close - let’s finish together.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<else>>
<<ChatMessage 'You guide him into a hidden nook, your bodies entwined as you shed layers. His kisses are hungry, hands mapping your body with desperate need, the alley’s secrecy making you pulse with desire.'>>
<<set _msg = ($npc.type == 'dominant' ? 'You’re my fucking fantasy-spread for me.' : 'You’re unreal… I’m addicted to your body.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'Then fuck me-make me yours.'>>
<<set _msg = ($npc.type == 'dominant' ? 'I’ll ruin you in the best way.' : 'Tell me how you want it - I’m all in.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'Don’t hold back-make me come.'>>
<<set _msg = ($npc.type == 'dominant' ? 'You’ll come when I say, and you’ll love it.' : 'I’m giving you everything - fuck.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<</if>>
<<set _randomValueChange = Random(4,8)>>
<<SetCharProgression $player "corruption" _randomValueChange true>>
<div class="npc-event-actions">
<div class="btn"><<button "Continue walking" "Walk_GoToNextLocation">><</button>></div>
</div>
<</nobr>><<nobr>>
<<if $player.gender() == 'Female'>>
<<Chat $player 'Want me? Kneel and earn it.'>>
<<set _msg = ($npc.type == 'dominant' ? 'You\'re trouble. I might kneel anyway.' : 'Anything for you-please.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'Worship properly.'>>
<<set _msg = ($npc.type == 'dominant' ? 'Careful. I bite back.' : 'I\'m yours. Say the word.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'Louder.'>>
<<set _msg = ($npc.type == 'dominant' ? 'We\'ll see who\'s on their knees first.' : 'Please. I want you.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<elseif $player.gender() == 'Male'>>
<<Chat $player 'Flirting, huh? Kneel and earn my time.'>>
<<set _msg = ($npc.type == 'dominant' ? 'Earn it? I\'ll show you who\'s in charge.' : 'Kneeling. Your move.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'Beg for my attention.'>>
<<set _msg = ($npc.type == 'dominant' ? 'Soon you\'ll be begging.' : 'Please - I want more of you.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'Now leave before I change my mind.'>>
<<set _msg = ($npc.type == 'dominant' ? 'I\'ll find you again.' : 'I\'m gone.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<else>>
<<Chat $player 'Trying to charm me? You\'ll submit first.'>>
<<set _msg = ($npc.type == 'dominant' ? 'Submitting to you could be fun.' : 'I\'m yours. Just say it.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'On your knees. Show respect.'>>
<<set _msg = ($npc.type == 'dominant' ? 'I earn respect my way.' : 'You have it. I promise.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<Chat $player 'Leave-while I\'m gracious.'>>
<<set _msg = ($npc.type == 'dominant' ? 'This isn\'t over.' : 'Leaving now.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<</if>>
<<set _randomValueChange = Random(3,6)>>
<<SetCharProgression $player "dominance" _randomValueChange true>>
<div class="npc-event-actions">
<div class="btn"><<button "Continue walking" "Walk_GoToNextLocation">><</button>></div>
</div>
<</nobr>>
/* ============================================================
HITCHHIKER (only fires while the player owns a car)
Feature 3: pick up a random stranger; the scene and the car
clip are keyed on the player's gender AND the passenger's gender.
Feature 6: if the player has corrupted a known NPC past the
"wanton" tier (relationship corruption >= 75), that NPC may be
the one working the roadside instead of a stranger.
============================================================ */<<nobr>>
<<set _walkers = $Characters.filter(c => c && c.info && !c.info.isPlayer && typeof c.gender === "function" && typeof window.getCorruptionFromPlayer === "function" && getCorruptionFromPlayer($player, c) >= 75 && CheckContentFilter(c))>>
<<if _walkers.length > 0 && Random(0,100) < 60>>
/* Feature 6 - a corrupted acquaintance is out selling herself. */
<<set _walker = _walkers.random()>>
<<set $indexNPC = $Characters.indexOf(_walker)>>
<<set $interactionNpc = $Characters[$indexNPC]>>
<<set $hhKnown = true>>
<<set $hhGender = $interactionNpc.gender()>>
<<set $hhName = $interactionNpc.info.firstName>>
<<else>>
/* Feature 3 - a random stranger thumbing for a ride. */
<<set $hhKnown = false>>
<<set $hhGender = getWeightedRandomGender()>>
/* getWeightedRandomGender() yields the generator value "Trans"; normalise it
to the runtime gender() value "Shemale" so the car-clip path math matches. */
<<if $hhGender == "Trans">><<set $hhGender = "Shemale">><</if>>
<<set $hhName = "the hitchhiker">>
<<set $npc = {name:'Hitchhiker', gender:$hhGender, photo:'Media/Characters/QuestChars/Other/Unknown.jpg', type:'dominant'}>>
<</if>>
<<set _them = ($hhGender == "Male" ? "him" : "her")>>
<<set _they = ($hhGender == "Male" ? "he" : "she")>>
<<if $hhKnown>>
<<ShowNpcIcon $interactionNpc>>
<<set _intro = "Your headlights catch a familiar figure on the corner - " + $hhName + ", dressed for the cold weather in almost nothing, thumb out for any car that slows. " + (_they[0].toUpperCase() + _they.slice(1)) + " recognizes your ride and leans in at the window with a knowing smile.">>
<<ChatMessage _intro>>
<<Chat $interactionNpc 'Look who it is. You looking for a date, or just window-shopping? For you... I\'ll make it worth the trip.'>>
<<else>>
<<ChatMessage 'A figure stands at the roadside in the dark, thumb out, hoping someone will stop. As your headlights sweep over them, they straighten up and flash you a hopeful look.'>>
<<set _strangerLine = ($hhGender == "Male" ? 'Any chance of a lift? I\'m freezing out here. I\'d owe you one.' : 'Oh thank god, a car. Please? I\'ll be no trouble - promise I\'ll make it worth your while.')>>
<<ChatWithoutNPC $npc.name $npc.photo _strangerLine>>
<</if>>
/* Gender-aware framing: player gender x passenger gender. */
<<if $player.gender() == "Male" && $hhGender == "Female">>
<<ChatMessage 'She sizes up the lone man behind the wheel, gaze dropping to your lap and back up with a slow little smile.'>>
<<elseif $player.gender() == "Female" && $hhGender == "Male">>
<<ChatMessage 'He clocks the woman driving alone and his eyes linger a beat too long, tongue wetting his lower lip.'>>
<<elseif $player.gender() == "Male" && $hhGender == "Male">>
<<ChatMessage 'He gives you a frank, appraising once-over - the kind that makes it clear a lift isn\'t all that\'s on offer.'>>
<<elseif $player.gender() == "Female" && $hhGender == "Female">>
<<ChatMessage 'She bites her lip and lets her eyes wander over you, in no rush to pretend this is only about the ride.'>>
<<else>>
<<ChatMessage 'Their gaze rakes over you, reading the heat in the cab before either of you says another word.'>>
<</if>>
<div class="npc-event-actions">
<div class="btn"><<button "Just give them a lift" "Walk_Hitchhiker_Ride">><</button>></div>
<<if $player.attributes.corruption.value >= 3>>
<<set _priceLabel = ($hhKnown ? "Take them up on the offer" : "Make it clear the ride has a price")>>
<div class="btn"><<button _priceLabel "Walk_Hitchhiker_CarBlowjob">><</button>></div>
<<else>>
<div class="btn non-interacting" id='hh-price'><<button "Make it clear the ride has a price">><</button>></div>
<<done>>
<<run addHoverTooltip('hh-price', 'Requires corruption level 3 or higher')>>
<</done>>
<</if>>
<div class="btn"><<button "Drive past" "Walk_Hitchhiker_DriveOn">><</button>></div>
</div>
<</nobr>><<nobr>>
<<if $hhKnown>>
<<Chat $player 'Just get in. I\'ll drop you somewhere warm - no charge, no strings.'>>
<<Chat $interactionNpc 'A gentleman. They really don\'t make many of you anymore. Thanks.'>>
<<set _rel = {friendship: 5}>>
<<run $interactionNpc.setRelationship($player.info.id, _rel)>>
<<run $player.setRelationship($interactionNpc.info.id, _rel)>>
<<ChatMessage 'You drive them to a corner of their choosing. Friendship increased by 5.'>>
<<else>>
<<Chat $player 'Hop in. I\'ll get you where you\'re going - that\'s all.'>>
<<set _msg = ($hhGender == "Male" ? 'Appreciate it, seriously. Decent people are rare.' : 'You\'re a lifesaver. Thank you, really.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<<ChatMessage 'You drop the stranger off safe and sound. Nothing more to it.'>>
<</if>>
<<SpendEnergy $player 5>>
<<unset $hhKnown $hhGender $hhName $npc>>
<div class="npc-event-actions">
<div class="btn"><<button "Drive on" "Walk_GoToNextLocation">><</button>></div>
</div>
<</nobr>><<nobr>>
<<ChatMessage 'You keep your foot on the gas and leave them shrinking in the rear-view.'>>
<<unset $hhKnown $hhGender $hhName $npc>>
<div class="npc-event-actions">
<div class="btn"><<button "Drive on" "Walk_GoToNextLocation">><</button>></div>
</div>
<</nobr>><<nobr>>
<<set _pg = $player.gender().toLowerCase()>>
<<if $hhGender == "Shemale">><<set _ng = "female">><<else>><<set _ng = $hhGender.toLowerCase()>><</if>>
<<set _clip = 'Media/Sex/Other/CarBlowjob/car_blowjob_' + _pg + '_' + _ng + '.mp4'>>
<<set _allow = ($hhKnown ? CheckContentFilter($interactionNpc) : CheckContentFilter($player.gender(), $hhGender))>>
<<if $hhKnown>>
<<Chat $player 'How much?'>>
<<Chat $interactionNpc 'For you? Pull into the alley and let me earn it.'>>
<<else>>
<<Chat $player 'Get in. The ride\'s free - but I\'d take a little gratitude.'>>
<<set _msg = ($hhGender == "Male" ? 'Heh. Pull over somewhere quiet and I\'ll thank you properly.' : 'Mmm, I had a feeling. Find somewhere dark and I\'m all yours.')>>
<<ChatWithoutNPC $npc.name $npc.photo _msg>>
<</if>>
<<ChatMessage 'You roll into a dead-end behind the warehouses and kill the lights. In the cramped dark of the cab, things get heated fast.'>>
<<if _allow>><<Video _clip>><</if>>
<<set _corr = Random(3,6)>>
<<SetCharProgression $player "corruption" _corr true>>
<<SpendEnergy $player 10>>
<<if $hhKnown>>
<<set _fee = Math.min(Random(20,60), Math.max(0, $player.money))>>
/* Wallet to wallet: what the player pays lands in the NPC's own money. */
<<set $player.money -= _fee>>
<<set $interactionNpc.money = Number($interactionNpc.money || 0) + _fee>>
<<set _inc = random(5,10) + $player.attributes.speech.value>>
<<IncreaseSex $player $interactionNpc _inc>>
<<set _payMsg = "You slip " + $hhName + " $" + _fee + " for the service and drop them back on their corner.">>
<<ChatMessage _payMsg>>
<<else>>
<<ChatMessage 'When it\'s over they slip back out into the night with a wink, leaving you to catch your breath.'>>
<</if>>
<<unset $hhKnown $hhGender $hhName $npc>>
<div class="npc-event-actions">
<div class="btn"><<button "Drive on" "Walk_GoToNextLocation">><</button>></div>
</div>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<div id="wardrobe-panel-root">
<<include "WardrobePanelBody">>
</div>
<div class="padding-top">
<<BackButton "<<set $canShowStatsBtn = true>>">>
</div>
<</nobr>><<nobr>>
<<set _stats = $player.clothes.getStats()>>
<<set _effectiveTransgenderness = $player.clothes.getGenderNonconformity($player.info.originGender)>>
<section class="wardrobe-panel">
<header class="wardrobe-hero">
<div>
<div class="wardrobe-eyebrow">Personal wardrobe</div>
<h2>Outfit & Equipment</h2>
<p>Build an outfit, inspect its effects and balance protection against social impact.</p>
</div>
<div class="wardrobe-price-pill">Equipped value: $<<print $player.clothes.getEquippedItems().reduce((sum, item) => sum + item.price, 0)>></div>
</header>
<div class="wardrobe-stat-strip">
<div class="wardrobe-stat wardrobe-stat--protection"><span>Protection</span><b>_stats.protection</b></div>
<div class="wardrobe-stat wardrobe-stat--beauty"><span>Beauty</span><b>_stats.beauty</b></div>
<div class="wardrobe-stat wardrobe-stat--trans"><span>Transgenderness</span><b>_effectiveTransgenderness</b></div>
<div class="wardrobe-stat wardrobe-stat--sexuality"><span>Sexuality</span><b>_stats.sexuality</b></div>
<div class="wardrobe-stat wardrobe-stat--horror"><span>Horror</span><b>_stats.horror</b></div>
</div>
<div class="wardrobe-layout">
<section class="wardrobe-section">
<div class="wardrobe-section-heading">
<h3>Equipped slots</h3>
<span>Each item occupies exactly one clothing slot</span>
</div>
<div class="wardrobe-slot-grid">
<<for _slot range CLOTHING_SLOT_ORDER>>
<<set _equipped = $player.clothes.getFirstClothingItemByType(_slot)>>
<<capture _slot _equipped>>
<article @class="_equipped ? 'wardrobe-slot wardrobe-slot--filled' : 'wardrobe-slot wardrobe-slot--empty'">
<div class="wardrobe-slot-label"><<print getClothingSlotLabel(_slot)>></div>
<<if _equipped>>
<img @src="_equipped.img" @alt="_equipped.name">
<div class="wardrobe-slot-copy">
<strong>_equipped.name</strong>
<small><<print getClothingStyleLabel(_equipped.style)>></small>
</div>
<div class="wardrobe-card-actions">
<<link "Details">><<ClothingInfoDialog _equipped>><</link>>
<<link "Remove">>
<<run $player.takeOffClothing(_equipped)>>
<<replace "#wardrobe-panel-root">><<include "WardrobePanelBody">><</replace>>
<</link>>
</div>
<<else>>
<div class="wardrobe-empty-icon">+</div>
<span class="wardrobe-empty-copy">Empty</span>
<<set _emptySlotAction = 'Choose ' + getClothingSlotLabel(_slot) + ' clothing'>>
<<link _emptySlotAction>><<ClothingSlotPickerDialog _slot>><</link>>
<</if>>
</article>
<</capture>>
<</for>>
</div>
</section>
<section class="wardrobe-section wardrobe-closet">
<<set _available = getInventoryClothingItems($player)>>
<div class="wardrobe-section-heading">
<h3>Available clothing</h3>
<span><<print _available.length>> items in inventory</span>
</div>
<<if _available.length == 0>>
<div class="wardrobe-empty-state">Buy clothing or receive it through events to expand your wardrobe.</div>
<<else>>
<div class="wardrobe-item-grid">
<<for _item range _available>>
<<capture _item>>
<<set _itemTransgenderness = getClothingTransgendernessForWearer(_item, $player.info.originGender)>>
<article class="wardrobe-item-card">
<img @src="_item.img" @alt="_item.name">
<div class="wardrobe-item-body">
<div class="wardrobe-item-meta"><span><<print getClothingStyleLabel(_item.style)>></span><b>$<<print _item.price>></b></div>
<h4>_item.name</h4>
<p>_item.description</p>
<div class="wardrobe-mini-stats">
<span title="Protection">P _item.stats.protection</span>
<span title="Beauty">B _item.stats.beauty</span>
<span title="Transgenderness">T _itemTransgenderness</span>
<span title="Sexuality">S _item.stats.sexuality</span>
<span title="Horror">H _item.stats.horror</span>
</div>
<div class="wardrobe-card-actions">
<<link "Details">><<ClothingInfoDialog _item>><</link>>
<<link "Equip">>
<<run $player.equip(_item)>>
<<run $player.inventory.removeItem(_item.name, 1)>>
<<replace "#wardrobe-panel-root">><<include "WardrobePanelBody">><</replace>>
<</link>>
</div>
<div class="wardrobe-card-discard">
<<link "Discard">>
<<run $player.inventory.removeItem(_item.name, 1)>>
<<replace "#wardrobe-panel-root">><<include "WardrobePanelBody">><</replace>>
<</link>>
</div>
</div>
</article>
<</capture>>
<</for>>
</div>
<</if>>
</section>
</div>
</section>
<</nobr>><<widget "ClothingSlotPickerDialog">>
<<set _pickerSlot = Number(_args[0])>>
<<run Dialog.create('Choose ' + getClothingSlotLabel(_pickerSlot))>>
<<run Dialog.wiki('<<ClothingSlotPickerBody ' + _pickerSlot + '>>')>>
<<run Dialog.open()>>
<</widget>>
<<widget "ClothingSlotPickerBody">>
<<set _pickerSlot = Number(_args[0])>>
<<set _slotItems = getInventoryClothingItems($player).filter(item => item.slot == _pickerSlot)>>
<section class="wardrobe-picker">
<header class="wardrobe-picker-header">
<div>
<div class="wardrobe-picker-eyebrow">Available for this slot</div>
<h3><<print getClothingSlotLabel(_pickerSlot)>></h3>
</div>
<span><<print _slotItems.length>> <<if _slotItems.length == 1>>item<<else>>items<</if>></span>
</header>
<<if _slotItems.length == 0>>
<div class="wardrobe-picker-empty">
<b>No suitable clothing in your inventory.</b>
<span>Buy or receive clothing for the <<print getClothingSlotLabel(_pickerSlot).toLowerCase()>> slot first.</span>
</div>
<<else>>
<div class="wardrobe-picker-grid">
<<for _item range _slotItems>>
<<capture _item>>
<<set _itemTransgenderness = getClothingTransgendernessForWearer(_item, $player.info.originGender)>>
<article class="wardrobe-picker-card">
<img @src="_item.img" @alt="_item.name">
<div class="wardrobe-picker-card-body">
<div class="wardrobe-item-meta"><span><<print getClothingStyleLabel(_item.style)>></span><b>$<<print _item.price>></b></div>
<h4>_item.name</h4>
<div class="wardrobe-mini-stats">
<span title="Protection">P _item.stats.protection</span>
<span title="Beauty">B _item.stats.beauty</span>
<span title="Transgenderness">T _itemTransgenderness</span>
<span title="Sexuality">S _item.stats.sexuality</span>
<span title="Horror">H _item.stats.horror</span>
</div>
<span class="wardrobe-picker-equip-hint">Click to equip</span>
</div>
<<set _equipItemLabel = 'Equip ' + _item.name>>
<<link _equipItemLabel>>
<<run $player.equip(_item)>>
<<run $player.inventory.removeItem(_item.name, 1)>>
<<run Dialog.close()>>
<<replace "#wardrobe-panel-root">><<include "WardrobePanelBody">><</replace>>
<</link>>
</article>
<</capture>>
<</for>>
</div>
<</if>>
</section>
<</widget>>
<<widget "ClothingInfoDialog">>
<<set _cloth = _args[0]>>
<<set _clothTransgenderness = getClothingTransgendernessForWearer(_cloth, $player.info.originGender)>>
<<run Dialog.create(_cloth.name)>>
<<set _detail = '<div class="clothing-detail"><img src="' + _cloth.img + '" alt="' + _cloth.name + '"><div class="clothing-detail-copy"><p>' + _cloth.description + '</p><p><strong>Slot:</strong> ' + getClothingSlotLabel(_cloth.slot) + '</p><p><strong>Style:</strong> ' + getClothingStyleLabel(_cloth.style) + ' · <strong>Gender:</strong> ' + _cloth.gender + '</p><div class="wardrobe-mini-stats wardrobe-mini-stats--large"><span>Protection ' + _cloth.stats.protection + '</span><span>Beauty ' + _cloth.stats.beauty + '</span><span>Transgenderness ' + _clothTransgenderness + '</span><span>Sexuality ' + _cloth.stats.sexuality + '</span><span>Horror ' + _cloth.stats.horror + '</span></div>'>>
<<if _cloth.perks.length>>
<<run _detail += '<h4>Perks</h4><ul>' + _cloth.perks.map(p => '<li><b>' + p.perk + ' +' + p.value + '</b> - ' + p.description + '</li>').join('') + '</ul>'>>
<</if>>
<<if _cloth.modifiers.length>>
<<run _detail += '<h4>Modifiers</h4><ul>' + _cloth.modifiers.map(m => '<li>' + m.replace(/_/g, ' ') + '</li>').join('') + '</ul>'>>
<</if>>
<<run _detail += '<p class="clothing-detail-price">Value: $' + _cloth.price + '</p></div></div>'>>
<<run Dialog.wiki(_detail)>>
<<run Dialog.open()>>
<</widget>><<widget "GotoPendingHomeGuestDepartureOr">>
<<set _fallbackPassage = _args[0]>>
<<set _pendingGuestNpc = null>>
<<if $pendingHomeGuestDeparture && $pendingHomeGuestDeparture.index !== undefined && $Characters[$pendingHomeGuestDeparture.index]>>
<<set _pendingGuestNpc = $Characters[$pendingHomeGuestDeparture.index]>>
<</if>>
<<if _pendingGuestNpc && _pendingGuestNpc.info.currentLocation == $player.info.currentLocation && setup.isNpcAtPlayerHome && setup.isNpcAtPlayerHome(_pendingGuestNpc)>>
<<goto "PlayerHome_GuestDeparturePrompt">>
<<else>>
<<goto _fallbackPassage>>
<</if>>
<</widget>>
/* Shared full-sleep recovery. Custody uses this same authority so sleeping
behind bars restores the same player meters as sleeping at home. */
<<widget "RestorePlayerFromSleep">>
<<set $player.status.energy.value = $player.status.energy.max>>
<<set $player.status.health.value = $player.status.health.max>>
<<set $player.status.alcoholIntoxication.value = $player.status.alcoholIntoxication.min>>
<</widget>>
<<widget "Sleep">>
<<set _posLock = _args[0]>>
<<if $player.info.currentLocation == "Player_Bedroom_PHome" && getQuestState("mad_dog_quest1") == "completed" && getQuestState("rayna_voss_quest1") == undefined>>
<<goto "MadDog_Call_RaynaQuest">>
<<else>>
<<RestorePlayerFromSleep>>
<<if $dateTime.hours <= 6>>
/* Short pre-dawn rest: time doesn't cross a day, so no overnight
events are generated - skip the recap, go straight back. */
<<set _tempTime = {minutes: 0, hours: 6}>>
<<SetTime _tempTime>>
<<SpendTime 60>>
/* Still a night's sleep for the street gangs: once-per-sleep actions and boards refresh. */
<<run typeof gangSleepTickNow === 'function' && gangSleepTickNow()>>
<<run typeof ProcessExpiredPlayerHomeGuestDepartures === 'function' && ProcessExpiredPlayerHomeGuestDepartures('', false)>>
<<set $playerFollowers = []>>
<<if _posLock != undefined>>
<<goto _posLock>>
<<else>>
<<goto $player.info.currentLocation>>
<</if>>
<<else>>
/* Going to bed before 22:00 - let the world keep living until
then so NPCs interact (relations, jealousy, breakups) as if
the player had simply been waiting in their bedroom. */
<<set $recapSince = (($dateTime.year * 12 * 31 + $dateTime.month * 31 + $dateTime.day) * 24) + $dateTime.hours>>
/* The evening world-sim only runs when there's evening left to
simulate (bed before 22:00). Track whether it ran so the wake-up
recap offers the night log only when there's a night to show. */
<<set $nightSimRan = ($dateTime.hours < 22)>>
<<if $nightSimRan>>
/* Open the night-log capture window so the sim records notable
NPC↔NPC events (flirts, hookups, fights, affairs) for the recap. */
<<run typeof BeginNightLog === 'function' && BeginNightLog($recapSince)>>
<<run typeof SimulateIdleUntilHour === 'function' && SimulateIdleUntilHour(22)>>
<</if>>
<<SpendDay>>
<<run typeof gangSleepTickNow === 'function' && gangSleepTickNow()>>
<<if $nightSimRan>>
/* Close the capture window - daytime relocations must not log. */
<<run typeof EndNightLog === 'function' && EndNightLog()>>
<</if>>
/* MorningRecap doesn't run <<EachLoc>> (which drives the weather
overlay/sound), and <<SpendDay>> doesn't tick weather, so the rain
sound would keep looping until the player next enters a normal
location. Refresh weather for the new morning and re-sync the rain
audio to the (indoor) wake-up location here. */
<<run typeof updateWeather === 'function' && updateWeather()>>
<<run (typeof setRainOverlay === 'function' && typeof isOutdoorLocation === 'function') && setRainOverlay(!!($weather && $weather.isRaining), isOutdoorLocation($player.info.currentLocation))>>
<<run typeof ProcessExpiredPlayerHomeGuestDepartures === 'function' && ProcessExpiredPlayerHomeGuestDepartures('', false)>>
<<set $playerFollowers = []>>
<<set $recapDestination = (_posLock != undefined) ? _posLock : $player.info.currentLocation>>
<<goto "MorningRecap">>
<</if>>
<</if>>
<</widget>>
<<widget "Wait">>
<<set _endBonus = $player.attributes.endurance.value>>
<<run $player.status.energy.increase(Random(5, 12 + _endBonus))>>
<<SpendTime 15>>
<<set $player.status.alcoholIntoxication.decrease (Random(1,2))>>
<<GotoPendingHomeGuestDepartureOr $player.info.currentLocation>>
<</widget>>
<<widget "RestFull">>
<<set _endBonus = $player.attributes.endurance.value>>
<<set _deficit = $player.status.energy.max - $player.status.energy.value>>
<<set _avgGain = (5 + 12 + _endBonus) / 2>>
<<set _iterations = Math.max(1, Math.min(Math.ceil(_deficit / _avgGain), 100))>>
<<set _totalTime = _iterations * 15>>
<<run $player.status.energy.value = $player.status.energy.max>>
<<run $player.status.alcoholIntoxication.decrease(Math.round(_iterations * 1.5))>>
<<SpendTime _totalTime>>
<<GotoPendingHomeGuestDepartureOr $player.info.currentLocation>>
<</widget>>
<<widget "Nap">>
<<set _endBonus = $player.attributes.endurance.value * 2>>
<<run $player.status.energy.increase(random(30, 40 + _endBonus))>>
<<SpendTime 120>>
<<run typeof ProcessExpiredPlayerHomeGuestDepartures === 'function' && ProcessExpiredPlayerHomeGuestDepartures('', false)>>
<<GotoPendingHomeGuestDepartureOr $player.info.currentLocation>>
<</widget>>
<<widget "SleepButton">>
<div class="btn"><<button "Sleep">>
/* Plain parameter name on purpose: SugarCube rewrites any _name in a macro
expression into State.temporary.name, which is a syntax error in a
function parameter list. */
<<set _sleepPartner = $Characters.find(function (npc) { return npc.info.currentLocation == $player.info.currentLocation && typeof IsPermanentPlayerResidenceResident === "function" && IsPermanentPlayerResidenceResident(npc); })>>
<<if _sleepPartner>><<run RecordPlayerNpcSharedSleep(_sleepPartner)>><</if>>
<<Sleep>>
<</button>></div>
<<if $player.status.potency.value > 0 && $playerlock != true>>
<div class="btn"><<button "Jerk off" "Jerk_off">><<set $gameSettings.allowSaves = false>> <<set $canShowStatsBtn = false>><<set $rejectJoinYou = false>><<set $jerkType = "Jerk Off">><</button>></div>
<<if $player.inventory.hasItem("Dildo") == true>>
<div class="btn"><<button "Dildo Play" "DildoType">><<set $gameSettings.allowSaves = false>> <<set $canShowStatsBtn = false>><<set $rejectJoinYou = false>><<set $jerkType = "Dildo">><</button>></div>
<</if>>
<</if>>
<</widget>><<widget "UpdateNPCVar">>
<<set $interactionNpc = $Characters[$indexNPC]>>
<</widget>>
/*
* NpcMemoryAside <character>
*
* Emits an italicised one-liner derived from this NPC's long-term memory
* of the player ("I haven't forgotten how you helped me with the move."),
* or renders nothing if there are no qualifying memories. Safe to drop
* inline into any dialogue passage - call sites do not need a guard.
*/
<<widget "NpcMemoryAside">>
<<set _memChar = _args[0]>>
<<if _memChar?.info?.id != null>>
<<set _memLine = getDialogueMemoryHook(_memChar.info.id)>>
<<if _memLine>>
<p class="text" style="font-style: italic; opacity: 0.85;">_memLine</p>
<</if>>
<</if>>
<</widget>>/* Shared, native controls. Selecting an option only changes its story variable. */
<<widget "InteractionChoiceHeader">><<nobr>>
<header class="interaction-choice__header">
<div class="interaction-choice__intro">
<div class="interaction-choice__portrait"><<ShowNpcIcon $interactionNpc>></div>
<div><span class="interaction-choice__eyebrow"><<print _args[0]>></span><h1><<print _args[1]>></h1><p><<print _args[2]>></p></div>
</div>
/* Leaving straight to the map ends the interaction, like every other exit. */
<<set _choiceBackTarget = _args[3]>>
<<capture _choiceBackTarget>>
<div class="interaction-choice__back"><<button `_args[4] ?? "Back"` _choiceBackTarget>><<if _choiceBackTarget === $player.info.currentLocation>><<LeaveInteractionSettings>><</if>><</button>></div>
<</capture>>
</header>
<</nobr>><</widget>>
<<widget "InteractionChoiceOptions">><<nobr>>
<fieldset class="interaction-choice__field">
<legend><<print _args[2]>></legend>
<div class="interaction-choice__options">
<<for _choiceOption range _args[1]>>
<label class="interaction-choice__option" @data-value="_choiceOption.value">
<<radiobutton _args[0] _choiceOption.value autocheck>>
<span><strong><<print _choiceOption.title>></strong><<if _choiceOption.description>><small><<print _choiceOption.description>></small><</if>></span>
</label>
<</for>>
</div>
</fieldset>
<</nobr>><</widget>>
<<widget "InteractionChoicePayment">><<nobr>>
<<InteractionChoiceOptions _args[0] `[{value: "auto", title: "Work it out together"}, {value: "player", title: "I’ll pay"}, {value: "npc", title: "They pay"}, {value: "split", title: "Split the bill"}]` "Who pays?">>
<</nobr>><</widget>>
<<widget "InteractionChoiceCalendar">><<nobr>>
<<set _calendarDays = [{value: 0, title: "Today"}, {value: 1, title: "Tomorrow"}, {value: 2, title: "In 2 days"}, {value: 3, title: "In 3 days"}, {value: 4, title: "In 4 days"}, {value: 5, title: "In 5 days"}, {value: 6, title: "In 6 days"}, {value: 7, title: "In 7 days"}]>>
/* Optional third argument: the day offsets the caller accepts. */
<<if Array.isArray(_args[2])>><<set _calendarDays = _calendarDays.filter(day => _args[2].includes(day.value))>><</if>>
<div class="interaction-choice__days"><<InteractionChoiceOptions `_args[0] + "Day"` _calendarDays "Day">></div>
<div class="interaction-choice__clock">
<label class="interaction-choice__hour"><span>Hour</span>
<<listbox `_args[0] + "Hour"` autoselect>>
<<optionsfrom new Map(_args[1].map(hour => [String(hour).padStart(2, "0") + ":00", hour]))>>
<</listbox>>
</label>
<<InteractionChoiceOptions `_args[0] + "Minute"` `[{value: 0, title: ":00"}, {value: 30, title: ":30"}]` "Minutes">>
</div>
<</nobr>><</widget>>/* Display helpers for the one-off event clips listed in
src/scripts/Events/eventMedia.ts. mp4 clips go through <<Video>>; the few
animated .webp files have no video decoder, so they render as an <img>. */
<<widget "EventMedia">>
<<if _args[0]>>
<<if EventMedia.isStillImage(_args[0])>>
<img class="chat-image" @src="_args[0]" alt="">
<<else>>
<<Video _args[0]>>
<</if>>
<</if>>
<</widget>>
/* Washing up at home. The clip follows the body of the character in the shower. */
<<widget "ShowerScene">>
<<set _showerChar = _args[0]>>
<<set _showerClip = EventMedia.showerClip(_showerChar.gender())>>
<<switch _showerChar.gender()>>
<<case "Female">>
<<ChatMessage 'You strip and step under the hot spray. Soap slides over your tits and down between your thighs, and you take your time rinsing the day off.'>>
<<case "Shemale">>
<<ChatMessage 'You strip and step under the hot spray. Water runs over your tits and down your soft cock while you scrub the day off your skin.'>>
<<default>>
<<ChatMessage 'You strip and stand under the hot spray, letting it pound your shoulders while you scrub off the sweat and grime.'>>
<</switch>>
<<EventMedia _showerClip>>
<</widget>>/* All sex pick widgets now use a data-driven lookup table in TypeScript (SetSexPickByTable).
Each widget delegates to the unified function instead of branching on gender combinations. */
<<widget "SetAnalPick">><<set _pick = SetSexPickByTable("Anal", _args[0], _args[1])>><</widget>>
<<widget "SetAnalCumInPick">><<set _pick = SetSexPickByTable("AnalCumIn", _args[0], _args[1])>><</widget>>
<<widget "SetAnalCumOutPick">><<set _pick = SetSexPickByTable("AnalCumOut", _args[0], _args[1])>><</widget>>
<<widget "SetAnalPartnerCumPick">><<set _pick = SetSexPickByTable("AnalPartnerCum", _args[0], _args[1])>><</widget>>
<<widget "SetOralPick">><<set _pick = SetSexPickByTable("Oral", _args[0], _args[1])>><</widget>>
<<widget "SetOralCumInPick">><<set _pick = SetSexPickByTable("OralCumIn", _args[0], _args[1])>><</widget>>
<<widget "SetOralCumOutPick">><<set _pick = SetSexPickByTable("OralCumOut", _args[0], _args[1])>><</widget>>
<<widget "SetFacefuckPick">><<set _pick = SetSexPickByTable("Facefuck", _args[0], _args[1])>><</widget>>
<<widget "SetStrapFacePick">><<set _pick = SetSexPickByTable("StrapFace", _args[0], _args[1])>><</widget>>
<<widget "SetVagPick">><<set _pick = SetSexPickByTable("Vag", _args[0], _args[1])>><</widget>>
<<widget "SetVagCumInPick">><<set _pick = SetSexPickByTable("VagCumIn", _args[0], _args[1])>><</widget>>
<<widget "SetVagCumOutPick">><<set _pick = SetSexPickByTable("VagCumOut", _args[0], _args[1])>><</widget>>
<<widget "SetVagPartnerCumPick">><<set _pick = SetSexPickByTable("VagPartnerCum", _args[0], _args[1])>><</widget>>
<<widget "SetTitfuckPic">><<set _pick = SetSexPickByTable("Titfuck", _args[0], _args[1])>><</widget>>
<<widget "SetTitfuckCumPic">><<set _pick = SetSexPickByTable("TitfuckCum", _args[0], _args[1])>><</widget>>
<<widget "Interaction">>
<<set _dom = _args[0]>>
<<set _sub = _args[1]>>
<<set _pic = BeachPicnic.getInteractionVideoPath(_dom.gender(), _sub.gender(), $interaction)>>
<<if _pic>><<Video _pic>><</if>>
<</widget>>
/* A4: Afterglow summary block - show only for consensual sex, then clear scene flag. */
<<widget "SexSceneAfterglow">>
<<if shouldApplyConsentChecks($sexType)>>
<<set _afterglow = getSexAfterglowSummary($interactionNpc, $player)>>
<<if _afterglow != "">>
<div class="afterglow-wrapper">_afterglow</div>
<</if>>
<</if>>
<<unset $sexEntryShown>>
<</widget>><<widget "Chat">>
<<set _char = _args[0]>>
<<set _text = formatChatText(_args[1] ?? '')>>
<<set _icon = (typeof _char?.getPhotoImage === 'function') ? _char.getPhotoImage() : 'Media\\Characters\\White\\Face\\0\\0.jpeg'>>
<<if !_char?.info>>
<<set _charName = 'Unknown'>>
<<elseif _char.info.isPlayer == true>>
<<set _charName = 'You'>>
<<else>>
<<set _jobTitle = (_char.info.characterWork == "None" ? "Citizen" : _char.info.characterWork)>>
<<if $player?.characterEvents?.isEventRegistered(_char.info.id, "knows you") == false && _char.info.characterWork != "external">>
<<set _gender = (typeof _char.gender === 'function') ? _char.gender() : 'Male'>>
<<switch _gender>>
<<case "Female">>
<<set _gender = ((typeof _char.getAgeText === 'function' && _char.getAgeText() == "Young") ? "girl" : "woman")>>
<<case "Male">>
<<set _gender = "man">>
<<case "Shemale">>
<<set _gender = "shemale">>
<</switch>>
<<set _fatText = (typeof _char.getFatText === 'function') ? _char.getFatText() : ''>>
<<set _skinText = (_char.info.skin ?? '').toLowerCase()>>
<<set _charName = [_fatText, _skinText, _gender].filter(Boolean).join(' ').trim() + " (" + _jobTitle + ")">>
<<elseif _char.info.characterWork == "external">>
<<set _charName = _char.info.firstName ?? 'Unknown'>>
<<else>>
<<set _charName = (_char.info.firstName ?? 'Unknown') + " (" + _jobTitle + ")">>
<</if>>
<</if>>
<div class="chat-container">
<div class="chat-message">
<img class="avatar" @src="_icon" alt="Avatar">
<div class="message-content">
<span class="name"><<= _charName>></span>
<p class="text"><<= _text>></p>
</div>
</div>
</div>
<</widget>>
<<widget "ChatWithoutNPC">>
<<set _charName = _args[0]>>
<<set _charIcon = _args[1]>>
<<set _text = _args[2]>>
<<set _charInitial = String(_charName || "?").trim().charAt(0).toUpperCase() || "?">>
<<set _text = formatChatText(_text)>>
<div class="chat-container">
<div class="chat-message">
<<if _charIcon>>
<img class="avatar" @src="_charIcon" @alt="_charName + ' avatar'" onerror="this.style.display='none'; this.nextElementSibling.style.display='flex';">
<span class="avatar avatar-fallback" style="display: none" aria-hidden="true"><<= _charInitial>></span>
<<else>>
<span class="avatar avatar-fallback" aria-hidden="true"><<= _charInitial>></span>
<</if>>
<div class="message-content">
<span class="name"><<= _charName>></span>
<p class="text"><<= _text>></p>
</div>
</div>
</div>
<</widget>>
<<widget "Chat-Phone">>
<<set _char = _args[0]>>
<<set _text = _args[1]>>
<<set _isPhoneText = _args[2]>>
<<set _icon = (typeof _char?.getPhotoImage === 'function') ? _char.getPhotoImage() : 'Media\\Characters\\White\\Face\\0\\0.jpeg'>>
<<if _char?.info?.isPlayer == true>>
<<set _msgType = "message sent">>
<<set _senderName = "You">>
<<else>>
<<set _msgType = "message received">>
<<set _senderName = [(_char?.info?.firstName ?? ''), (_char?.info?.secondName ?? '')].filter(Boolean).join(' ').trim() || 'Unknown'>>
<</if>>
<div class="chat-messages">
<div @class="_msgType">
<div class="message-info">
<img
@src="_icon"
alt="Icon"
class="icon"/>
<span class="name"><<= _senderName>></span>
</div>
<span class="message-content"><<= _text>></span>
<<if _isPhoneText == true>>
<span class="message-time">10:31 AM</span>
<</if>>
</div>
</div>
<</widget>>
<<widget "ChatMessage">>
<<set _text = formatChatText(_args[0] ?? '')>>
<<if _text.trim() != "">>
<div class="chat-container chat-narration">
<p class="text"><<= _text>></p>
</div>
<</if>>
<</widget>>
/* Cruise/ship prose card: literary convention where spoken words live in "quotes"
(rendered light) and the surrounding narration/action is the dark layer. Use this
instead of <<ChatMessage>> for «Sirena» content. */
<<widget "ShipMessage">>
<<set _text = formatDialogue(_args[0] ?? '')>>
<<if _text.trim() != "">>
<div class="chat-container cruise-prose">
<p class="text"><<= _text>></p>
</div>
<</if>>
<</widget>>
<<widget "ChatMessage-Phone">>
<div class="message info">
<span class="message-content"><<= (_args[0] ?? '')>></span>
</div>
<</widget>>
<<widget "PhoneStatusBar">>
<<set _statusHoursRaw = ($dateTime && $dateTime.hours !== undefined) ? $dateTime.hours : 9>>
<<set _statusMinutesRaw = ($dateTime && $dateTime.minutes !== undefined) ? $dateTime.minutes : 41>>
<<set _statusHours = String(_statusHoursRaw).padStart(2, '0')>>
<<set _statusMinutes = String(_statusMinutesRaw).padStart(2, '0')>>
<div class="phone-statusbar">
<div class="phone-statusbar-time"><<print _statusHours + ":" + _statusMinutes>></div>
<div class="phone-statusbar-icons" aria-hidden="true">
<span class="phone-statusbar-signal"></span>
<span class="phone-statusbar-wifi"></span>
<span class="phone-statusbar-battery"></span>
</div>
</div>
<</widget>>
<<widget "PhoneThreadMessage">>
<<set _char = _args[0]>>
<<set _text = (_args[1] ?? '').replace(/\*(.*?)\*/g, "<span class='phone-thread-emphasis'>$1</span>")>>
<<set _variant = _args[2] ?? (_char?.info?.isPlayer == true ? 'sent' : 'received')>>
<<set _icon = (typeof _char?.getPhotoImage === 'function') ? _char.getPhotoImage() : 'Media\\Characters\\White\\Face\\0\\0.jpeg'>>
<<if _char?.info?.isPlayer == true>>
<<set _senderName = "You">>
<<else>>
<<set _senderName = [(_char?.info?.firstName ?? ''), (_char?.info?.secondName ?? '')].filter(Boolean).join(' ').trim() || 'Unknown'>>
<</if>>
<div @class="'phone-thread-message phone-thread-message--' + _variant">
<<if _variant != 'sent'>>
<div class="phone-thread-avatar">
<img @src="_icon" alt="Avatar">
</div>
<</if>>
<div class="phone-thread-bubble">
<div class="phone-thread-meta"><<print _senderName>></div>
<div class="phone-thread-text"><<= _text>></div>
</div>
</div>
<</widget>>
<<widget "PhoneThreadSystemNote">>
<<set _text = (_args[0] ?? '').replace(/\*(.*?)\*/g, "<span class='phone-thread-emphasis'>$1</span>")>>
<div class="phone-thread-system-note"><<= _text>></div>
<</widget>>
<<widget "DisplayCharacters">>
/* Old saves may contain stale character indexes in a location roster. */
<<set _rawDisplayCharacters = [...($args[0] ?? _args?.[0] ?? [])]>>
<<set _displayCharacters = []>>
<<for _candidate range _rawDisplayCharacters>>
<<if Number.isInteger(_candidate) && $Characters && $Characters[_candidate] && $Characters[_candidate].info>>
<<run _displayCharacters.push(_candidate)>>
<</if>>
<</for>>
<<set _viewMode = $args[1] ?? _args?.[1] ?? "location">>
<<set _interactionMeta = {
talk: { label: 'Conversation', chip: 'Talk', verb: 'are talking', prompt: 'Choose who to approach' },
chat: { label: 'Chat', chip: 'Chat', verb: 'are chatting', prompt: 'Choose who to approach' },
gossip: { label: 'Gossip', chip: 'Gossip', verb: 'are gossiping', prompt: 'Choose who to approach' },
laugh: { label: 'Laughing', chip: 'Laugh', verb: 'are laughing together', prompt: 'Choose who to approach' },
compliment: { label: 'Compliments', chip: 'Kind', verb: 'are trading compliments', prompt: 'Choose who to approach' },
help: { label: 'Helping out', chip: 'Help', verb: 'are helping each other', prompt: 'Choose who to approach' },
comfort: { label: 'Comforting', chip: 'Comfort', verb: 'are sharing a quiet moment', prompt: 'Choose who to approach' },
family_talk: { label: 'Family moment', chip: 'Family', verb: 'are catching up on family matters', prompt: 'Choose who to approach' },
bicker: { label: 'Bickering', chip: 'Bicker', verb: 'are bickering', prompt: 'Choose who to approach' },
scold: { label: 'Scolding', chip: 'Scold', verb: 'are in a heated exchange', prompt: 'Choose who to approach' },
dote: { label: 'Doting', chip: 'Dote', verb: 'are clearly fond of each other', prompt: 'Choose who to approach' },
flirt: { label: 'Flirting', chip: 'Flirt', verb: 'are flirting', prompt: 'Choose who to approach' },
hug: { label: 'Close moment', chip: 'Hug', verb: 'are hugging', prompt: 'Choose who to approach' },
kiss: { label: 'Romantic moment', chip: 'Kiss', verb: 'are kissing', prompt: 'Choose who to approach' },
cuddle: { label: 'Cuddling', chip: 'Cuddle', verb: 'are cuddling', prompt: 'Choose who to approach' },
makeout: { label: 'Making out', chip: 'Makeout', verb: 'are making out', prompt: 'Choose who to approach carefully' },
sex: { label: 'Private moment', chip: 'Intimate', verb: 'are having sex', prompt: 'Choose who to approach carefully' },
quickie: { label: 'Quickie', chip: 'Quickie', verb: 'are in a quick encounter', prompt: 'Choose what to do' },
oral_nn: { label: 'Oral', chip: 'Oral', verb: 'are in the middle of something oral', prompt: 'Choose what to do' },
vaginal_nn: { label: 'Intimate', chip: 'Intimate', verb: 'are having sex', prompt: 'Choose what to do' },
anal_nn: { label: 'Intimate', chip: 'Rough', verb: 'are in something rougher', prompt: 'Choose what to do' },
kinky_nn: { label: 'Kinky scene', chip: 'Kinky', verb: 'are in something kinky', prompt: 'Choose what to do' },
argue: { label: 'Argument', chip: 'Tension', verb: 'are arguing', prompt: 'Choose who to approach' },
fight: { label: 'Conflict', chip: 'Fight', verb: 'are fighting', prompt: 'Choose who to approach' },
tease: { label: 'Teasing', chip: 'Tease', verb: 'are teasing each other', prompt: 'Choose who to approach' },
confide: { label: 'Confidence', chip: 'Confide', verb: 'are sharing something private', prompt: 'Choose who to approach' },
dance: { label: 'Dancing', chip: 'Dance', verb: 'are dancing together', prompt: 'Choose who to approach' },
console: { label: 'Consoling', chip: 'Console', verb: 'are quietly consoling each other', prompt: 'Choose who to approach' },
prank: { label: 'Pranking', chip: 'Prank', verb: 'are pulling a prank', prompt: 'Choose who to approach' },
boast: { label: 'Bragging', chip: 'Boast', verb: 'are showing off to each other', prompt: 'Choose who to approach' },
reconcile: { label: 'Making up', chip: 'Reconcile', verb: 'are making up after a fight', prompt: 'Choose who to approach' },
train_together: { label: 'Training', chip: 'Train', verb: 'are training together', prompt: 'Choose who to approach' },
share_drink: { label: 'Drinks', chip: 'Drink', verb: 'are sharing a drink', prompt: 'Choose who to approach' }
}>>
<<set _relationLabels = {
quest: 'Quest target',
lover: 'Devoted',
love: 'Romantic',
close: 'Trusted',
friendly: 'Friendly',
neutral: 'Neutral',
dislike: 'Strained',
enemy: 'Hostile'
}>>
<<set _interactionPairs = []>>
<<if $NpcInteractions>>
/* Build id->index map for O(1) lookups */
<<set _charIdMap = {}>>
<<for _ci = 0; _ci < $Characters.length; _ci++>>
<<if $Characters[_ci] && $Characters[_ci].info>>
<<set _charIdMap[$Characters[_ci].info.id] = _ci>>
<</if>>
<</for>>
/* Build a Set for O(1) membership checks */
<<set _displaySet = new Set(_displayCharacters)>>
<<for _ti = 0; _ti < $NpcInteractions.length; _ti++>>
<<set _int = $NpcInteractions[_ti]>>
<<set _id1 = _charIdMap[_int.npc1] ?? -1>>
<<set _id2 = _charIdMap[_int.npc2] ?? -1>>
<<if _id1 !== -1 && _id2 !== -1 && _displaySet.has(_id1) && _displaySet.has(_id2)>>
<<set _rumorConversationVerb = (typeof window.DescribeObservedNpcRumorConversation === 'function') ? window.DescribeObservedNpcRumorConversation(_int) : undefined>>
<<set _formerConversationVerb = (typeof window.DescribeObservedNpcFormerConversation === 'function') ? window.DescribeObservedNpcFormerConversation(_int) : undefined>>
<<set _familiarConversationVerb = (typeof window.DescribeObservedNpcFamiliarConversation === 'function') ? window.DescribeObservedNpcFamiliarConversation(_int) : undefined>>
<<run _interactionPairs.push({npc1:_id1, npc2:_id2, type:_int.type, location:_int.location, rumorConversationVerb:_rumorConversationVerb, formerConversationVerb:_formerConversationVerb, familiarConversationVerb:_familiarConversationVerb})>>
<<run _displaySet.delete(_id1)>>
<<run _displaySet.delete(_id2)>>
<</if>>
<</for>>
<<set _displayCharacters = Array.from(_displaySet)>>
<</if>>
/* Sort location cards by friendship with the player; a pair uses its closer member. */
<<set _displayEntries = []>>
<<for _pair range _interactionPairs>>
<<set _pairFriendship1 = $player.getRelationship($Characters[_pair.npc1].info.id, false)?.metrics?.friendship ?? 0>>
<<set _pairFriendship2 = $player.getRelationship($Characters[_pair.npc2].info.id, false)?.metrics?.friendship ?? 0>>
<<run _displayEntries.push({ pair: _pair, friendship: Math.max(_pairFriendship1, _pairFriendship2) })>>
<</for>>
<<for _characterId range _displayCharacters>>
<<set _cardFriendship = $player.getRelationship($Characters[_characterId].info.id, false)?.metrics?.friendship ?? 0>>
<<run _displayEntries.push({ characterId: _characterId, friendship: _cardFriendship })>>
<</for>>
<<if _viewMode == "location">>
<<run _displayEntries.sort((a, b) => b.friendship - a.friendship)>>
<</if>>
/* Interaction icons map */
<<set _interactionIcons = {
talk: '💬',
chat: '💬',
gossip: '🗣️',
laugh: '😂',
compliment: '🌟',
help: '🤝',
comfort: '🫂',
family_talk: '👪',
bicker: '😒',
scold: '😠',
dote: '🥰',
flirt: '😏',
hug: '🤗',
kiss: '💋',
cuddle: '🫶',
makeout: '😘',
sex: '❤️🔥',
quickie: '⚡',
oral_nn: '👄',
vaginal_nn: '❤️🔥',
anal_nn: '🔥',
kinky_nn: '⛓️',
argue: '😤',
fight: '⚔️',
tease: '😜',
confide: '🤫',
dance: '💃',
console: '🤲',
prank: '🎭',
boast: '🦚',
reconcile: '🕊️',
train_together: '🥊',
share_drink: '🍻'
}>>
/* Events container (populated by LocationEvent widget) */
<div @class="_viewMode == 'location' ? 'location-characters-view' : 'display-characters-view'">
<<if _viewMode == "location">>
<div class="location-events-container" id="location-events"></div>
<</if>>
/* Members chatting in a pair card are still here; count them as visible. */
<<set _visibleCharacterIndexes = [..._displayCharacters, ..._interactionPairs.flatMap(pair => [pair.npc1, pair.npc2])]>>
<<for _friendCircle range GetObservedNpcFriendCircles()>>
<<if _friendCircle.members.every(npc => _visibleCharacterIndexes.some(index => $Characters[index] === npc))>>
<div class="npc-friend-circle-card">
<strong>Friends meeting up</strong>
<p><<for _fi = 0; _fi < _friendCircle.members.length; _fi++>><<if _fi > 0>><<if _fi == _friendCircle.members.length - 1>> and <<else>>, <</if>><</if>><<print Util.escape(_friendCircle.members[_fi].info.firstName)>><</for>> are catching up together at their usual meeting place.</p>
</div>
<</if>>
<</for>>
<div @class="_viewMode == 'location' ? 'location-character-grid' : 'characters-grid'" @id="_viewMode == 'location' ? 'location-character-grid' : 'character-grid'">
<<for _entry range _displayEntries>>
<<if _entry.pair>>
/* ═════ INTERACTION PAIRS ═════ */
<<set _pair = _entry.pair>>
<<set _c1 = $Characters[_pair.npc1]>>
<<set _c2 = $Characters[_pair.npc2]>>
<<set _type = _pair.type>>
/* Skip pairs whose characters were removed (stale save / migrated data). */
<<if !_c1 || !_c2 || typeof _c1.getPhotoImage !== 'function' || typeof _c2.getPhotoImage !== 'function'>>
<<continue>>
<</if>>
<<set _pairLocation = _pair.location ?? _c1.info.currentLocation>>
<<set _icon1 = _c1.getPhotoImage()>>
<<set _icon2 = _c2.getPhotoImage()>>
<<set _pairMeta = _interactionMeta[_type] ?? {
label: 'Encounter',
chip: 'Notice',
verb: 'are interacting',
prompt: 'Choose who to approach'
}>>
<<if _pair.rumorConversationVerb>>
<<set _pairMeta = Object.assign({}, _pairMeta, {label:'Discussing a rumor', verb:_pair.rumorConversationVerb})>>
<</if>>
<<if _pair.familiarConversationVerb && !_pair.rumorConversationVerb>>
<<set _pairMeta = Object.assign({}, _pairMeta, {label:'Familiar faces', verb:_pair.familiarConversationVerb})>>
<</if>>
<<if _pair.formerConversationVerb>>
<<set _pairMeta = Object.assign({}, _pairMeta, {label:'A conversation after time apart', verb:_pair.formerConversationVerb})>>
<</if>>
<<set _compactPairIcon = _interactionIcons[_type] ?? _pairMeta.chip>>
<<set _householdStatus = (typeof DescribeObservedNpcHousehold === "function" ? DescribeObservedNpcHousehold(_c1, State.variables, _c2.info.id) : null)>>
<<set _pairStatus = _householdStatus || ('They ' + _pairMeta.verb + ' right now.')>>
<<set _pairKinship = (typeof window.getKinship === 'function') ? window.getKinship(_c1, _c2) : 'unrelated'>>
<<set _pairKinLabel = (typeof window.getKinshipLabel === 'function') ? window.getKinshipLabel(_pairKinship, _c1, _c2) : ''>>
<<set _pairIsAdult = (typeof window.isAdultInteraction === 'function') ? window.isAdultInteraction(_type) : false>>
<<set _pairKinBadge = _pairKinLabel ? '<span class="pair-card__kin" data-kin="' + _pairKinship + '">' + _pairKinLabel + '</span>' : ''>>
<<set _pairAdultAttr = _pairIsAdult ? ' data-adult="true"' : ''>>
<<capture _c1 _c2 _type _pairLocation _pairMeta _compactPairIcon _pairKinBadge _pairAdultAttr _pairStatus>>
<<if _viewMode == "location">>
<<set _pairContent = '<article class="location-pair-card" data-interaction="' + _type + '"' + _pairAdultAttr + '>'>>
<<set _pairContent += '<div class="location-pair-card__header"><span class="location-pair-card__eyebrow">' + _pairMeta.label + '</span>' + _pairKinBadge + '<span class="location-pair-card__cta">Choose</span></div>'>>
<<set _pairContent += '<div class="location-pair-card__visual"><div class="location-pair-card__avatars"><img class="location-pair-card__avatar location-pair-card__avatar--left" src="' + _icon1 + '" alt=""><div class="location-pair-card__connector"><span class="location-pair-card__connector-text">' + _pairMeta.chip + '</span></div><img class="location-pair-card__avatar location-pair-card__avatar--right" src="' + _icon2 + '" alt=""></div></div>'>>
<<set _pairContent += '<div class="location-pair-card__copy"><div class="location-pair-card__names"><span>' + _c1.info.firstName + '</span><span class="location-pair-card__separator">and</span><span>' + _c2.info.firstName + '</span></div><div class="location-pair-card__status">' + _pairStatus + '</div><div class="location-pair-card__footer">' + _pairMeta.prompt + '</div></div></article>'>>
<<else>>
<<set _pairContent = '<div class="npc-pair-card" data-interaction="' + _type + '"' + _pairAdultAttr + '><div class="npc-pair-card__content"><div class="npc-pair-card__avatars"><img class="npc-pair-card__avatar" src="' + _icon1 + '" alt=""><div class="npc-pair-card__interaction-icon">' + _compactPairIcon + '</div><img class="npc-pair-card__avatar" src="' + _icon2 + '" alt=""></div><div class="npc-pair-card__names"><span>' + _c1.info.firstName + '</span> & <span>' + _c2.info.firstName + '</span> ' + _pairKinBadge + '<span class="npc-pair-card__status">' + _pairStatus + '</span></div></div></div>'>>
<</if>>
<<button _pairContent "ChooseTalkNPC">>
<<set $talkPairNPC1 = _c1>>
<<set $talkPairNPC2 = _c2>>
<<set $talkPairIndexNPC1 = $Characters.indexOf(_c1)>>
<<set $talkPairIndexNPC2 = $Characters.indexOf(_c2)>>
<<set $talkPairInteractionType = _type>>
<<set $talkPairLocation = _pairLocation>>
<</button>>
<</capture>>
<<else>>
/* ═════ INDIVIDUAL CHARACTERS ═════ */
<<set _characterId = _entry.characterId>>
<<set _character = $Characters[_characterId]>>
<<set _friendship = $player.getRelationship(_character.info.id, false)?.metrics?.friendship ?? 0>>
<<set _love = $player.getRelationship(_character.info.id, false)?.metrics?.love ?? 0>>
/* Determine relation type for styling */
<<if _character.info.questInfo.isQuestCharacter == true>>
<<set _relationClass = "quest">>
<<elseif _love >= 90>>
<<set _relationClass = "lover">>
<<elseif _love > 75>>
<<set _relationClass = "love">>
<<elseif _friendship >= 75>>
<<set _relationClass = "close">>
<<elseif _friendship >= 25>>
<<set _relationClass = "friendly">>
<<elseif _friendship >= -25>>
<<set _relationClass = "neutral">>
<<elseif _friendship >= -75>>
<<set _relationClass = "dislike">>
<<else>>
<<set _relationClass = "enemy">>
<</if>>
<<capture _character _relationClass _friendship _love>>
<<set _knowsYou = $player.characterEvents.isEventRegistered(_character.info.id, "knows you")>>
<<if _character.characterEvents.isEventRegistered(_character.info.id, "Is Head Girl") == true>>
<<set _jobTitle = "Head Girl">>
<<else>>
<<set _jobTitle = (_character.info.characterWork == "None" ? "Citizen" : _character.info.characterWork)>>
<<if _knowsYou == false && typeof GetNpcEmployment === "function" && GetNpcEmployment(_character)>>
<<set _jobTitle = GetEmploymentDisplay(_character, SugarCube.State.variables, "sector")>>
<</if>>
<</if>>
<<if _character.info.questInfo.isQuestCharacter == true>>
<<set _jobTitle = _character.info.questInfo.currentCharState>>
<<set _clickMOveLoc = "QuestCharInteraction">>
<<else>>
<<set _clickMOveLoc = "CharacterInteractions">>
<</if>>
<<set _characterIcon = _character.getPhotoImage()>>
<<set _isFollower = setup.playerFollowerHas ? setup.playerFollowerHas(_character.info.id) : $playerFollowers.includes(_character.info.id)>>
<<set _isQuest = _character.info.questInfo.isQuestCharacter == true>>
/* Build name based on knowledge */
<<if _knowsYou == true>>
<<set _displayName = _character.info.firstName + " " + _character.info.secondName>>
<<else>>
<<set _gender = _character.gender()>>
<<switch _gender>>
<<case "Female">>
<<if _character.getAgeText() == "Young">>
<<set _gender = "girl">>
<<else>>
<<set _gender = "woman">>
<</if>>
<<case "Male">>
<<set _gender = "man">>
<<case "Shemale">>
<<set _gender = "shemale">>
<</switch>>
<<set _displayName = _character.getFatText() + " " + (_character.info.skin.toLowerCase()) + " " + _gender>>
<</if>>
/* Build description string with physical characteristics */
<<set _descParts = []>>
<<set _descParts.push(_character.getFatText())>>
<<set _descParts.push(_character.info.skin.toLowerCase())>>
<<set _ageText = _character.getAgeText()>>
<<if _ageText>><<set _descParts.push(_ageText.toLowerCase())>><</if>>
<<if _character.info.hairColor>>
<<set _descParts.push(_character.info.hairColor.toLowerCase() + " hair")>>
<</if>>
<<set _description = _descParts.join(", ")>>
<<set _travelStatus = (typeof GetNpcTravelStatus === "function" ? GetNpcTravelStatus(_character) : null)>>
<<set _householdStatus = (typeof DescribeObservedNpcHousehold === "function" ? DescribeObservedNpcHousehold(_character) : null)>>
<<set _goalStatus = (typeof GetNpcPublicGoalStatus === "function" ? GetNpcPublicGoalStatus(_character) : null)>>
<<set _canSeeGoal = _knowsYou && _goalStatus && _friendship >= 30>>
/* Calculate relation bar width */
<<set _relationValue = Math.max(0, Math.min(100, (_friendship + 100) / 2))>>
<<set _relationLabel = _relationLabels[_relationClass] ?? "Neutral">>
<<if _relationClass == "love" || _relationClass == "lover">>
<<set _metricLabel = "Love">>
<<set _metricValue = Math.max(0, Math.min(100, _love))>>
<<set _metricDisplay = Math.floor(_love)>>
<<set _metricClass = " location-npc-card__metric-fill--love">>
<<else>>
<<set _metricLabel = "Connection">>
<<set _metricValue = _relationValue>>
<<set _metricDisplay = Math.floor(_friendship)>>
<<set _metricClass = "">>
<</if>>
<<if _viewMode == "location">>
<<set _cardHTML = '<article class="location-npc-card" data-relation="' + _relationClass + '">'>>
<<set _cardHTML += '<div class="location-npc-card__header"><div class="location-npc-card__badges">'>>
<<if _isQuest>><<set _cardHTML += '<span class="location-npc-card__badge location-npc-card__badge--quest">Quest</span>'>><</if>>
<<if _isFollower>><<set _cardHTML += '<span class="location-npc-card__badge location-npc-card__badge--follower">Following</span>'>><</if>>
<<if setup.playerNpcMeetings && setup.playerNpcMeetings.waitingHere(_character)>><<set _cardHTML += '<span class="location-npc-card__badge location-npc-card__badge--meeting">Waiting for you</span>'>><</if>>
<<if _knowsYou == false>><<set _cardHTML += '<span class="location-npc-card__badge location-npc-card__badge--unknown" title="You have not met this person yet">Stranger</span>'>><</if>>
<<set _cardHTML += '</div><span class="location-npc-card__cta">Approach</span></div>'>>
<<set _cardHTML += '<div class="location-npc-card__main"><div class="location-npc-card__avatar-shell"><img class="location-npc-card__avatar" src="' + _characterIcon + '" alt=""></div><div class="location-npc-card__content">'>>
<<set _cardHTML += '<div class="location-npc-card__eyebrow">' + _jobTitle + '</div>'>>
<<set _cardHTML += '<div class="location-npc-card__name-row"><div class="location-npc-card__name">' + _displayName + '</div><span class="location-npc-card__relation-pill">' + _relationLabel + '</span></div>'>>
<<set _cardHTML += '<div class="location-npc-card__description">' + _description + '</div>'>>
<<if _householdStatus>><<set _cardHTML += '<div class="location-npc-card__description">' + _householdStatus + '</div>'>><</if>>
<<if _travelStatus && _travelStatus.activityLabel>>
<<set _cardHTML += '<div class="location-npc-card__travel"><span class="location-npc-card__travel-label">Now</span><span class="location-npc-card__travel-destination">' + _travelStatus.activityLabel + '</span></div>'>>
<</if>>
<<if _travelStatus && _travelStatus.nextLabel>>
<<set _travelMeta = (_travelStatus.state === "blocked" ? "Blocked" : (_travelStatus.state === "waiting_partner" ? "Waiting for company" : (_travelStatus.state === "waiting_open" ? "Waiting to open" : (_travelStatus.state === "delayed" ? "Delayed" : (_travelStatus.state === "traveling" ? "On the way" + (_travelStatus.etaMinutes > 0 ? ", ~" + _travelStatus.etaMinutes + " min" : "") : "")))))>>
<<set _cardHTML += '<div class="location-npc-card__travel"><span class="location-npc-card__travel-label">Next stop</span><span class="location-npc-card__travel-destination">' + _travelStatus.nextLabel + (_travelMeta ? ' · ' + _travelMeta : '') + '</span></div>'>>
<</if>>
<<if _travelStatus && (_travelStatus.state === "blocked" || _travelStatus.state === "waiting_partner" || ((_travelStatus.state === "delayed" || _travelStatus.state === "waiting_open") && !_travelStatus.nextLabel))>>
<<set _routeStateLabel = (_travelStatus.state === "blocked" ? "Route blocked" : (_travelStatus.state === "waiting_partner" ? "Waiting for company" : (_travelStatus.state === "waiting_open" ? "Waiting to open" : "Delayed")))>>
<<set _cardHTML += '<div class="location-npc-card__travel"><span class="location-npc-card__travel-label">Status</span><span class="location-npc-card__travel-destination">' + _routeStateLabel + '</span></div>'>>
<</if>>
<<if _canSeeGoal>>
<<set _cardHTML += '<div class="location-npc-card__travel"><span class="location-npc-card__travel-label">Ambition</span><span class="location-npc-card__travel-destination">' + _goalStatus.label + ' · ' + _goalStatus.progress + '%</span></div>'>>
<</if>>
<<set _cardHTML += '<div class="location-npc-card__metric-row"><span class="location-npc-card__metric-label">' + _metricLabel + '</span><div class="location-npc-card__metric-bar"><div class="location-npc-card__metric-fill' + _metricClass + '" style="width: ' + _metricValue + '%"></div></div><span class="location-npc-card__metric-value">' + _metricDisplay + '</span></div>'>>
<<set _cardHTML += '</div></div></article>'>>
<<else>>
<<set _cardClasses = "npc-card">>
<<if _isQuest>><<set _cardClasses += " npc-card--quest">><</if>>
<<if _isFollower>><<set _cardClasses += " npc-card--follower">><</if>>
<<if _knowsYou == false>><<set _cardClasses += " npc-card--unknown">><</if>>
<<set _cardHTML = '<div class="' + _cardClasses + '" data-relation="' + _relationClass + '">'>>
<<set _cardHTML += '<div class="npc-card__badges">'>>
<<if _isFollower>><<set _cardHTML += '<span class="npc-card__badge npc-card__badge--follower">Following</span>'>><</if>>
<<if _isQuest>><<set _cardHTML += '<span class="npc-card__badge npc-card__badge--quest">Quest</span>'>><</if>>
<<set _cardHTML += '</div>'>>
<<set _cardHTML += '<div class="npc-card__avatar-wrapper"><img class="npc-card__avatar" src="' + _characterIcon + '" alt=""></div>'>>
<<set _cardHTML += '<div class="npc-card__info">'>>
<<set _cardHTML += '<div class="npc-card__name">' + _displayName + '</div>'>>
<<set _cardHTML += '<div class="npc-card__description">' + _description + '</div>'>>
<<if _householdStatus>><<set _cardHTML += '<div class="npc-card__description">' + _householdStatus + '</div>'>><</if>>
<<set _cardHTML += '<div class="npc-card__job">' + _jobTitle + '</div>'>>
<<set _cardHTML += '<div class="npc-card__relation">'>>
<<set _cardHTML += '<div class="npc-card__relation-bar"><div class="npc-card__relation-fill" style="width: ' + _relationValue + '%"></div></div>'>>
<<set _cardHTML += '<span class="npc-card__relation-value">' + Math.floor(_friendship) + '</span>'>>
<<set _cardHTML += '</div>'>>
<<set _cardHTML += '</div></div>'>>
<</if>>
<<button _cardHTML _clickMOveLoc>>
<<set $indexNPC = $Characters.indexOf(_character)>>
<<set $interactionNpc = $Characters[$indexNPC]>>
<<unset $interactionPairWitness>>
<<if $interactionNpc.clothes.isNude(($interactionNpc.gender() == "Male")) == true>>
<<run $interactionNpc.wearMaximumClothing()>>
<<run $interactionNpc.AddCloth(false, true)>>
<</if>>
<</button>>
<</capture>>
<</if>>
<</for>>
</div>
<<if _viewMode == "location">>
<<if _interactionPairs.length + _displayCharacters.length == 0>>
<div class="location-empty-state">No one is around right now.</div>
<</if>>
<</if>>
</div>
<</widget>>
<<widget "SaveLocation">>
<<set _prisonArrivalFrom = $player.info.currentLocation>>
<<set _prisonArrivalTo = setup.getCityPassageLocation(passage())>>
<<run $player.info.currentLocation = _prisonArrivalTo>>
<<run onLocationChanged(_prisonArrivalTo)>>
<<run EnsureWorkersAtLocation(_prisonArrivalTo)>>
<<if $prison and $prison.inside and typeof stagePrisonTravelIncident == "function">>
<<set _prisonArrivalMinute = getCurrentAbsoluteDay() * 1440 + $dateTime.hours * 60 + $dateTime.minutes>>
<<set _prisonArrivalSeed = getPrisonStintDay() * 1000003 + _prisonArrivalMinute + (($prison.travel and $prison.travel.count) ? $prison.travel.count * 97 : 0)>>
<<set _prisonArrivalRng = prisonSeededRng(_prisonArrivalSeed)>>
<<set _prisonArrival = stagePrisonTravelIncident($prison, _prisonArrivalFrom, _prisonArrivalTo, {
day: getPrisonStintDay(),
minute: _prisonArrivalMinute,
heat: ($prison.heat || 0),
scrip: ($prison.scrip || 0)
}, _prisonArrivalRng)>>
<<if _prisonArrival.staged>><<goto "Prison_TravelIncident">><</if>>
<</if>>
<</widget>>
/* ═══════════════════════════════════════════════════════════════════
ACHIEVEMENT SYSTEM WIDGETS
Use these widgets for money changes to automatically track achievements
═══════════════════════════════════════════════════════════════════ */
/* Add money to player (tracks for achievements) */
<<widget "AddMoney">>
<<set _amount = _args[0]>>
<<set $player.money += _amount>>
<<run onMoneyEarned(_amount, $player.money)>>
<</widget>>
/* Remove money from player */
<<widget "RemoveMoney">>
<<set _amount = _args[0]>>
<<set $player.money -= _amount>>
<<run onMoneyChanged($player.money)>>
<</widget>>
/* Set player money to specific amount */
<<widget "SetMoney">>
<<set _oldMoney = $player.money>>
<<set $player.money = _args[0]>>
<<if $player.money > _oldMoney>>
<<run onMoneyEarned($player.money - _oldMoney, $player.money)>>
<<else>>
<<run onMoneyChanged($player.money)>>
<</if>>
<</widget>>
/* Sync achievements with current game state (call periodically) */
<<widget "SyncAchievements">>
<<run syncGameStatsWithPlayer()>>
<<run checkAllAchievements()>>
<</widget>>
<<widget "SetBackground">>
<<run updateBackground($args[0] ?? $backgroundCache, false)>>
<<if $args[0]>>
<<set $backgroundCache = $args[0]>>
<</if>>
<</widget>>
<<widget "ShowNpcIcon">>
<<set _npcInteract = $args[0]>>
<<if typeof _npcInteract?.getPhotoImage === 'function'>>
<<set _characterIcon = _npcInteract.getPhotoImage()>>
<<if _characterIcon && _characterIcon != "none">>
<img class="chat-image" @src="_characterIcon" alt="Avatar">
<</if>>
<</if>>
<</widget>>
<<widget "NpcEventHeader">>
<<set _nepChar = _args[0]>>
<<set _nepIcon = (typeof _nepChar?.getPhotoImage === 'function') ? _nepChar.getPhotoImage() : 'Media\\Characters\\White\\Face\\0\\0.jpeg'>>
<<if !_nepChar?.info>>
<<set _nepName = 'Unknown'>>
<<set _nepJobTitle = 'Citizen'>>
<<else>>
<<set _nepJobTitle = (_nepChar.info.characterWork == "None" ? "Citizen" : (_nepChar.info.characterWork ?? "Citizen"))>>
<<if $player?.characterEvents?.isEventRegistered(_nepChar.info.id, "knows you") == false && _nepChar.info.characterWork != "external" && _nepChar.info.isPlayer == false>>
<<set _nepGender = (typeof _nepChar.gender === 'function') ? _nepChar.gender() : 'Male'>>
<<switch _nepGender>>
<<case "Female">>
<<set _nepGender = ((typeof _nepChar.getAgeText === 'function' && _nepChar.getAgeText() == "Young") ? "girl" : "woman")>>
<<case "Male">>
<<set _nepGender = "man">>
<<case "Shemale">>
<<set _nepGender = "shemale">>
<</switch>>
<<set _nepFatText = (typeof _nepChar.getFatText === 'function') ? _nepChar.getFatText() : ''>>
<<set _nepSkinText = (_nepChar.info.skin ?? '').toLowerCase()>>
<<set _nepName = [_nepFatText, _nepSkinText, _nepGender].filter(Boolean).join(' ').trim() || 'Stranger'>>
<<elseif _nepChar.info.characterWork == "external">>
<<set _nepName = _nepChar.info.firstName ?? 'Unknown'>>
<<else>>
<<set _nepName = [(_nepChar.info.firstName ?? ''), (_nepChar.info.secondName ?? '')].filter(Boolean).join(' ').trim() || 'Unknown'>>
<</if>>
<</if>>
<div class="npc-event-header">
<div class="npc-event-photo-container">
<img class="npc-event-portrait" @src="_nepIcon" alt="NPC Portrait">
</div>
<div class="npc-event-identity">
<div class="npc-event-name"><<= _nepName>></div>
<div class="npc-event-badges">
<div class="npc-event-job"><<= _nepJobTitle>></div>
</div>
</div>
</div>
<</widget>>
<<widget "NpcEventDialogue">>
<<if _args.length >= 2>>
<<set _nedChar = _args[0]>>
<<set _nedText = formatChatText(_args[1])>>
<<set _nedJobTitle = (_nedChar.info.characterWork == "None" ? "Citizen" : _nedChar.info.characterWork)>>
<<if $player.characterEvents.isEventRegistered(_nedChar.info.id, "knows you") == false && _nedChar.info.characterWork != "external" && _nedChar.info.isPlayer == false>>
<<set _nedGender = _nedChar.gender()>>
<<switch _nedGender>>
<<case "Female">>
<<if _nedChar.getAgeText() == "Young">>
<<set _nedGender = "girl">>
<<else>>
<<set _nedGender = "woman">>
<</if>>
<<case "Male">>
<<set _nedGender = "man">>
<<case "Shemale">>
<<set _nedGender = "shemale">>
<</switch>>
<<set _nedSpeaker = _nedChar.getFatText() + " " + (_nedChar.info.skin.toLowerCase()) + " " + _nedGender + " (" + _nedJobTitle + ")">>
<<elseif _nedChar.info.characterWork == "external">>
<<set _nedSpeaker = _nedChar.info.firstName>>
<<else>>
<<set _nedSpeaker = _nedChar.info.firstName + " (" + _nedJobTitle + ")">>
<</if>>
<div class="npc-event-dialogue">
<div class="npc-event-speaker"><<= _nedSpeaker>></div>
<div class="npc-event-text"><<= _nedText>></div>
</div>
<<else>>
<<set _nedText = formatChatText(_args[0] ?? '')>>
<div class="npc-event-dialogue">
<div class="npc-event-narration"><<= _nedText>></div>
</div>
<</if>>
<</widget>>
<<widget "DrawImage">>
<<set _image = $args[0]>>
<<set _width = $args[1]>>
<<set _height = $args[2]>>
<<set _style = "width: " + _width + "px; height: " + _height + "px;">>
<<if _width != undefined && _height != undefined>>
<img class="chat-image" @style="_style" @src="_image" alt="Avatar">
<<else>>
<img class="chat-image" @src="_image" alt="Avatar">
<</if>>
<</widget>>
<<widget "DrawImg">>
<<set _image = $args[0]>>
<img class="chat-image" @src="_image" alt="Avatar">
<</widget>>
<<widget "SpendEnergy">>
<<set _char = $args[0]>>
<<set _energySpend = $args[1]>>
<<run _char.status.energy.decrease(_energySpend)>>
<</widget>>
<<widget "BackButton">>
<div class="btn"><<button "Leave" $player.info.currentLocation>>
<<if $args[0]>>
<<= $args[0]>>
<</if>>
<</button>></div>
<</widget>>
<<widget "EachLoc">>
<<run UpdateSaveAllow()>>
<<run (function() {
if (typeof setRainOverlay !== 'function') return;
var raining = !!(SugarCube.State.variables.weather && SugarCube.State.variables.weather.isRaining);
var outdoor = typeof isOutdoorLocation === 'function' && isOutdoorLocation(passage());
setRainOverlay(raining, outdoor);
})()>>
<<include "TimeStats">>
<<include "UpdateStatBars">>
<<include "UpdateEndings">>
<<include "RelocateFollowers">>
<<run typeof ProcessExpiredPlayerHomeGuestDepartures === 'function' && ProcessExpiredPlayerHomeGuestDepartures(passage(), false)>>
<<if $pendingHomeGuestDeparture && $pendingHomeGuestDeparture.index !== undefined && $Characters[$pendingHomeGuestDeparture.index]>>
<<set _departNpc = $Characters[$pendingHomeGuestDeparture.index]>>
<<if _departNpc.info.currentLocation == passage() && setup.isNpcAtPlayerHome && setup.isNpcAtPlayerHome(_departNpc)>>
<<goto "PlayerHome_GuestDeparturePrompt">>
<</if>>
<</if>>
<<set _rollChanceAggressive = false>>
<<if $gameSettings.defaultAggression == true>>
<<set _rollChanceAggressive = rollChance(5)>>
<<else>>
<<set _rollChanceAggressive = rollChance($gameSettings.aggressiveChance)>>
<</if>>
/* Cruise isolation: while aboard the «Sirena» the city is frozen, so no city
LocationEvents/AggressiveEvent/PimpBrothelEvents may fire (some branches,
e.g. PornoFanatCome, spawn a fresh city NPC and ignore the empty $Locations). */
<<if !isOnBoard()>>
<<if $gameSettings.contentFilter.NPC_Activity == true && _rollChanceAggressive>>
<<AggressiveEvent>>
<<elseif $gameSettings.contentFilter.NPC_Activity == true && Random(0,100) > 89 >>
<<if $player.characterEvents.isEventRegistered($player.info.id, "Is a pimp's whore")>>
<<PimpBrothelEvents>>
<<else>>
<<LocationEvents>>
<</if>>
<</if>>
<</if>>
<</widget>>
<<widget "EachActions">>
<div class="btn"><<button "Wait">><<Wait>><</button>></div>
<<set _endBonus = $player.attributes.endurance.value>>
<<set _avgEnergy = Math.floor((5 + 12 + _endBonus) / 2)>>
<<set _energyNeeded = $player.status.energy.max - $player.status.energy.value>>
<<if _energyNeeded > 0>>
<<set _cycles = Math.ceil(_energyNeeded / _avgEnergy)>>
<<set _restMinutes = _cycles * 15>>
<<if _restMinutes >= 60>>
<<set _h = Math.floor(_restMinutes / 60)>>
<<set _m = _restMinutes % 60>>
<<if _m > 0>>
<<set _restLabel = "Rest (~" + _h + "h " + _m + "m)">>
<<else>>
<<set _restLabel = "Rest (~" + _h + "h)">>
<</if>>
<<else>>
<<set _restLabel = "Rest (~" + _restMinutes + "m)">>
<</if>>
<div class="btn"><<button _restLabel>><<RestFull>><</button>></div>
<<else>>
<div class="btn non-interacting"><<button "Rest (Full)">><</button>></div>
<</if>>
<</widget>>
<<widget "SpendTime">>
<<set _spendMinutes = $args[0]>>
<<run (function() {
try {
var dt = SugarCube.State.variables.dateTime;
var minutesToAdd = SugarCube.State.temporary.spendMinutes || 0;
var year = (dt && typeof dt._year === 'number') ? dt._year : ((dt && typeof dt.year === 'number') ? dt.year : 2025);
var month = (dt && typeof dt._month === 'number') ? dt._month : ((dt && typeof dt.month === 'number') ? dt.month : 9);
var oldDay = (dt && typeof dt._day === 'number') ? dt._day : ((dt && typeof dt.day === 'number') ? dt.day : 1);
var day = oldDay;
var hours = (dt && typeof dt._hours === 'number') ? dt._hours : ((dt && typeof dt.hours === 'number') ? dt.hours : 7);
var minutes = (dt && typeof dt._minutes === 'number') ? dt._minutes : ((dt && typeof dt.minutes === 'number') ? dt.minutes : 0);
var previousDt = new window.DateTime({ year: year, month: month, day: day, hours: hours, minutes: minutes });
var startHours = hours;
var startMinutes = minutes;
var totalMinutes = hours * 60 + minutes + minutesToAdd;
while (totalMinutes < 0) { day--; totalMinutes += 24 * 60; }
while (totalMinutes >= 24 * 60) { day++; totalMinutes -= 24 * 60; }
hours = Math.floor(totalMinutes / 60);
minutes = totalMinutes % 60;
var newDt = new window.DateTime({ year: year, month: month, day: day, hours: hours, minutes: minutes });
/* Run daily refresh once per day actually crossed (not just once for the whole jump),
so brothel income, salaries, and other per-day systems accrue correctly when a single
<<SpendTime>> spans multiple days (long sleep, multi-day quests, etc.). */
var daysAdvanced = day - oldDay;
var runCharactersRefresh = window.CharactersRefresh || globalThis.CharactersRefresh;
var runMonthRefresh = window.MonthRefresh || globalThis.MonthRefresh;
var refreshBrothelIncome = window.RefreshPlayerBrothelDailyIncome || globalThis.RefreshPlayerBrothelDailyIncome;
if (daysAdvanced > 0) {
for (var i = 1; i <= daysAdvanced; i++) {
/* Refresh at the crossed midnight; 07:00 could be later than the final time. */
var stepDt = new window.DateTime({ year: year, month: month, day: oldDay + i, hours: 0, minutes: 0 });
SugarCube.State.variables.dateTime = stepDt;
/* DateTime construction normalizes the calendar without firing month hooks. */
if (stepDt.day === 1 && typeof runMonthRefresh === 'function') {
try { runMonthRefresh(); } catch (monthError) { console.error('MonthRefresh error:', monthError); }
}
if (typeof refreshBrothelIncome === 'function') { refreshBrothelIncome(); }
if (typeof runCharactersRefresh === 'function') {
try { runCharactersRefresh(); } catch (refreshError) { console.error('CharactersRefresh error:', refreshError); }
}
}
}
SugarCube.State.variables.dateTime = newDt;
/* Needs and NPC finance follow every elapsed-time path, including short
actions that do not trigger relocation. Decisions wait for relocation. */
if (typeof AdvanceNpcWorld === 'function') {
try { AdvanceNpcWorld(newDt, SugarCube.State.variables, { allowDecisions: false }); }
catch (npcLifeError) { console.error('NPC life update error:', npcLifeError); }
}
/* Prison roster simulation is driven by the same clock as every authored
action. The runtime owns migration, bounded five-minute catch-up and the
director tick; a prison subsystem error must never abort SpendTime. */
var prisonState = SugarCube.State.variables.prison;
if (prisonState && prisonState.inside === true && minutesToAdd > 0 &&
typeof window.runPrisonRuntime === 'function') {
try {
window.runPrisonRuntime(minutesToAdd, startHours, startMinutes);
} catch (prisonRuntimeError) {
console.error('Prison runtime error:', prisonRuntimeError);
}
}
var shouldRelocate = false;
if (typeof ShouldAutoRelocateCharacters === 'function') {
shouldRelocate = ShouldAutoRelocateCharacters(previousDt, newDt);
} else {
shouldRelocate = minutesToAdd >= 30;
}
if (shouldRelocate && typeof RelocateCharacters === 'function') { RelocateCharacters(); }
/* Meetings with the player are judged on every clock step, not only when the
city relocates: arriving at the place a few minutes later must count (playerNpcMeetings.ts). */
if (!shouldRelocate && SugarCube.setup.playerNpcMeetings) {
try { SugarCube.setup.playerNpcMeetings.advance(); } catch (meetingError) { console.error('Meetings update error:', meetingError); }
}
if (typeof ProcessExpiredPlayerHomeGuestDepartures === 'function') {
var playerLocation = SugarCube.State.variables.player?.info?.currentLocation || '';
ProcessExpiredPlayerHomeGuestDepartures(playerLocation, false);
}
/* Update weather (rain start/stop) */
if (typeof updateWeather === 'function') { updateWeather(); }
/* Street gangs: settle the boss's orders whose clock ran out (streets.js). */
if (typeof window.runGangRuntime === 'function') {
try { window.runGangRuntime(); } catch (gangRuntimeError) { console.error('Gang runtime error:', gangRuntimeError); }
}
/* Day-life tables aboard the «Sirena» (cruiseDayLife): ship time itself drives
the contestants' background matches, so waiting on deck and sleeping early
simulate the same hours the same way. Runs BEFORE the sleep widget resolves
the tally, so an early sleeper's skipped evening plays out on live hands.
Post-tally hours are natural no-ops (voided hands leave no one eligible). */
var shipState = SugarCube.State.variables.ship;
var cruiseRoster = SugarCube.State.variables.cruiseRoster;
if (shipState && shipState.onBoard && Array.isArray(cruiseRoster) && minutesToAdd > 0 &&
typeof window.tableMinutesBetween === 'function' && typeof window.runShipDayLife === 'function') {
var tableMin = window.tableMinutesBetween(startHours, startMinutes, minutesToAdd);
var dayLife = window.runShipDayLife(cruiseRoster, tableMin, shipState.dayLifeCarry || 0);
shipState.dayLifeCarry = dayLife.carry;
if (dayLife.played > 0) {
var dayPlay = shipState.dayPlay || (shipState.dayPlay = { played: 0, results: [] });
dayPlay.played += dayLife.played;
dayPlay.results = dayPlay.results.concat(dayLife.results).slice(-8);
}
}
/* Increase dirt (hygiene decay) proportional to time passed: 100 dirt over 4320 minutes (3 days) */
var player = SugarCube.State.variables.player;
if (player && player.status && player.status.dirt && typeof player.status.dirt.increase === 'function') {
var dirtRate = minutesToAdd * (100 / 4320);
/* Rain + outdoor = 4x dirt accumulation (suppressed in isolated ship/prison content) */
var w = SugarCube.State.variables.weather;
if (w && w.isRaining && !(typeof isWeatherSuppressed === 'function' && isWeatherSuppressed()) && typeof isOutdoorLocation === 'function') {
var loc = (player.info && player.info.currentLocation) || '';
if (isOutdoorLocation(loc)) {
dirtRate *= 4;
}
}
player.status.dirt.increase(dirtRate);
}
} catch (e) { console.error('SpendTime error:', e); }
})()>>
<</widget>>
<<widget "SpendTimeWithoutUpdate">>
<<set _spendMinutes = $args[0]>>
<<run (function() {
try {
var dt = SugarCube.State.variables.dateTime;
var minutesToAdd = SugarCube.State.temporary.spendMinutes || 0;
var year = (dt && typeof dt._year === 'number') ? dt._year : ((dt && typeof dt.year === 'number') ? dt.year : 2025);
var month = (dt && typeof dt._month === 'number') ? dt._month : ((dt && typeof dt.month === 'number') ? dt.month : 9);
var oldDay = (dt && typeof dt._day === 'number') ? dt._day : ((dt && typeof dt.day === 'number') ? dt.day : 1);
var day = oldDay;
var hours = (dt && typeof dt._hours === 'number') ? dt._hours : ((dt && typeof dt.hours === 'number') ? dt.hours : 7);
var minutes = (dt && typeof dt._minutes === 'number') ? dt._minutes : ((dt && typeof dt.minutes === 'number') ? dt.minutes : 0);
var totalMinutes = hours * 60 + minutes + minutesToAdd;
while (totalMinutes < 0) { day--; totalMinutes += 24 * 60; }
while (totalMinutes >= 24 * 60) { day++; totalMinutes -= 24 * 60; }
hours = Math.floor(totalMinutes / 60);
minutes = totalMinutes % 60;
var newDt = new window.DateTime({ year: year, month: month, day: day, hours: hours, minutes: minutes });
var daysAdvanced = day - oldDay;
var runCharactersRefresh = window.CharactersRefresh || globalThis.CharactersRefresh;
var runMonthRefresh = window.MonthRefresh || globalThis.MonthRefresh;
var refreshBrothelIncome = window.RefreshPlayerBrothelDailyIncome || globalThis.RefreshPlayerBrothelDailyIncome;
if (daysAdvanced > 0) {
for (var i = 1; i <= daysAdvanced; i++) {
var stepDt = new window.DateTime({ year: year, month: month, day: oldDay + i, hours: 0, minutes: 0 });
SugarCube.State.variables.dateTime = stepDt;
if (stepDt.day === 1 && typeof runMonthRefresh === 'function') {
try { runMonthRefresh(); } catch (monthError) { console.error('MonthRefresh error:', monthError); }
}
if (typeof refreshBrothelIncome === 'function') { refreshBrothelIncome(); }
if (typeof runCharactersRefresh === 'function') {
try { runCharactersRefresh(); } catch (refreshError) { console.error('CharactersRefresh error:', refreshError); }
}
}
}
SugarCube.State.variables.dateTime = newDt;
if (typeof AdvanceNpcWorld === 'function') {
try { AdvanceNpcWorld(newDt, SugarCube.State.variables, { allowDecisions: false }); }
catch (npcLifeError) { console.error('NPC life update error:', npcLifeError); }
}
if (typeof ProcessExpiredPlayerHomeGuestDepartures === 'function') {
var playerLocation = SugarCube.State.variables.player?.info?.currentLocation || '';
ProcessExpiredPlayerHomeGuestDepartures(playerLocation, false);
}
} catch (e) { console.error('SpendTimeWithoutUpdate error:', e); }
})()>>
<</widget>>
<<widget "Travel">>
<<capture _dest>>
<<set _label = _args[0]>>
<<set _dest = _args[1]>>
<<set _cls = _args[2]>>
<<if $prison && $prison.inside>>
<div class="btn btn--tw-link non-interacting<<if _cls>> <<= _cls>><</if>>"><<button _label>><</button>></div>
<<else>>
<div class="btn btn--tw-link<<if _cls>> <<= _cls>><</if>>"><<button _label>>
/* Re-check custody when the click executes so a stale sidebar cannot escape. */
<<if !$prison || !$prison.inside>>
<<if $travelMode == 'bus'>>
<<if $player.money >= 10>>
<<set $busNextLocation = _dest>>
<<goto "Bus">>
<<else>>
<<set $travelMode = 'walk'>>
<<SpendTime 30>>
<<goto _dest>>
<</if>>
<<elseif $travelMode == 'car'>>
/* Gas is $12 a calendar day. The day lives in State (a Character field is lost on F5)
and is absolute, so the same date next month is a new day too. */
<<if $carGasDay !== getCurrentAbsoluteDay()>>
<<if $player.money >= 12>>
<<set $player.money -= 12>>
<<set $carGasDay = getCurrentAbsoluteDay()>>
<<else>>
<<run alert("Not enough money for gas. Traveling on foot.")>>
<<set $travelMode = 'walk'>>
<</if>>
<</if>>
<<if $travelMode == 'car'>>
<<SpendTime 5>>
<<set _chance = 5>>
<<if Random(1,100) <= _chance>>
<<set $walkNextLocation = _dest>>
<<goto "CarEvents">>
<<else>>
<<goto _dest>>
<</if>>
<<else>>
<<SpendTime 30>>
<<goto _dest>>
<</if>>
<<else>>
<<SpendTime 30>>
<<set _chance = 5>>
<<if Random(1,100) <= _chance>>
<<set $walkNextLocation = _dest>>
<<goto "WalkEvents">>
<<else>>
<<goto _dest>>
<</if>>
<</if>>
<</if>>
<</button>></div>
<</if>>
<</capture>>
<</widget>>
<<widget "SetTime">>
<<run (function() {
try {
var dt = SugarCube.State.variables.dateTime;
var targetMinutes = SugarCube.State.temporary.args[0].minutes || 0;
var targetHours = SugarCube.State.temporary.args[0].hours || 0;
var year = (dt && typeof dt._year === 'number') ? dt._year : ((dt && typeof dt.year === 'number') ? dt.year : 2025);
var month = (dt && typeof dt._month === 'number') ? dt._month : ((dt && typeof dt.month === 'number') ? dt.month : 9);
var day = (dt && typeof dt._day === 'number') ? dt._day : ((dt && typeof dt.day === 'number') ? dt.day : 1);
var newDt = new window.DateTime({ year: year, month: month, day: day, hours: targetHours, minutes: targetMinutes });
SugarCube.State.variables.dateTime = newDt;
if (typeof AdvanceNpcWorld === 'function') {
try { AdvanceNpcWorld(newDt, SugarCube.State.variables, { allowDecisions: false }); }
catch (npcLifeError) { console.error('NPC life update error:', npcLifeError); }
}
if (typeof ResetNpcAutoRelocationSchedule === 'function') { ResetNpcAutoRelocationSchedule(newDt); }
if (typeof ProcessExpiredPlayerHomeGuestDepartures === 'function') {
var playerLocation = SugarCube.State.variables.player?.info?.currentLocation || '';
ProcessExpiredPlayerHomeGuestDepartures(playerLocation, false);
}
} catch (e) { console.error('SetTime error:', e); }
})()>>
<</widget>>
<<widget "SpendDay">>
<<run (function() {
try {
var dt = SugarCube.State.variables.dateTime;
var year = (dt && typeof dt._year === 'number') ? dt._year : ((dt && typeof dt.year === 'number') ? dt.year : 2025);
var month = (dt && typeof dt._month === 'number') ? dt._month : ((dt && typeof dt.month === 'number') ? dt.month : 9);
var day = (dt && typeof dt._day === 'number') ? dt._day : ((dt && typeof dt.day === 'number') ? dt.day : 1);
/* Advance day by 1 */
day++;
/* Handle month overflow */
var daysInMonth = new Date(year, month, 0).getDate();
while (day > daysInMonth) {
day -= daysInMonth;
month++;
if (month > 12) { month = 1; year++; }
daysInMonth = new Date(year, month, 0).getDate();
}
/* Create new DateTime at 7:00 AM */
var newDt = new window.DateTime({ year: year, month: month, day: day, hours: 7, minutes: 0 });
SugarCube.State.variables.dateTime = newDt;
if (typeof AdvanceNpcWorld === 'function') {
try { AdvanceNpcWorld(newDt, SugarCube.State.variables, { allowDecisions: false }); }
catch (npcLifeError) { console.error('NPC life update error:', npcLifeError); }
}
/* Call daily refresh */
var runCharactersRefresh = window.CharactersRefresh || globalThis.CharactersRefresh;
var runMonthRefresh = window.MonthRefresh || globalThis.MonthRefresh;
var refreshBrothelIncome = window.RefreshPlayerBrothelDailyIncome || globalThis.RefreshPlayerBrothelDailyIncome;
if (newDt.day === 1 && typeof runMonthRefresh === 'function') {
try { runMonthRefresh(); } catch (monthError) { console.error('MonthRefresh error:', monthError); }
}
if (typeof refreshBrothelIncome === 'function') { refreshBrothelIncome(); }
if (typeof runCharactersRefresh === 'function') {
try { runCharactersRefresh(); } catch (refreshError) { console.error('CharactersRefresh error:', refreshError); }
}
if (typeof RelocateCharacters === 'function') { RelocateCharacters(); }
if (typeof ProcessExpiredPlayerHomeGuestDepartures === 'function') { ProcessExpiredPlayerHomeGuestDepartures('', false); }
} catch (e) { console.error('SpendDay error:', e); }
})()>>
<</widget>>
<<widget "TravelPinsPanel">>
/* D3: quick-travel favorites */
<<set _pins = getTravelPins()>>
<<set _curLoc = $player ? $player.info.currentLocation : "">>
<<set _activePin = _pins.length > 0 ? _pins[0] : "">>
<<set _isPinned = _curLoc ? isLocationPinned(_curLoc) : false>>
<<set _canPinHere = _curLoc && setup.canQuickTravelToPlayerBedroom ? setup.canQuickTravelToPlayerBedroom(passage()) : false>>
<<set _quickTravelBlocked = typeof isPimpCaptiveQuickTravelBlocked == "function" ? isPimpCaptiveQuickTravelBlocked(passage()) : false>>
<<if _isPinned>>
<div class="quick-travel-pin-control quick-travel-pin-control--active">
<<button "★ Unpin">>
<<run toggleTravelPin($player.info.currentLocation)>>
<<replace ".sidebar-quick-travel">><<TravelPinsPanel>><</replace>>
<</button>>
</div>
<<elseif _activePin>>
<div class="quick-travel-pin-control quick-travel-pin-control--active">
<<capture _activePin>>
<<button "Unpin">>
<<run toggleTravelPin(_activePin)>>
<<replace ".sidebar-quick-travel">><<TravelPinsPanel>><</replace>>
<</button>>
<</capture>>
</div>
<<elseif _canPinHere && _pins.length < MAX_TRAVEL_PINS>>
<div class="quick-travel-pin-control">
<<button "☆ Pin location">>
<<run toggleTravelPin($player.info.currentLocation)>>
<<replace ".sidebar-quick-travel">><<TravelPinsPanel>><</replace>>
<</button>>
</div>
<<else>>
<div class="quick-travel-pin-control"></div>
<</if>>
<<if _pins.length > 0>>
<div class="quick-travel-list">
<<for _i, _pinned range _pins>>
<<capture _pinned>>
<<set _label = formatLocationLabel(_pinned)>>
<div class="quick-travel-row">
<<if _quickTravelBlocked>>
<div class="btn btn--tw-link quick-travel-btn non-interacting"><<button _label>><</button>></div>
<<else>>
<<Travel _label _pinned "quick-travel-btn">>
<</if>>
</div>
<</capture>>
<</for>>
</div>
<</if>>
<</widget>>
<<widget "HomeGuestDeparturePromptContent">>
<<if !$pendingHomeGuestDeparture || $pendingHomeGuestDeparture.index === undefined || !$Characters[$pendingHomeGuestDeparture.index]>>
<<unset $pendingHomeGuestDeparture>>
<<else>>
<<set $indexNPC = $pendingHomeGuestDeparture.index>>
<<set $interactionNpc = $Characters[$indexNPC]>>
<<set _stayChance = setup.calculateNpcHomeStayChance ? setup.calculateNpcHomeStayChance($player, $interactionNpc) : 5>>
<<set _stayBtnText = "Ask to stay (" + _stayChance + "%)">>
<<ShowNpcIcon $interactionNpc>>
<<Chat $interactionNpc "I should get going now. Thanks for having me over.">>
<<ChatMessage "They are about to leave your home.">>
<div class="btn-container padding-top">
<div class="btn"><<button "Let them go" "PlayerHome_GuestDepartureResolve">><<set $pendingHomeGuestDeparture.action = "leave">><</button>></div>
<div class="btn"><<button _stayBtnText "PlayerHome_GuestDepartureResolve">><<set $pendingHomeGuestDeparture.action = "stay">><</button>></div>
</div>
<</if>>
<</widget>>
<<widget "PeopleAround">>
<div class="padding-up">
<<set _loca = $Locations[passage()] || []>>
<<DisplayCharacters _loca "location">>
</div>
<</widget>>
<<widget "Video">>
/* Empty src = clip suppressed by the content filter (SetSexPickByTable
returns '') - render nothing instead of a broken player. */
<<if _args[0]>>
<div id="video-container">
<video controls autoplay loop muted @onerror="_args[1] === 'text_fallback' ? 'this.parentElement.hidden = true' : null">
<source @src="_args[0]" @type="/\.webm$/i.test(_args[0]) ? 'video/webm' : 'video/mp4'" @onerror="_args[1] === 'text_fallback' ? 'this.parentElement.parentElement.hidden = true' : null">
</video>
</div>
<</if>>
<</widget>>
<<widget "ShowRelationsBar">>
<<set _char1 = _args[0]>>
<<set _char2 = _args[1]>>
<<set _show = _args[2]>> /*Friend Love Fear Both */
<<set _relMetricsForBars = _char1.getRelationship(_char2.info.id, false)?.metrics>>
<<set _friendship = _relMetricsForBars ? _relMetricsForBars.getMetricProxy("friendship") : { value: 0, max: 100 }>>
<<set _love = _relMetricsForBars ? _relMetricsForBars.getMetricProxy("love") : { value: 0, max: 100 }>>
<<set _fear = _relMetricsForBars ? _relMetricsForBars.getMetricProxy("fear") : { value: 0, max: 100 }>>
<div class="progress-bars-container-narrow">
<<if _show == "Friend" || _show == "Both">>
<div class="progress-container-narrow">
<div class="progress-title">Friendship</div>
<div class="progress-bar-narrow" id="progress1">
<div class="progress" id="friendship-id"></div>
</div>
<div class="progress-value" id="friendship-id-text">10/100</div>
</div>
<</if>>
<<if _show == "Love" || _show == "Both">>
<div class="progress-container-narrow">
<div class="progress-title">Love</div>
<div class="progress-bar-narrow" id="progress2">
<div class="progress" id="love-id"></div>
</div>
<div class="progress-value" id="love-id-text">50/100</div>
</div>
<</if>>
<<if _show == "Fear" || _show == "Both">>
<div class="progress-container-narrow">
<div class="progress-title" id="fear-bar">Fear</div>
<div class="progress-bar-narrow" id="progress3">
<div class="progress" id="fear-id"></div>
</div>
<div class="progress-value" id="fear-id-text">0/100</div>
</div>
<</if>>
</div>
<<done>>
<<if _show == "Friend" || _show == "Both">>
<<run UpdateProgressBar("friendship-id", _friendship.value, _friendship.max)>>
<<run DisplayText("friendship-id-text", Math.trunc(_friendship.value) + "/" + _friendship.max)>>
<</if>>
<<if _show == "Love" || _show == "Both">>
<<run UpdateProgressBar("love-id", _love.value, _love.max)>>
<<run DisplayText("love-id-text", Math.trunc(_love.value) + "/" + _love.max)>>
<</if>>
<<if _show == "Fear" || _show == "Both">>
<<run UpdateProgressBar("fear-id", _fear.value, _fear.max)>>
<<run DisplayText("fear-id-text", Math.trunc(_fear.value) + "/" + _fear.max)>>
<</if>>
<</done>>
<</widget>>
<<widget "SetSaveBtn">>
<<set $canShowStatsBtn = _args[0]>>
<<set $gameSettings.allowSaves = _args[0]>>
<</widget>>
<<widget "HideLeftPanel">>
<<set $shouldHideBar = _args[0]>>
<<script>>
if (typeof window.syncUiBarVisibility === 'function') {
window.syncUiBarVisibility();
}
<</script>>
<</widget>>
<<widget "DeleteCharacter">>
<<set _char = _args[0]>>
<<if _char && _char.info>>
<<set _removedId = _char.info.id>>
<<run _char = $Characters.find(element => element && element.info && element.info.id === _char.info.id);>>
<<set _indexToRemove = $Characters.indexOf(_char)>>
<<if _indexToRemove >= 0>>
<<run $Characters.splice(_indexToRemove, 1)>>
<<if typeof window.clearNpcMemory === 'function'>>
<<run window.clearNpcMemory(_removedId)>>
<</if>>
<<if typeof window.RemoveNpcEmployment === 'function'>><<run window.RemoveNpcEmployment(_removedId)>><</if>>
<<if typeof window.ClearNpcLifeRecord === 'function'>><<run window.ClearNpcLifeRecord(_removedId)>><</if>>
<<if typeof window.ClearNpcRumorKnowledge === 'function'>><<run window.ClearNpcRumorKnowledge(_removedId)>><</if>>
<<run SetCharactersToTheirLocations($Characters)>>
<</if>>
<</if>>
<</widget>>
<<widget "ResetInteractionNpc">>
<<set _newChar = _args[0]>>
<<set $interactionNpc = _newChar>>
<<set $indexNPC = $Characters.indexOf(_newChar)>>
<</widget>>
<<widget "IncreaseFriendship">>
<<set _char1 = $args[0]>>
<<set _char2 = $args[1]>>
<<set _value = $args[2]>>
<<if _value > 0>>
<<set _value += _char1.attributes.speech.value>>
<</if>>
<<set _relations = {friendship: _value}>>
<<set _char2.setRelationship(_char1.info.id, _relations)>>
<<set _char1.setRelationship(_char2.info.id, _relations)>>
<<run showRelationNotification({ metricName: "Friendship", metricKey: "friendship", value: _value, characterName: _char2.info.firstName })>>
<</widget>>
<<widget "IncreaseLove">>
<<set _char1 = $args[0]>>
<<set _char2 = $args[1]>>
<<set _value = $args[2]>>
<<set _relations = {love: _value}>>
<<set _char2.setRelationship(_char1.info.id, _relations)>>
<<set _char1.setRelationship(_char2.info.id, _relations)>>
<<run showRelationNotification({ metricName: "Love", metricKey: "love", value: _value, characterName: _char2.info.firstName })>>
<</widget>>
<<widget "CheckDatingProposal">>
/* Compatibility no-op. Official proposals are resolved once by
setup.checkNPCRelationshipProposal in enhanced_interaction_system. */
<</widget>>
<<widget "IncreaseSex">>
<<set _char1 = $args[0]>>
<<set _char2 = $args[1]>>
<<set _value = $args[2]>>
<<set _relations = {sex: _value}>>
<<set _char2.setRelationship(_char1.info.id, _relations)>>
<<set _char1.setRelationship(_char2.info.id, _relations)>>
<<run showRelationNotification({ metricName: "Attraction", metricKey: "sex", value: _value, characterName: _char2.info.firstName })>>
<</widget>>
<<widget "IncreaseFear">>
<<set _char1 = $args[0]>>
<<set _char2 = $args[1]>>
<<set _value = $args[2]>>
<<set _relations = {fear: _value}>>
<<run _char2.setRelationship(_char1.info.id, _relations, true)>>
<<run _char1.setRelationship(_char2.info.id, _relations, true)>>
<<run showRelationNotification({ metricName: "Fear", metricKey: "fear", value: _value, characterName: _char2.info.firstName })>>
<</widget>>
<<widget "IncreaseAnger">>
<<set _char1 = $args[0]>>
<<set _char2 = $args[1]>>
<<set _value = $args[2]>>
<<set _relations = {anger: _value}>>
<<run _char2.setRelationship(_char1.info.id, _relations, true)>>
<<run _char1.setRelationship(_char2.info.id, _relations, true)>>
<<run showRelationNotification({ metricName: "Anger", metricKey: "anger", value: _value, characterName: _char2.info.firstName })>>
<</widget>>
<<widget "SetRelations">>
<<set _char1 = $args[0]>>
<<set _char2 = $args[1]>>
<<set _relations = $args[2]>>
<<if _relations.friendship > 0>>
<<run _relations.friendship += (_char1.attractive() / 10)>>
<</if>>
<<if _relations.love > 0>>
<<run _relations.love += (_char1.attractive() / 10)>>
<</if>>
<<set _char2.setRelationship(_char1.info.id, _relations)>>
<<set _char1.setRelationship(_char2.info.id, _relations)>>
<</widget>>
<<widget "SetMood">>
/* <<set _char = $args[0]>>
<<set _value = $args[1]>>
<<if _value >= 0>>
<<run _char.behavior.mood.increase(_value)>>
<<ChatMessage '_char.info.firstName\'s mood was improved by _value.'>>
<<else>>
<<run _value = Math.abs(_value)>>
<<run _char.behavior.mood.decrease(_value)>>
<<ChatMessage '_char.info.firstName\'s mood has been reduced by _value.'>>
<</if>> */
<</widget>>
<<widget "ChanceButton">>
/*
$args[0] - button name
$args[1] - passage mark
$args[2] - actor
$args[3] - reciver
$args[4] - need value
$args[5] - fatigue mark
$args[6] - change values
*/
<<set _chanceButtonName = $args[0]>>
<<set _passageMark = $args[1]>>
<<set _chanceActor = $args[2]>>
<<set _chanceReciver = $args[3]>>
<<set _chanceNeedValue = $args[4]>>
<<set _fatigueMark = $args[5]>>
<<set _changeValues = $args[6]>>
<<run _jsonString = _chanceNeedValue.replace(/(\w+):/g, '"$1":')>>
<<run _chanceNeedValue = JSON.parse(_jsonString)>>
<<set _checkSexPref = _chanceNeedValue.CheckSexPref>>
<<set _chance = GetSuccessChance(_chanceActor, _chanceReciver, _chanceNeedValue, _fatigueMark)>>
<<include "CheckActivityPercent">>
<<if _checkSexPref == true>>
<<if _chanceReciver.checkSexPref(_chanceActor) == false>>
<<run _chance = Math.round(subtractPercentage(_chance, 90))>>
<</if>>
<</if>>
<<if _chanceReciver.attributes.submission.value > 0>>
<<run _chance *= (1 + 0.025 * _chanceReciver.attributes.submission.value)>>
<<run _chance = Math.round(_chance)>>
<</if>>
<<if _chance > 100>>
<<run _chance = 100>>
<</if>>
<<if _chance < 0>>
<<run _chance = 0>>
<</if>>
<<capture _chance _passageMark _changeValues>>
<<set _chanceButtonLabel = _chanceButtonName + " [" + _chance + "%]">>
<div class="btn"><<button _chanceButtonLabel _passageMark>><<set $chance = _chance>> _changeValues<</button>></div>
<</capture>>
<</widget>>
<<widget "CheckChance">>
<<set _SuccessPassage = _args[0]>>
<<set _FailedPassage = _args[1]>>
<<set _DoubleFailedPassage = _args[2]>>
<<set _BackPassage = _args[3]>>
<<set _eventName = _args[4]>>
<<set _additionalData = _args[5]>>
<<set _rejectEventName = "Reject " + _eventName>>
<<capture _eventName _rejectEventName>>
<<run _jsonString = _additionalData.replace(/(\w+):/g, '"$1":')>>
<<run _additionalData = JSON.parse(_jsonString)>>
<<if rollChance($chance) && $chance != 0>>
<<include _SuccessPassage>>
<<run $interactionNpc.dailyEvents.unregisterEvent($player.info.id, _rejectEventName)>>
<<run $interactionNpc.dailyEvents.registerEvent($player.info.id, _eventName, 1)>>
<<else>>
<<if $interactionNpc.dailyEvents.getOrRegisterEvent($player.info.id, _rejectEventName, 0) >= 1>>
<<include _DoubleFailedPassage>>
<<run $interactionNpc.dailyEvents.registerEvent($player.info.id, "Resentment", 1)>>
<<if _additionalData.createTwiceBackButton == true>>
<div class="padding-top">
<div class="btn"><<button "Back" _BackPassage>><</button>></div>
</div>
<</if>>
<<else>>
<<include _FailedPassage>>
<<if _additionalData.createBackButton == true>>
<div class="padding-top">
<div class="btn"><<button "Back" _BackPassage>><</button>></div>
</div>
<</if>>
<</if>>
<<run $interactionNpc.dailyEvents.registerEvent($player.info.id, _rejectEventName, 1)>>
<</if>>
<</capture>>
<<unset $chance>>
<</widget>>
<<widget "CheatUpdateStatsValue">>
<<set _stat = _args[0]>>
<<set _value = _args[1]>>
<<set _updatePassageName = _args[2]>>
<<capture _stat _value _updatePassageName>>
<<if _value > 0>>
<<run _stat.increase(_value)>>
<<else>>
<<run _stat.decrease(Math.abs(_value))>>
<</if>>
<<if _updatePassageName>>
<<include _updatePassageName>>
<</if>>
<</capture>>
<</widget>>
<<widget "StatsCheatButton">>
<<set _text = _args[0]>>
<<set _paramName = _args[1]>>
<<set _twoButtons = _args[2]>>
<<set _idInc = _paramName + "-increase-btn">>
<<set _id2Inc = _paramName + "-increase-btn2">>
<<set _idDec = _paramName + "-decrease-btn">>
<<set _id2Dec = _paramName + "-decrease-btn2">>
<<set _idValueText = _paramName + "-value_txt">>
<div class="row-stat-visual">
<div class="stat-card-stat-visual">
<div class="stat-title-stat-visual"><<print _text>></div>
<div class="surgery-container cp-stat-control">
<div class="cp-stat-actions cp-stat-actions--decrease">
<<if _twoButtons>>
<div class="surgery-item" @id="_id2Dec"></div>
<</if>>
<div class="surgery-item" @id="_idDec"></div>
</div>
<div class="stat-visual-stat-visual cp-stat-value-pill" @id="_idValueText"></div>
<div class="cp-stat-actions cp-stat-actions--increase">
<div class="surgery-item" @id="_idInc"></div>
<<if _twoButtons>>
<div class="surgery-item" @id="_id2Inc"></div>
<</if>>
</div>
</div>
</div>
</div>
<</widget>>
<<widget "CheatsButtonUpdate">>
<<set _paramName = _args[0]>>
<<set _stat = _args[1]>>
<<set _updatePassageName = _args[2]>>
<<set _twoButtons = _args[3]>>
<<set _value1 = _args[4]>>
<<set _value2 = _args[5]>>
<<capture _stat _value1 _value2 _paramName _updatePassageName>>
<<set _idInc = "#" + _paramName + "-increase-btn">>
<<set _idDec = "#" + _paramName + "-decrease-btn">>
<<set _negativeValue1 = _value1 * -1>>
<<if _twoButtons>>
<<set _id2Inc = "#" + _paramName + "-increase-btn2">>
<<set _id2Dec = "#" + _paramName + "-decrease-btn2">>
<<set _negativeValue2 = _value2 * -1>>
<</if>>
/* Create button text strings */
<<set _btnTextInc1 = "+" + _value1>>
<<set _btnTextInc2 = "+" + _value2>>
<<set _btnTextDec1 = String(_negativeValue1)>>
<<set _btnTextDec2 = String(_negativeValue2)>>
<<capture _negativeValue2 _negativeValue1 _btnTextInc1 _btnTextInc2 _btnTextDec1 _btnTextDec2>>
<<if Math.trunc(_stat.value) != _stat.max>>
<<if _twoButtons>>
<<replace _id2Inc>><div class="btn cp-compact-btn"><<button _btnTextInc2>><<CheatUpdateStatsValue _stat _value2 _updatePassageName>><</button>></div><</replace>>
<</if>>
<<replace _idInc>><div class="btn cp-compact-btn"><<button _btnTextInc1>><<CheatUpdateStatsValue _stat _value1 _updatePassageName>><</button>></div><</replace>>
<<else>>
<<if _twoButtons>>
<<replace _id2Inc>><div class="btn cp-compact-btn non-interacting"><<button _btnTextInc2>><</button>></div><</replace>>
<</if>>
<<replace _idInc>><div class="btn cp-compact-btn non-interacting"><<button _btnTextInc1>><</button>></div><</replace>>
<</if>>
<<if Math.trunc(_stat.value) != _stat.min>>
<<if _twoButtons>>
<<replace _id2Dec>><div class="btn cp-compact-btn"><<button _btnTextDec2>><<CheatUpdateStatsValue _stat _negativeValue2 _updatePassageName>><</button>></div><</replace>>
<</if>>
<<replace _idDec>><div class="btn cp-compact-btn"><<button _btnTextDec1>><<CheatUpdateStatsValue _stat _negativeValue1 _updatePassageName>><</button>></div><</replace>>
<<else>>
<<if _twoButtons>>
<<replace _id2Dec>><div class="btn cp-compact-btn non-interacting"><<button _btnTextDec2>><</button>></div><</replace>>
<</if>>
<<replace _idDec>><div class="btn cp-compact-btn non-interacting"><<button _btnTextDec1>><</button>></div><</replace>>
<</if>>
<</capture>>
<</capture>>
<</widget>>
<<widget "DisplayCharStats">>
<<set _char = _args[0]>>
<<run _face = _char.body.face>>
<<run _breast = _char.body.breastSize>>
<<run _ass = _char.body.buttSize>>
<<run _fat = _char.body.fat>>
/*Stats */
<<run _attributes = _char.attributes>>
<<run _lockpick = _attributes.lockpick>>
<<run _guns = _attributes.guns>>
<<run _meleeWeapons = _attributes.meleeWeapons>>
<<run _speech = _attributes.speech>>
<<run _performer = _attributes.performer>>
<<run _intelligence = _attributes.intelligence>>
<<run _corruption = _attributes.corruption>>
<<run _strength = _attributes.strength>>
<<run _vitality = _attributes.vitality>>
<<run _endurance = _attributes.endurance>>
<<run _dexterity = _attributes.dexterity>>
<<run _defense = _attributes.defense>>
/* Reputation */
<<run _photoModel = _char.info.reputation.photoModel>>
<<run _pornActor = _char.info.reputation.pornActer>>
<<run _nightclub = _char.info.reputation.nightclub>>
/* Body */
<<run _fat = _char.body.fat>>
<div class="padding-top">
<div class="container-stat-visual">
<p style="text-align: center;">Body</p>
<div class="row-stat-visual">
<div class="stat-card-stat-visual">
<div class="stat-title-stat-visual">Femininity</div>
<div class="stat-visual-stat-visual"><<print Math.trunc(_face.value)>>/_face.max</div>
</div>
<div class="stat-card-stat-visual">
<div class="stat-title-stat-visual">Breast</div>
<div class="stat-visual-stat-visual"><<print Math.trunc(_breast.value)>>/_breast.max</div>
</div>
<div class="stat-card-stat-visual">
<div class="stat-title-stat-visual">Butt</div>
<div class="stat-visual-stat-visual"><<print Math.trunc(_ass.value)>>/_ass.max</div>
</div>
<div class="stat-card-stat-visual">
<div class="stat-title-stat-visual">Weight</div>
<div class="stat-visual-stat-visual"><<print Math.trunc(_fat.value)>>/_fat.max</div>
</div>
</div>
</div>
</div>
<div class="padding-top">
<div class="container-stat-visual">
<p style="text-align: center;">Stats</p>
<div class="row-stat-visual">
<div class="stat-card-stat-visual">
<div class="stat-title-stat-visual">Lockpick</div>
<div class="stat-visual-stat-visual"><<print _lockpick.value>>/<<print _lockpick.max>></div>
</div>
</div>
<div class="row-stat-visual">
<div class="stat-card-stat-visual">
<div class="stat-title-stat-visual">Guns</div>
<div class="stat-visual-stat-visual"><<print _guns.value>>/<<print _guns.max>></div>
</div>
<div class="stat-card-stat-visual">
<div class="stat-title-stat-visual">Melee Weapons</div>
<div class="stat-visual-stat-visual"><<print _meleeWeapons.value>>/<<print _meleeWeapons.max>></div>
</div>
<div class="stat-card-stat-visual">
<div class="stat-title-stat-visual">Speech</div>
<div class="stat-visual-stat-visual"><<print _speech.value>>/<<print _speech.max>></div>
</div>
<div class="stat-card-stat-visual">
<div class="stat-title-stat-visual">Performer</div>
<div class="stat-visual-stat-visual"><<print _performer.value>>/<<print _performer.max>></div>
</div>
</div>
<div class="row-stat-visual">
<div class="stat-card-stat-visual">
<div class="stat-title-stat-visual">Intelligence</div>
<div class="stat-visual-stat-visual"><<print _intelligence.value>>/<<print _intelligence.max>></div>
</div>
<div class="stat-card-stat-visual">
<div class="stat-title-stat-visual">Corruption</div>
<div class="stat-visual-stat-visual"><<print _corruption.value>>/<<print _corruption.max>></div>
</div>
<div class="stat-card-stat-visual">
<div class="stat-title-stat-visual">Strength</div>
<div class="stat-visual-stat-visual"><<print _strength.value>>/<<print _strength.max>></div>
</div>
<div class="stat-card-stat-visual">
<div class="stat-title-stat-visual">Vitality</div>
<div class="stat-visual-stat-visual"><<print _vitality.value>>/<<print _vitality.max>></div>
</div>
</div>
<div class="row-stat-visual">
<div class="stat-card-stat-visual">
<div class="stat-title-stat-visual">Endurance</div>
<div class="stat-visual-stat-visual"><<print _endurance.value>>/<<print _endurance.max>></div>
</div>
<div class="stat-card-stat-visual">
<div class="stat-title-stat-visual">Dexterity</div>
<div class="stat-visual-stat-visual"><<print _dexterity.value>>/<<print _dexterity.max>></div>
</div>
<div class="stat-card-stat-visual">
<div class="stat-title-stat-visual">Pain Threshold</div>
<div class="stat-visual-stat-visual"><<print _defense.value>>/<<print _defense.max>></div>
</div>
</div>
</div>
</div>
<<if _char.info.isPlayer == true>>
<div class="padding-top">
<div class="container-stat-visual">
<p style="text-align: center;">Reputation</p>
<div class="row-stat-visual">
<div class="stat-card-stat-visual">
<div class="stat-title-stat-visual">Photo Model</div>
<div class="stat-visual-stat-visual"><<print Math.trunc(_photoModel.value)>>/_photoModel.max</div>
</div>
<div class="stat-card-stat-visual">
<div class="stat-title-stat-visual">Porn Actor</div>
<div class="stat-visual-stat-visual"><<print Math.trunc(_pornActor.value)>>/_pornActor.max</div>
</div>
<div class="stat-card-stat-visual">
<div class="stat-title-stat-visual">Nightclub</div>
<div class="stat-visual-stat-visual"><<print Math.trunc(_nightclub.value)>>/_nightclub.max</div>
</div>
</div>
</div>
</div>
<</if>>
<</widget>>
<<widget "ShowSurgery">>
<<set $surgeryChar = _args[0]>>
<<set $characterFaceType = new LimitedInt($surgeryChar.body.faceType.value, $surgeryChar.body.faceType.max, $surgeryChar.body.faceType.min)>>
<<goto "PlasticSurgery_Job">>
<</widget>>
<<widget "ShowCheats">>
<<include "InputCheatPassword">>
<<set $cheatsChar = _args[0]>>
<<set $characterFaceType = new LimitedInt($cheatsChar.body.faceType.value, $cheatsChar.body.faceType.max, $cheatsChar.body.faceType.min)>>
<</widget>>
<<widget "CreateQuest">>
<<set _quests = _args[0]>>
<<set _drawPanel = _args[1]>>
<<for _questItem range _quests>>
<<run addQuest(_questItem)>>
<</for>>
<<if _drawPanel>>
<<CreateQuestNotification _quests>>
<</if>>
<</widget>>
<<widget "CreateQuestNotification">>
<<set _quests = _args[0]>>
<<run createQuestNotificationPanel(_quests)>>
<</widget>>
<<widget "OpenShop">>
<<set $itemType = _args[0]>>
<<goto "Shop">>
<</widget>>
<<widget "LeaveInteractionSettings">>
<<unset $interactionNpc $indexNPC $interactionPairWitness>>
<<set $gameSettings.allowSaves = true>>
<<set $canShowStatsBtn = true>>
<</widget>>
<<widget "LockSettings">>
<<set $gameSettings.allowSaves = false>>
<<set $canShowStatsBtn = false>>
<</widget>>
<<widget "WorkBtn">>
<<if $player.status.energy.value >= 25>>
<div class="btn" id="work-btn"><<button "Work" "FinalJob">><</button>></div>
<<else>>
<div class="btn non-interacting" id="work-btn"><<button "Work" "FinalJob">><</button>></div>
<</if>>
<<done>>
<<run addHoverTooltip('work-btn', 'Needs 25 energy, a shift uses 20.')>>
<</done>>
<</widget>>
<<widget "WorkAllDayBtn">>
<<set _canWorkAllDay = ($player.status.energy.value >= 25 && $dateTime.hours >= 9 && $dateTime.hours < 21)>>
<<if _canWorkAllDay>>
<div class="btn" id="work-all-day-btn"><<button "Work All Day" "DinerWorkAllDay">><</button>></div>
<<else>>
<div class="btn non-interacting" id="work-all-day-btn"><<button "Work All Day">><</button>></div>
<</if>>
<<done>>
<<run addHoverTooltip('work-all-day-btn', 'Work until the diner closes at 22:00. Skips events, uses average earnings ($135/shift).')>>
<</done>>
<</widget>>
<<widget "CharacterStatsView">>
<<set _characterForView = _args[0]>>
<<set _canTakeOffClothes = _args[1]>>
<div class="stats-view-modern">
<div class="stats-tabs-modern">
<div class="stats-tab-modern active" id="stats-tab-info">
<<link "<span class='tab-icon'>👤</span> Info">>
<<run document.querySelectorAll('.stats-tab-modern').forEach(t => t.classList.remove('active'))>>
<<run document.getElementById('stats-tab-info').classList.add('active')>>
<<replace "#player-stats-view-content">><<DrawCharacterView _characterForView _canTakeOffClothes>><</replace>>
<</link>>
</div>
<div class="stats-tab-modern" id="stats-tab-stats">
<<link "<span class='tab-icon'>📊</span> Stats">>
<<run document.querySelectorAll('.stats-tab-modern').forEach(t => t.classList.remove('active'))>>
<<run document.getElementById('stats-tab-stats').classList.add('active')>>
<<replace "#player-stats-view-content">><<DrawCharacterStatsModern _characterForView _canTakeOffClothes>><</replace>>
<</link>>
</div>
<div class="stats-tab-modern" id="stats-tab-sexexp">
<<link "<span class='tab-icon'>💋</span> Sexual Exp">>
<<run document.querySelectorAll('.stats-tab-modern').forEach(t => t.classList.remove('active'))>>
<<run document.getElementById('stats-tab-sexexp').classList.add('active')>>
<<replace "#player-stats-view-content">><<DrawSexualExperience _characterForView>><</replace>>
<</link>>
</div>
<<if _characterForView.info.isPlayer != true>>
<div class="stats-tab-modern" id="stats-tab-knowninfo">
<<link "<span class='tab-icon'>🔍</span> Known Info">>
<<run document.querySelectorAll('.stats-tab-modern').forEach(t => t.classList.remove('active'))>>
<<run document.getElementById('stats-tab-knowninfo').classList.add('active')>>
<<replace "#player-stats-view-content">><<DrawNpcKnownInfo _characterForView>><</replace>>
<</link>>
</div>
<</if>>
<<if _characterForView.info.isPlayer != true>>
<div class="stats-tab-modern" id="stats-tab-kinks">
<<link "<span class='tab-icon'>🔞</span> Kinks">>
<<run document.querySelectorAll('.stats-tab-modern').forEach(t => t.classList.remove('active'))>>
<<run document.getElementById('stats-tab-kinks').classList.add('active')>>
<<replace "#player-stats-view-content">><<DrawCharacterKinks _characterForView>><</replace>>
<</link>>
</div>
<</if>>
<<if _characterForView.info.isPlayer == true>>
<div class="stats-tab-modern" id="stats-tab-reputation">
<<link "<span class='tab-icon'>⭐</span> Reputation">>
<<run document.querySelectorAll('.stats-tab-modern').forEach(t => t.classList.remove('active'))>>
<<run document.getElementById('stats-tab-reputation').classList.add('active')>>
<<replace "#player-stats-view-content">><<DrawCharacterReputationModern _characterForView>><</replace>>
<</link>>
</div>
<div class="stats-tab-modern" id="stats-tab-contacts">
<<link "<span class='tab-icon'>👥</span> Contacts">>
<<run document.querySelectorAll('.stats-tab-modern').forEach(t => t.classList.remove('active'))>>
<<run document.getElementById('stats-tab-contacts').classList.add('active')>>
<<replace "#player-stats-view-content">><<DrawNpcContacts _characterForView>><</replace>>
<</link>>
</div>
<</if>>
</div>
<div class="stats-content" id="player-stats-view-content">
<<DrawCharacterView _args[0] _args[1]>>
</div>
</div>
<</widget>>
<<widget "DrawNpcKnownInfo">>
<<set _npcForInfo = _args[0]>>
<<set _npcId = _npcForInfo.info.id>>
<<set _hasAnyInfo = false>>
<<set _knowsPrefGender = $player.characterEvents.isEventRegistered(_npcId, "discovered_prefGender")>>
<<set _knowsSexRole = $player.characterEvents.isEventRegistered(_npcId, "discovered_sexRole")>>
<<set _knowsFamily = $player.characterEvents.isEventRegistered(_npcId, "discovered_family")>>
<<set _knowsClothesPref = $player.characterEvents.isEventRegistered(_npcId, "discovered_clothesPref")>>
<<if _knowsPrefGender || _knowsSexRole || _knowsFamily || _knowsClothesPref>>
<<set _hasAnyInfo = true>>
<</if>>
<<if _hasAnyInfo>>
<div class="stats-card known-info">
<div class="stats-card-header">
<div class="stats-card-icon">🔍</div>
<div class="stats-card-title">Known Information</div>
</div>
<div class="known-info-grid">
<<if _knowsPrefGender>>
<div class="known-info-item">
<div class="known-info-label">Sexual Orientation</div>
<div class="known-info-value">
<<set _pref = _npcForInfo.info.sexualPreference>>
<<if _pref == "Manly">>
<span class="known-info-badge orientation manly">Prefers manly partners</span>
<<elseif _pref == "Feminine">>
<span class="known-info-badge orientation feminine">Prefers feminine partners</span>
<<elseif _pref == "Bi">>
<span class="known-info-badge orientation bi">No preference</span>
<</if>>
</div>
</div>
<</if>>
<<if _knowsSexRole>>
<div class="known-info-item">
<div class="known-info-label">Sex Role</div>
<div class="known-info-value">
<<set _role = _npcForInfo.info.SexRole>>
<<if _role == "Active">>
<span class="known-info-badge role active-role">Active</span>
<<elseif _role == "Passive">>
<span class="known-info-badge role passive-role">Passive</span>
<<elseif _role == "Versatile">>
<span class="known-info-badge role versatile-role">Versatile</span>
<</if>>
</div>
</div>
<</if>>
<<if _knowsClothesPref>>
<div class="known-info-item">
<div class="known-info-label">Clothing Style</div>
<div class="known-info-value">
<<set _clothes = _npcForInfo.info.clothesPreference>>
<<if _clothes == "men">>
<span class="known-info-badge clothes men-clothes">Prefers men's clothing</span>
<<else>>
<span class="known-info-badge clothes women-clothes">Prefers women's clothing</span>
<</if>>
</div>
</div>
<</if>>
</div>
</div>
<<if _knowsFamily>>
<div class="stats-card known-info">
<div class="stats-card-header">
<div class="stats-card-icon">👨👩👧👦</div>
<div class="stats-card-title">Family</div>
</div>
<div class="known-info-grid">
<<set _familyData = window.getNpcFamilyInfo(_npcId)>>
<<if _familyData == null>>
<div class="known-info-item">
<div class="known-info-value"><span class="known-info-badge">No family</span></div>
</div>
<<else>>
<div class="known-info-item">
<div class="known-info-label">Surname</div>
<div class="known-info-value"><span class="known-info-badge family"><<print _familyData.surname>></span></div>
</div>
<<if _familyData.isParent>>
<<if _familyData.childrenCount > 0>>
<div class="known-info-item">
<div class="known-info-label">Children</div>
<div class="known-info-value">
<<for _i, _childName range _familyData.childrenNames>>
<span class="known-info-badge family"><<print _childName>></span>
<</for>>
</div>
</div>
<</if>>
<<else>>
<div class="known-info-item">
<div class="known-info-label">Parents</div>
<div class="known-info-value">
<span class="known-info-badge family"><<print _familyData.parent1Name>></span>
<span class="known-info-badge family"><<print _familyData.parent2Name>></span>
</div>
</div>
<<if _familyData.siblingCount > 0>>
<div class="known-info-item">
<div class="known-info-label">Siblings</div>
<div class="known-info-value">
<<for _i, _sibName range _familyData.siblingNames>>
<span class="known-info-badge family"><<print _sibName>></span>
<</for>>
</div>
</div>
<</if>>
<</if>>
<</if>>
</div>
</div>
<</if>>
<<else>>
<div class="known-info-empty">
<div class="known-info-empty-icon">🔍</div>
<div class="known-info-empty-text">You haven't learned anything about this person yet. Try talking to them.</div>
</div>
<</if>>
<</widget>>
<<widget "DrawCharacterKinks">>
<<set _charForKinks = _args[0]>>
<<set _isKinksPlayer = _charForKinks.info.isPlayer == true>>
<<set _kinksCurious = []>>
<<set _kinksNeutral = []>>
<<set _kinksStale = []>>
<<if _isKinksPlayer>>
<<set _kinksLikes = _charForKinks.behavior && _charForKinks.behavior.kinks ? _charForKinks.behavior.kinks : []>>
<<set _kinksDislikes = _charForKinks.behavior && _charForKinks.behavior.kinkDislikes ? _charForKinks.behavior.kinkDislikes : []>>
<<set _kinksSuspected = []>>
<<set _kinksDetailsKnown = _kinksLikes.concat(_kinksDislikes)>>
<<else>>
<<set _kinksInfo = getDiscoveredKinks($player, _charForKinks)>>
<<set _kinksLikes = _kinksInfo.likes>>
<<set _kinksDislikes = _kinksInfo.dislikes>>
<<set _kinksSuspected = _kinksInfo.suspected>>
<<set _kinksDetailsKnown = _kinksInfo.detailsKnown>>
<<set _kinksCurious = _kinksInfo.curious>>
<<set _kinksNeutral = _kinksInfo.neutral>>
<<set _kinksStale = _kinksInfo.stale>>
<</if>>
<<if _kinksLikes.length == 0 && _kinksDislikes.length == 0 && _kinksSuspected.length == 0 && _kinksCurious.length == 0 && _kinksNeutral.length == 0>>
<div class="kinks-empty">
<div class="kinks-empty-icon">🔞</div>
<<if _isKinksPlayer>>
<div class="kinks-empty-text">You haven't developed any specific preferences yet.</div>
<<else>>
<div class="kinks-empty-text">You don't know what they're into yet. Maybe there's nothing, maybe you just haven't got that far.</div>
<</if>>
</div>
<<else>>
<div class="stats-card kinks">
<div class="stats-card-header">
<div class="stats-card-icon">🔞</div>
<div class="stats-card-title">Sexual Preferences</div>
</div>
<<if _kinksLikes.length > 0>>
<div class="kinks-subsection">
<div class="kinks-subsection-title likes-title">💚 Likes</div>
<div class="kinks-chip-grid">
<<for _kIdx, _k range _kinksLikes>>
<<set _kLabel = window.KINK_LABELS[_k]>>
<<set _kStrength = _isKinksPlayer ? window.getKinkStrengthInfo(_charForKinks, _k, false) : _kinksInfo.strengths[_k]>>
<<set _kHasDetails = _isKinksPlayer || _kinksDetailsKnown.includes(_k)>>
<<if _kLabel>>
<<set _kTooltip = _kLabel.description + (_kHasDetails ? " Strength: " + _kStrength.label + " (" + _kStrength.value + "/5)." : " You don't know how strong it is yet.") + (_kinksStale.includes(_k) ? " This information is over a month old; ask whether it still applies." : "")>>
<span class="kink-chip kink-chip--like stats-tooltip" @data-tooltip="_kTooltip">
<span class="kink-chip-icon"><<print _kLabel.icon>></span>
<span class="kink-chip-label"><<print _kLabel.label>></span>
<span class="kink-chip-strength"><<print _kHasDetails ? _kStrength.value + "/5" : "?" >></span>
</span>
<</if>>
<</for>>
</div>
</div>
<</if>>
<<if _kinksDislikes.length > 0>>
<div class="kinks-subsection">
<div class="kinks-subsection-title dislikes-title">🚫 Dislikes</div>
<div class="kinks-chip-grid">
<<for _kIdx, _k range _kinksDislikes>>
<<set _kLabel = window.KINK_LABELS[_k]>>
<<set _kStrength = _isKinksPlayer ? window.getKinkStrengthInfo(_charForKinks, _k, true) : _kinksInfo.strengths[_k]>>
<<set _kHasDetails = _isKinksPlayer || _kinksDetailsKnown.includes(_k)>>
<<if _kLabel>>
<<set _kTooltip = _kLabel.description + (_kHasDetails ? " Strength: " + _kStrength.label + " (" + _kStrength.value + "/5)." : " You don't know how strong it is yet.") + (_kinksStale.includes(_k) ? " This information is over a month old; ask whether it still applies." : "")>>
<span class="kink-chip kink-chip--dislike stats-tooltip" @data-tooltip="_kTooltip">
<span class="kink-chip-icon"><<print _kLabel.icon>></span>
<span class="kink-chip-label"><<print _kLabel.label>></span>
<span class="kink-chip-strength"><<print _kHasDetails ? _kStrength.value + "/5" : "?" >></span>
</span>
<</if>>
<</for>>
</div>
</div>
<</if>>
<<if !_isKinksPlayer && _kinksSuspected.length > 0>>
<div class="kinks-subsection">
<div class="kinks-subsection-title">🔎 Suspected</div>
<div class="kinks-chip-grid">
<<for _kIdx, _k range _kinksSuspected>>
<<set _kLabel = window.KINK_LABELS[_k]>>
<<if _kLabel>>
<span class="kink-chip stats-tooltip" @data-tooltip="'Unconfirmed information. Ask them directly before drawing conclusions.'">
<span class="kink-chip-icon"><<print _kLabel.icon>></span>
<span class="kink-chip-label"><<print _kLabel.label>></span>
<span class="kink-chip-strength">?</span>
</span>
<</if>>
<</for>>
</div>
</div>
<</if>>
<<if !_isKinksPlayer && (_kinksCurious.length > 0 || _kinksNeutral.length > 0)>>
<div class="kinks-subsection">
<div class="kinks-subsection-title">💬 Discussed together</div>
<div class="kinks-chip-grid">
<<for _kIdx, _k range _kinksCurious.concat(_kinksNeutral)>>
<<set _kLabel = window.KINK_LABELS[_k]>>
<<if _kLabel>>
<<set _kTooltip = (_kinksCurious.includes(_k) ? "They expressed curiosity. Discuss the conditions before trying anything." : "They have not described this as a preference.") + (_kinksStale.includes(_k) ? " This information is over a month old." : "")>>
<span class="kink-chip stats-tooltip" @data-tooltip="_kTooltip">
<span class="kink-chip-icon"><<print _kLabel.icon>></span>
<span class="kink-chip-label"><<print _kLabel.label>></span>
<span class="kink-chip-strength"><<print _kinksCurious.includes(_k) ? "Curious" : "Undecided">></span>
</span>
<</if>>
<</for>>
</div>
</div>
<</if>>
<<if !_isKinksPlayer>>
<div class="kinks-unknown-hint">
<span class="kinks-unknown-icon">💬</span>
<span class="kinks-unknown-text">These are things you have learned, not an agreement for a future meeting.<<if _kinksStale.length > 0>> Some information is over a month old and may have changed.<</if>></span>
</div>
<</if>>
</div>
<</if>>
<</widget>>
<<widget "DrawCharacterRelations">>
<<set _characterForView = _args[0]>>
<div class="stats-card social">
<div class="stats-card-header">
<div class="stats-card-icon">💝</div>
<div class="stats-card-title">Relationships</div>
</div>
<div class="stats-grid">
<div class="stat-row stats-relation-row friendship">
<div class="stat-name stats-tooltip" data-tooltip="How much this character considers you a friend.">
Friendship <span class="stat-info-icon">ℹ️</span>
</div>
<div class="stat-progress-container">
<div class="stat-progress-bar" id="char-friendship-progress"></div>
</div>
<div class="stat-value" id="char-friendship-value"></div>
</div>
<div class="stat-row stats-relation-row love">
<div class="stat-name stats-tooltip" data-tooltip="Romantic feelings this character has for you.">
Love <span class="stat-info-icon">ℹ️</span>
</div>
<div class="stat-progress-container">
<div class="stat-progress-bar" id="char-love-progress"></div>
</div>
<div class="stat-value" id="char-love-value"></div>
</div>
<div class="stat-row stats-relation-row fear">
<div class="stat-name stats-tooltip" data-tooltip="How afraid this character is of you.">
Fear <span class="stat-info-icon">ℹ️</span>
</div>
<div class="stat-progress-container">
<div class="stat-progress-bar" id="char-fear-progress"></div>
</div>
<div class="stat-value" id="char-fear-value"></div>
</div>
<div class="stat-row stats-relation-row sex">
<div class="stat-name stats-tooltip" data-tooltip="Sexual attraction this character has for you.">
Sex <span class="stat-info-icon">ℹ️</span>
</div>
<div class="stat-progress-container">
<div class="stat-progress-bar" id="char-sex-progress"></div>
</div>
<div class="stat-value" id="char-sex-value"></div>
</div>
<div class="stat-row stats-relation-row anger">
<div class="stat-name stats-tooltip" data-tooltip="How angry this character is at you.">
Anger <span class="stat-info-icon">ℹ️</span>
</div>
<div class="stat-progress-container">
<div class="stat-progress-bar" id="char-anger-progress"></div>
</div>
<div class="stat-value" id="char-anger-value"></div>
</div>
</div>
</div>
<<run setup.tempCharForRelations = _characterForView>>
<<done>>
<<run setTimeout(function() {
var char = setup.tempCharForRelations;
if (!char) return;
var rel = State.variables.player.getRelationship(char.info.id, false);
if (!rel || !rel.metrics) return;
var m = rel.metrics;
UpdateProgressBar("char-friendship-progress", m.friendship, 100);
UpdateProgressBar("char-love-progress", m.love, 100);
UpdateProgressBar("char-fear-progress", m.fear, 100);
UpdateProgressBar("char-sex-progress", m.sex, 100);
UpdateProgressBar("char-anger-progress", m.anger, 100);
DisplayText("char-friendship-value", Math.floor(m.friendship));
DisplayText("char-love-value", Math.floor(m.love));
DisplayText("char-fear-value", Math.floor(m.fear));
DisplayText("char-sex-value", Math.floor(m.sex));
DisplayText("char-anger-value", Math.floor(m.anger));
}, 50)>>
<</done>>
<</widget>>
<<widget "DrawCharacterView">>
<<set _characterForView = _args[0]>>
<<set _canTakeOffClothes = _args[1]>>
<<if _characterForView.info.isPlayer == true>>
Your name is <span class="green-text"><<print _characterForView.info.firstName>> <<print _characterForView.info.secondName>></span>. You are <span class="green-text"><<print _characterForView.info.age.value>></span> years old <span class="green-text"><<print _characterForView.gender()>></span>.
<<else>>
<<set _relation = _characterForView.getRelationship($player.info.id, false)?.relation ?? "acquaintance">>
<<set _relationColor = getRelationshipColor(_relation)>>
<<set _relationMark = Relations[_relation]>>
<span id="relationText">
Relationship:
<span id="relationValue"><<print Capitalize(_relationMark.label)>></span>
</span>
<<done>>
<<run $('#relationValue').css('color', _relationColor)>>
<</done>>
<br>
<<print Capitalize(_characterForView.pronounHisHer())>> name is <span class="green-text"><<print _characterForView.info.firstName>> <<print _characterForView.info.secondName>></span>.
<<print _characterForView.pronoun()>> is <span class="green-text"><<print _characterForView.info.age.value>></span> years old <span class="green-text"><<print _characterForView.gender()>></span>.
<<set _employmentKnown = $player.characterEvents.isEventRegistered(_characterForView.info.id, "knows you")>>
<<set _employmentSummary = GetEmploymentDisplay(_characterForView, SugarCube.State.variables, _employmentKnown ? "full" : "sector")>>
<<if _employmentSummary>>
<br>Occupation: <span class="green-text"><<print _employmentSummary>></span>.
<</if>>
<</if>>
<br>
<<if _characterForView.info.isPlayer == true>>
You have a
<<else>>
<<print _characterForView.pronoun()>> have a
<</if>>
<<if _characterForView.clothes.hasClothingType(1) == false && _characterForView.clothes.hasClothingType(2) == false>>
__<<link _characterForView.getBreastText()>>
<<run Dialog.create(_characterForView.getBreastText())>>
<<run Dialog.wiki(_characterForView.getBreastImage())>>
<<run Dialog.open()>>
<</link>>__
<<else>>
<span style="color: #fff;"><<print _characterForView.getBreastText()>></span>
<<if _characterForView.clothes.hasClothingType(0) == false && _characterForView.clothes.hasClothingType(3) == false>>
<<if _characterForView.info.isPlayer == true>>
under your clothes
<<else>>
under <<print _characterForView.pronounHisHer().toLowerCase()>> clothes
<</if>>
<</if>>
<</if>>
and
<<if _characterForView.clothes.hasClothingType(0) == false && _characterForView.clothes.hasClothingType(3) == false>>
__<<link _characterForView.getButtText()>>
<<run Dialog.create(_characterForView.getButtText())>>
<<run Dialog.wiki(_characterForView.getAssImage())>>
<<run Dialog.open()>>
<</link>>__
<<else>>
<span class="green-text"><<print _characterForView.getButtText()>></span>
<<if _characterForView.info.isPlayer == true>>
under your clothes
<<else>>
under <<print _characterForView.pronounHisHer().toLowerCase()>> clothes
<</if>>
<</if>>
<<include "CharacterWearingDraw">>
<<DrawCharacterBodyStats _characterForView _canTakeOffClothes>>
<<if _characterForView.info.isPlayer == false>>
<<DrawCharacterRelations _characterForView>>
<</if>>
<</widget>>
<<widget "DrawCharacterBodyStats">>
<<set _characterForView = _args[0]>>
<<set _canTakeOffClothes = _args[1]>>
<div class="stats-card body">
<div class="stats-card-header">
<div class="stats-card-icon">👤</div>
<div class="stats-card-title">Body Stats</div>
</div>
<div class="stats-grid">
<div class="stat-row">
<div class="stat-name stats-tooltip" data-tooltip="Your facial feminization level.">
Feminization <span class="stat-info-icon">ℹ️</span>
</div>
<div class="stat-progress-container">
<div class="stat-progress-bar" id="char-feminization-progress"></div>
</div>
<div class="stat-value" id="char-feminization-value"></div>
</div>
<div class="stat-row">
<div class="stat-name stats-tooltip" data-tooltip="Your breast size.">
Breast Size <span class="stat-info-icon">ℹ️</span>
</div>
<div class="stat-progress-container">
<div class="stat-progress-bar" id="char-breast-progress"></div>
</div>
<div class="stat-value" id="char-breast-value"></div>
</div>
<div class="stat-row">
<div class="stat-name stats-tooltip" data-tooltip="Your butt size.">
Butt Size <span class="stat-info-icon">ℹ️</span>
</div>
<div class="stat-progress-container">
<div class="stat-progress-bar" id="char-butt-progress"></div>
</div>
<div class="stat-value" id="char-butt-value"></div>
</div>
<<if _characterForView.genitalia() == "Penis">>
<div class="stat-row">
<div class="stat-name stats-tooltip" data-tooltip="Your penis size.">
Penis Size <span class="stat-info-icon">ℹ️</span>
</div>
<div class="stat-progress-container">
<div class="stat-progress-bar" id="char-penis-progress"></div>
</div>
<div class="stat-value" id="char-penis-value"></div>
</div>
<</if>>
</div>
</div>
<<run setup.tempCharForBody = _characterForView>>
<<done>>
<<run setTimeout(function() {
var char = setup.tempCharForBody;
if (!char || !char.body) return;
UpdateProgressBar("char-feminization-progress", char.body.face.value, char.body.face.max);
UpdateProgressBar("char-breast-progress", char.body.breastSize.value, char.body.breastSize.max);
UpdateProgressBar("char-butt-progress", char.body.buttSize.value, char.body.buttSize.max);
DisplayText("char-feminization-value", char.body.face.value);
DisplayText("char-breast-value", char.body.breastSize.value);
DisplayText("char-butt-value", char.body.buttSize.value);
if (char.genitalia && char.genitalia() === "Penis") {
UpdateProgressBar("char-penis-progress", char.body.penisSize.value, char.body.penisSize.max);
DisplayText("char-penis-value", char.body.penisSize.value);
}
}, 50)>>
<</done>>
<</widget>>
<<widget "DrawCharacterStats">>
<div class="player-stats-view-container">
<table class="player-stats-view-table">
<thead>
<tr class="player-stats-view-tr">
<th class="player-stats-view-th">Name</th>
<th class="player-stats-view-th">Progress to Next Level</th>
<th class="player-stats-view-th">Level</th>
</tr>
</thead>
<tbody>
<tr class="player-stats-view-tr">
<td class="player-stats-view-td">
<span
class="player-stats-view-tooltip"
data-tooltip="Determines the amount of damage you deal in combat.">
Strength
</span>
</td>
<td class="player-stats-view-td">
<div class="player-stats-view-progress-bar">
<div
class="player-stats-view-progress"
id="char-strength-progress"
></div>
</div>
</td>
<td class="player-stats-view-td" id="char-strength-value"></td>
</tr>
<tr class="player-stats-view-tr">
<td class="player-stats-view-td">
<span
class="player-stats-view-tooltip"
data-tooltip="Determines your maximum health points.">
Vitality
</span>
</td>
<td class="player-stats-view-td">
<div class="player-stats-view-progress-bar">
<div
class="player-stats-view-progress"
id="char-vitality-progress"
></div>
</div>
</td>
<td class="player-stats-view-td" id="char-vitality-value"></td>
</tr>
<tr class="player-stats-view-tr">
<td class="player-stats-view-td">
<span
class="player-stats-view-tooltip"
data-tooltip="Determines your maximum energy points.">
Endurance
</span>
</td>
<td class="player-stats-view-td">
<div class="player-stats-view-progress-bar">
<div
class="player-stats-view-progress"
id="char-endurance-progress"
></div>
</div>
</td>
<td class="player-stats-view-td" id="char-endurance-value"></td>
</tr>
<tr class="player-stats-view-tr">
<td class="player-stats-view-td">
<span
class="player-stats-view-tooltip"
data-tooltip="Increases your chance to dodge enemy attacks.">
Dexterity
</span>
</td>
<td class="player-stats-view-td">
<div class="player-stats-view-progress-bar">
<div
class="player-stats-view-progress"
id="char-dexterity-progress"
></div>
</div>
</td>
<td class="player-stats-view-td" id="char-dexterity-value"></td>
</tr>
<tr class="player-stats-view-tr">
<td class="player-stats-view-td">
<span
class="player-stats-view-tooltip"
data-tooltip="Reduces the amount of damage you take in combat.">
Defense
</span>
</td>
<td class="player-stats-view-td">
<div class="player-stats-view-progress-bar">
<div
class="player-stats-view-progress"
id="char-defense-progress"
></div>
</div>
</td>
<td class="player-stats-view-td" id="char-defense-value"></td>
</tr>
<tr class="player-stats-view-tr">
<td class="player-stats-view-td">
<span
class="player-stats-view-tooltip"
data-tooltip="(not yet implemented)">
Corruption
</span>
</td>
<td class="player-stats-view-td">
<div class="player-stats-view-progress-bar">
<div
class="player-stats-view-progress"
id="char-corruption-progress"
></div>
</div>
</td>
<td class="player-stats-view-td" id="char-corruption-value"></td>
</tr>
<tr class="player-stats-view-tr">
<td class="player-stats-view-td">
<span
class="player-stats-view-tooltip"
data-tooltip="Influences your character's tendency to engage in sexual activities.">
Lust
</span>
</td>
<td class="player-stats-view-td">
<div class="player-stats-view-progress-bar">
<div
class="player-stats-view-progress"
id="char-lust-progress"
></div>
</div>
</td>
<td class="player-stats-view-td" id="char-lust-value"></td>
</tr>
<tr class="player-stats-view-tr">
<td class="player-stats-view-td">
<span
class="player-stats-view-tooltip"
data-tooltip="Determines how long your character can engage in sexual activities.">
Sex Stamina
</span>
</td>
<td class="player-stats-view-td">
<div class="player-stats-view-progress-bar">
<div
class="player-stats-view-progress"
id="char-sexStamina-progress"
></div>
</div>
</td>
<td class="player-stats-view-td" id="char-sexStamina-value"></td>
</tr>
<tr class="player-stats-view-tr">
<td class="player-stats-view-td">
<span
class="player-stats-view-tooltip"
data-tooltip="Determines your ability to influence others and affects your preferred position in sexual encounters.">
Dominance
</span>
</td>
<td class="player-stats-view-td">
<div class="player-stats-view-progress-bar">
<div
class="player-stats-view-progress"
id="char-dominance-progress"
></div>
</div>
</td>
<td class="player-stats-view-td" id="char-dominance-value"></td>
</tr>
<tr class="player-stats-view-tr">
<td class="player-stats-view-td">
<span
class="player-stats-view-tooltip"
data-tooltip="This parameter determines how suggestible an NPC is. Each submission level an NPC has increases the success chance of any action by 2.5%.">
Submission
</span>
</td>
<td class="player-stats-view-td">
<div class="player-stats-view-progress-bar">
<div
class="player-stats-view-progress"
id="char-submission-progress"
></div>
</div>
</td>
<td class="player-stats-view-td" id="char-submission-value"></td>
</tr>
<tr class="player-stats-view-tr">
<td class="player-stats-view-td">
<span
class="player-stats-view-tooltip"
data-tooltip="Increases the amount of experience points you gain.">
Intelligence
</span>
</td>
<td class="player-stats-view-td">
<div class="player-stats-view-progress-bar">
<div
class="player-stats-view-progress"
id="char-intelligence-progress"
></div>
</div>
</td>
<td class="player-stats-view-td" id="char-intelligence-value"></td>
</tr>
<tr class="player-stats-view-tr">
<td class="player-stats-view-td">
<span
class="player-stats-view-tooltip"
data-tooltip="Improves your success rate when interacting with non-player characters (NPCs).">
Speech
</span>
</td>
<td class="player-stats-view-td">
<div class="player-stats-view-progress-bar">
<div
class="player-stats-view-progress"
id="char-speech-progress"
></div>
</div>
</td>
<td class="player-stats-view-td" id="char-speech-value"></td>
</tr>
<tr class="player-stats-view-tr">
<td class="player-stats-view-td">
<span
class="player-stats-view-tooltip"
data-tooltip="Determines your proficiency with firearms. Higher levels unlock better weapons and increase damage.">
Firearm Proficiency
</span>
</td>
<td class="player-stats-view-td">
<div class="player-stats-view-progress-bar">
<div
class="player-stats-view-progress"
id="char-firearmProficiency-progress"
></div>
</div>
</td>
<td class="player-stats-view-td" id="char-firearmProficiency-value"></td>
</tr>
/* <tr class="player-stats-view-tr">
<td class="player-stats-view-td">
<span
class="player-stats-view-tooltip"
data-tooltip="Description">
Performer
</span>
</td>
<td class="player-stats-view-td">
<div class="player-stats-view-progress-bar">
<div
class="player-stats-view-progress"
id="char-performer-progress"
></div>
</div>
</td>
<td class="player-stats-view-td" id="char-performer-value">2</td>
</tr>
*/
</tbody>
</table>
</div>
<<done>>
<<run UpdateProgressBar("char-strength-progress", _characterForView.progression.strength.value, _characterForView.progression.strength.max)>>
<<run UpdateProgressBar("char-vitality-progress", _characterForView.progression.vitality.value, _characterForView.progression.vitality.max)>>
<<run UpdateProgressBar("char-endurance-progress", _characterForView.progression.endurance.value, _characterForView.progression.endurance.max)>>
<<run UpdateProgressBar("char-dexterity-progress", _characterForView.progression.dexterity.value, _characterForView.progression.dexterity.max)>>
<<run UpdateProgressBar("char-defense-progress", _characterForView.progression.defense.value, _characterForView.progression.defense.max)>>
<<run UpdateProgressBar("char-corruption-progress", _characterForView.progression.corruption.value, _characterForView.progression.corruption.max)>>
<<run UpdateProgressBar("char-lust-progress", _characterForView.progression.lust.value, _characterForView.progression.lust.max)>>
<<run UpdateProgressBar("char-sexStamina-progress", _characterForView.progression.sexStamina.value, _characterForView.progression.sexStamina.max)>>
<<run UpdateProgressBar("char-dominance-progress", _characterForView.progression.dominance.value, _characterForView.progression.dominance.max)>>
<<run UpdateProgressBar("char-submission-progress", _characterForView.progression.submission.value, _characterForView.progression.submission.max)>>
<<run UpdateProgressBar("char-intelligence-progress", _characterForView.progression.intelligence.value, _characterForView.progression.intelligence.max)>>
<<run UpdateProgressBar("char-speech-progress", _characterForView.progression.speech.value, _characterForView.progression.speech.max)>>
<<run UpdateProgressBar("char-firearmProficiency-progress", _characterForView.progression.firearmProficiency.value, _characterForView.progression.firearmProficiency.max)>>
<<run DisplayText("char-strength-value", _characterForView.attributes.strength.value)>>
<<run DisplayText("char-vitality-value", _characterForView.attributes.vitality.value)>>
<<run DisplayText("char-endurance-value", _characterForView.attributes.endurance.value)>>
<<run DisplayText("char-dexterity-value", _characterForView.attributes.dexterity.value)>>
<<run DisplayText("char-defense-value", _characterForView.attributes.defense.value)>>
<<run DisplayText("char-corruption-value", _characterForView.attributes.corruption.value)>>
<<run DisplayText("char-lust-value", _characterForView.attributes.lust.value)>>
<<run DisplayText("char-sexStamina-value", _characterForView.attributes.sexStamina.value)>>
<<run DisplayText("char-dominance-value", _characterForView.attributes.dominance.value)>>
<<run DisplayText("char-submission-value", _characterForView.attributes.submission.value)>>
<<run DisplayText("char-intelligence-value", _characterForView.attributes.intelligence.value)>>
<<run DisplayText("char-speech-value", _characterForView.attributes.speech.value)>>
<<run DisplayText("char-firearmProficiency-value", _characterForView.attributes.firearmProficiency.value)>>
<</done>>
<</widget>>
<<widget "DrawCharacterReputation">>
<<set _characterForView = _args[0]>>
<div class="padding-top"></div>
<div class="player-stats-view-container">
<table class="player-stats-view-table">
<thead>
<tr class="player-stats-view-tr">
<th class="player-stats-view-th">Name</th>
<th class="player-stats-view-th" style="width:60%;">Value</th>
</tr>
</thead>
<tbody>
<tr class="player-stats-view-tr">
<td class="player-stats-view-td">Fashion Model</td>
<td class="player-stats-view-td">
<div class="player-stats-view-progress-bar">
<div class="player-stats-view-progress" id="char-fashion-progress"></div>
</div>
</td>
</tr>
<tr class="player-stats-view-tr">
<td class="player-stats-view-td">Porn actor</td>
<td class="player-stats-view-td">
<div class="player-stats-view-progress-bar">
<div class="player-stats-view-progress" id="char-porn-progress"></div>
</div>
</td>
</tr>
<tr class="player-stats-view-tr">
<td class="player-stats-view-td">Nightclub</td>
<td class="player-stats-view-td">
<div class="player-stats-view-progress-bar">
<div class="player-stats-view-progress" id="char-nightclub-progress"></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<<done>>
<<run UpdateProgressBar("char-fashion-progress", _characterForView.info.reputation.photoModel.value, _characterForView.info.reputation.photoModel.max)>>
<<run UpdateProgressBar("char-porn-progress", _characterForView.info.reputation.pornActer.value, _characterForView.info.reputation.pornActer.max)>>
<<run UpdateProgressBar("char-nightclub-progress", _characterForView.info.reputation.nightclub.value, _characterForView.info.reputation.nightclub.max)>>
<</done>>
<</widget>>
/* ═══════════════════════════════════════════════════════════════════
MODERN STATS VIEW WIDGETS
═══════════════════════════════════════════════════════════════════ */
<<widget "DrawCharacterStatsModern">>
<<set _characterForView = _args[0]>>
<<set _canTakeOffClothes = _args[1]>>
/* Combat Stats Card */
<div class="stats-card combat">
<div class="stats-card-header">
<div class="stats-card-icon">⚔️</div>
<div class="stats-card-title">Combat Stats</div>
</div>
<div class="stats-grid">
<div class="stat-row">
<div class="stat-name stats-tooltip" data-tooltip="Determines the amount of damage you deal in combat. Raise it: Strength training at the Fitness Club, winning fistfights, or some quest rewards. Lower it: getting arrested and jailed.">
Strength <span class="stat-info-icon">ℹ️</span>
</div>
<div class="stat-progress-container">
<div class="stat-progress-bar" id="modern-strength-progress"></div>
</div>
<div class="stat-value" id="modern-strength-value"></div>
</div>
<div class="stat-row">
<div class="stat-name stats-tooltip" data-tooltip="Determines your maximum health points. Raise it: Vitality training at the Fitness Club, or winning a fight by seduction. Lower it: getting arrested and jailed.">
Vitality <span class="stat-info-icon">ℹ️</span>
</div>
<div class="stat-progress-container">
<div class="stat-progress-bar" id="modern-vitality-progress"></div>
</div>
<div class="stat-value" id="modern-vitality-value"></div>
</div>
<div class="stat-row">
<div class="stat-name stats-tooltip" data-tooltip="Determines your maximum energy points. Raise it: Endurance training at the Fitness Club. There is no normal way to lower it.">
Endurance <span class="stat-info-icon">ℹ️</span>
</div>
<div class="stat-progress-container">
<div class="stat-progress-bar" id="modern-endurance-progress"></div>
</div>
<div class="stat-value" id="modern-endurance-value"></div>
</div>
<div class="stat-row">
<div class="stat-name stats-tooltip" data-tooltip="Increases your chance to dodge enemy attacks. Raise it: Dexterity training at the Fitness Club, or some quest rewards. Lower it: getting arrested and jailed.">
Dexterity <span class="stat-info-icon">ℹ️</span>
</div>
<div class="stat-progress-container">
<div class="stat-progress-bar" id="modern-dexterity-progress"></div>
</div>
<div class="stat-value" id="modern-dexterity-value"></div>
</div>
<div class="stat-row">
<div class="stat-name stats-tooltip" data-tooltip="Reduces the amount of damage you take in combat. Raise it: Defense training at the Fitness Club, or some quest rewards. Lower it: getting arrested and jailed.">
Defense <span class="stat-info-icon">ℹ️</span>
</div>
<div class="stat-progress-container">
<div class="stat-progress-bar" id="modern-defense-progress"></div>
</div>
<div class="stat-value" id="modern-defense-value"></div>
</div>
<div class="stat-row">
<div class="stat-name stats-tooltip" data-tooltip="Determines your proficiency with firearms. Higher levels unlock better weapons. Raise it: practice at the Shooting Range. There is no normal way to lower it.">
Firearm Prof. <span class="stat-info-icon">ℹ️</span>
</div>
<div class="stat-progress-container">
<div class="stat-progress-bar" id="modern-firearm-progress"></div>
</div>
<div class="stat-value" id="modern-firearm-value"></div>
</div>
<div class="stat-row">
<div class="stat-name stats-tooltip" data-tooltip="Your ability to pick locks. Higher skill widens the success zone and slows down the lockpick minigame. Raise it: pay the Fence in the Black Market to train you. There is no normal way to lower it.">
Lockpick <span class="stat-info-icon">ℹ️</span>
</div>
<div class="stat-progress-container">
<div class="stat-progress-bar" id="modern-lockpick-progress"></div>
</div>
<div class="stat-value" id="modern-lockpick-value"></div>
</div>
</div>
</div>
/* Social Stats Card */
<div class="stats-card social">
<div class="stats-card-header">
<div class="stats-card-icon">💬</div>
<div class="stats-card-title">Social Stats</div>
</div>
<div class="stats-grid">
<div class="stat-row">
<div class="stat-name stats-tooltip" data-tooltip="Improves your success rate when interacting with NPCs. Raise it: Oratory Lessons on the computer. Lower it: getting arrested and jailed.">
Speech <span class="stat-info-icon">ℹ️</span>
</div>
<div class="stat-progress-container">
<div class="stat-progress-bar" id="modern-speech-progress"></div>
</div>
<div class="stat-value" id="modern-speech-value"></div>
</div>
<div class="stat-row">
<div class="stat-name stats-tooltip" data-tooltip="Increases the amount of experience points you gain. Raise it: study at the Library, attend classes at the College, or some quest rewards. Lower it: getting arrested and jailed.">
Intelligence <span class="stat-info-icon">ℹ️</span>
</div>
<div class="stat-progress-container">
<div class="stat-progress-bar" id="modern-intelligence-progress"></div>
</div>
<div class="stat-value" id="modern-intelligence-value"></div>
</div>
<div class="stat-row">
<div class="stat-name stats-tooltip" data-tooltip="Determines your ability to influence others and preferred position in encounters. Raise it: win fights, take the dominant role in sex, act aggressively in events, or Ego Training on the computer. Lower it: surrender or lose a fight, or get jailed.">
Dominance <span class="stat-info-icon">ℹ️</span>
</div>
<div class="stat-progress-container">
<div class="stat-progress-bar" id="modern-dominance-progress"></div>
</div>
<div class="stat-value" id="modern-dominance-value"></div>
</div>
<div class="stat-row">
<div class="stat-name stats-tooltip" data-tooltip="Each submission level increases the success chance of any action by 2.5%. Raise it: lose or surrender a fight, or take the submissive role in sex. Lower it: Ego Training on the computer.">
Submission <span class="stat-info-icon">ℹ️</span>
</div>
<div class="stat-progress-container">
<div class="stat-progress-bar" id="modern-submission-progress"></div>
</div>
<div class="stat-value" id="modern-submission-value"></div>
</div>
</div>
</div>
/* Sexual Stats Card */
<div class="stats-card sexual">
<div class="stats-card-header">
<div class="stats-card-icon">💕</div>
<div class="stats-card-title">Sexual Stats</div>
</div>
<div class="stats-grid">
<div class="stat-row">
<div class="stat-name stats-tooltip" data-tooltip="Influences your character's tendency to engage in sexual activities. Raise it: have sex (more when you take the dominant role). There is no normal way to lower it.">
Lust <span class="stat-info-icon">ℹ️</span>
</div>
<div class="stat-progress-container">
<div class="stat-progress-bar" id="modern-lust-progress"></div>
</div>
<div class="stat-value" id="modern-lust-value"></div>
</div>
<div class="stat-row">
<div class="stat-name stats-tooltip" data-tooltip="Determines how long your character can engage in sexual activities. Raise it: reach climax as the dominant partner during sex. There is no normal way to lower it.">
Sex Stamina <span class="stat-info-icon">ℹ️</span>
</div>
<div class="stat-progress-container">
<div class="stat-progress-bar" id="modern-sexstamina-progress"></div>
</div>
<div class="stat-value" id="modern-sexstamina-value"></div>
</div>
<div class="stat-row">
<div class="stat-name stats-tooltip" data-tooltip="Affects your character's willingness to engage in taboo activities. Raise it: pick the lewd or exhibitionist option in random events (diner waitress shifts, bartending, street encounters). There is no normal way to lower it.">
Corruption <span class="stat-info-icon">ℹ️</span>
</div>
<div class="stat-progress-container">
<div class="stat-progress-bar" id="modern-corruption-progress"></div>
</div>
<div class="stat-value" id="modern-corruption-value"></div>
</div>
</div>
</div>
<<run setup.tempCharForStats = _characterForView>>
<<done>>
<<run setTimeout(function() {
var char = setup.tempCharForStats;
if (!char) return;
UpdateProgressBar("modern-strength-progress", char.progression.strength.value, char.progression.strength.max);
UpdateProgressBar("modern-vitality-progress", char.progression.vitality.value, char.progression.vitality.max);
UpdateProgressBar("modern-endurance-progress", char.progression.endurance.value, char.progression.endurance.max);
UpdateProgressBar("modern-dexterity-progress", char.progression.dexterity.value, char.progression.dexterity.max);
UpdateProgressBar("modern-defense-progress", char.progression.defense.value, char.progression.defense.max);
UpdateProgressBar("modern-firearm-progress", char.progression.firearmProficiency.value, char.progression.firearmProficiency.max);
UpdateProgressBar("modern-lockpick-progress", char.progression.lockpick.value, char.progression.lockpick.max);
UpdateProgressBar("modern-speech-progress", char.progression.speech.value, char.progression.speech.max);
UpdateProgressBar("modern-intelligence-progress", char.progression.intelligence.value, char.progression.intelligence.max);
UpdateProgressBar("modern-dominance-progress", char.progression.dominance.value, char.progression.dominance.max);
UpdateProgressBar("modern-submission-progress", char.progression.submission.value, char.progression.submission.max);
UpdateProgressBar("modern-lust-progress", char.progression.lust.value, char.progression.lust.max);
UpdateProgressBar("modern-sexstamina-progress", char.progression.sexStamina.value, char.progression.sexStamina.max);
UpdateProgressBar("modern-corruption-progress", char.progression.corruption.value, char.progression.corruption.max);
DisplayText("modern-strength-value", char.attributes.strength.value);
DisplayText("modern-vitality-value", char.attributes.vitality.value);
DisplayText("modern-endurance-value", char.attributes.endurance.value);
DisplayText("modern-dexterity-value", char.attributes.dexterity.value);
DisplayText("modern-defense-value", char.attributes.defense.value);
DisplayText("modern-firearm-value", char.attributes.firearmProficiency.value);
DisplayText("modern-lockpick-value", char.attributes.lockpick.value);
DisplayText("modern-speech-value", char.attributes.speech.value);
DisplayText("modern-intelligence-value", char.attributes.intelligence.value);
DisplayText("modern-dominance-value", char.attributes.dominance.value);
DisplayText("modern-submission-value", char.attributes.submission.value);
DisplayText("modern-lust-value", char.attributes.lust.value);
DisplayText("modern-sexstamina-value", char.attributes.sexStamina.value);
DisplayText("modern-corruption-value", char.attributes.corruption.value);
}, 50)>>
<</done>>
<</widget>>
<<widget "GainSexExp">>
<<nobr>>
<<run (function() {
var char = _args[0];
var skill = _args[1];
var amount = Number(_args[2]) || 0;
if (!char) return;
if (!char.sexExperience) char.sexExperience = createDefaultSexExperience();
var stat = char.sexExperience[skill];
if (!stat) return;
if (isNaN(stat.value)) stat.value = 0;
stat.value = Math.min(stat.value + amount, stat.max);
})()>>
<</nobr>>
<</widget>>
<<widget "DrawSexualExperience">>
<<set _characterForView = _args[0]>>
<<if _characterForView.sexExperience == undefined>>
<<run _characterForView.sexExperience = createDefaultSexExperience()>>
<</if>>
<div class="stats-card sexual">
<div class="stats-card-header">
<div class="stats-card-icon">🔥</div>
<div class="stats-card-title">Psychological Traits</div>
</div>
<div class="sex-exp-grid">
<div class="sex-exp-item">
<div class="sex-exp-header">
<span class="sex-exp-name">Disinhibition</span>
<span class="sex-exp-level" id="sexexp-disinhibition-level"></span>
</div>
<div class="stat-progress-container">
<div class="stat-progress-bar" id="sexexp-disinhibition"></div>
</div>
</div>
<div class="sex-exp-item">
<div class="sex-exp-header">
<span class="sex-exp-name">Sexual Knowledge</span>
<span class="sex-exp-level" id="sexexp-knowledge-level"></span>
</div>
<div class="stat-progress-container">
<div class="stat-progress-bar" id="sexexp-knowledge"></div>
</div>
</div>
<div class="sex-exp-item">
<div class="sex-exp-header">
<span class="sex-exp-name">Exhibitionism</span>
<span class="sex-exp-level" id="sexexp-exhibitionism-level"></span>
</div>
<div class="stat-progress-container">
<div class="stat-progress-bar" id="sexexp-exhibitionism"></div>
</div>
</div>
<div class="sex-exp-item">
<div class="sex-exp-header">
<span class="sex-exp-name">Voyeurism</span>
<span class="sex-exp-level" id="sexexp-voyeurism-level"></span>
</div>
<div class="stat-progress-container">
<div class="stat-progress-bar" id="sexexp-voyeurism"></div>
</div>
</div>
<div class="sex-exp-item">
<div class="sex-exp-header">
<span class="sex-exp-name">Assertiveness</span>
<span class="sex-exp-level" id="sexexp-assertiveness-level"></span>
</div>
<div class="stat-progress-container">
<div class="stat-progress-bar" id="sexexp-assertiveness"></div>
</div>
</div>
<div class="sex-exp-item">
<div class="sex-exp-header">
<span class="sex-exp-name">Compliance</span>
<span class="sex-exp-level" id="sexexp-compliance-level"></span>
</div>
<div class="stat-progress-container">
<div class="stat-progress-bar" id="sexexp-compliance"></div>
</div>
</div>
</div>
</div>
<div class="stats-card sexual">
<div class="stats-card-header">
<div class="stats-card-icon">💋</div>
<div class="stats-card-title">Physical Skills</div>
</div>
<div class="sex-exp-grid">
<div class="sex-exp-item">
<div class="sex-exp-header">
<span class="sex-exp-name">Hand</span>
<span class="sex-exp-level" id="sexexp-hand-level"></span>
</div>
<div class="stat-progress-container">
<div class="stat-progress-bar" id="sexexp-hand"></div>
</div>
</div>
<div class="sex-exp-item">
<div class="sex-exp-header">
<span class="sex-exp-name">Oral</span>
<span class="sex-exp-level" id="sexexp-oral-level"></span>
</div>
<div class="stat-progress-container">
<div class="stat-progress-bar" id="sexexp-oral"></div>
</div>
</div>
<div class="sex-exp-item">
<div class="sex-exp-header">
<span class="sex-exp-name">Vaginal</span>
<span class="sex-exp-level" id="sexexp-vaginal-level"></span>
</div>
<div class="stat-progress-container">
<div class="stat-progress-bar" id="sexexp-vaginal"></div>
</div>
</div>
<div class="sex-exp-item">
<div class="sex-exp-header">
<span class="sex-exp-name">Penetrative</span>
<span class="sex-exp-level" id="sexexp-penetrative-level"></span>
</div>
<div class="stat-progress-container">
<div class="stat-progress-bar" id="sexexp-penetrative"></div>
</div>
</div>
<div class="sex-exp-item">
<div class="sex-exp-header">
<span class="sex-exp-name">Anal</span>
<span class="sex-exp-level" id="sexexp-anal-level"></span>
</div>
<div class="stat-progress-container">
<div class="stat-progress-bar" id="sexexp-anal"></div>
</div>
</div>
</div>
</div>
<<run setup.tempCharForSexExp = _characterForView>>
<<done>>
<<run setTimeout(function() {
var char = setup.tempCharForSexExp;
if (!char || !char.sexExperience) return;
var defaults = createDefaultSexExperience();
var keys = Object.keys(defaults);
for (var i = 0; i < keys.length; i++) {
var k = keys[i];
if (!char.sexExperience[k]) char.sexExperience[k] = defaults[k];
if (isNaN(char.sexExperience[k].value)) char.sexExperience[k].value = 0;
}
UpdateProgressBar("sexexp-disinhibition", (char.sexExperience.disinhibition.value % 10) * 10, 100);
UpdateProgressBar("sexexp-knowledge", (char.sexExperience.sexualKnowledge.value % 10) * 10, 100);
UpdateProgressBar("sexexp-exhibitionism", (char.sexExperience.exhibitionism.value % 10) * 10, 100);
UpdateProgressBar("sexexp-voyeurism", (char.sexExperience.voyeurism.value % 10) * 10, 100);
UpdateProgressBar("sexexp-assertiveness", (char.sexExperience.assertiveness.value % 10) * 10, 100);
UpdateProgressBar("sexexp-compliance", (char.sexExperience.compliance.value % 10) * 10, 100);
UpdateProgressBar("sexexp-hand", (char.sexExperience.handSkill.value % 10) * 10, 100);
UpdateProgressBar("sexexp-oral", (char.sexExperience.oralSkill.value % 10) * 10, 100);
UpdateProgressBar("sexexp-vaginal", (char.sexExperience.vaginalSkill.value % 10) * 10, 100);
UpdateProgressBar("sexexp-penetrative", (char.sexExperience.penetrativeSkill.value % 10) * 10, 100);
UpdateProgressBar("sexexp-anal", (char.sexExperience.analSkill.value % 10) * 10, 100);
DisplayText("sexexp-disinhibition-level", "Lvl " + Math.floor(char.sexExperience.disinhibition.value / 10));
DisplayText("sexexp-knowledge-level", "Lvl " + Math.floor(char.sexExperience.sexualKnowledge.value / 10));
DisplayText("sexexp-exhibitionism-level", "Lvl " + Math.floor(char.sexExperience.exhibitionism.value / 10));
DisplayText("sexexp-voyeurism-level", "Lvl " + Math.floor(char.sexExperience.voyeurism.value / 10));
DisplayText("sexexp-assertiveness-level", "Lvl " + Math.floor(char.sexExperience.assertiveness.value / 10));
DisplayText("sexexp-compliance-level", "Lvl " + Math.floor(char.sexExperience.compliance.value / 10));
DisplayText("sexexp-hand-level", "Lvl " + Math.floor(char.sexExperience.handSkill.value / 10));
DisplayText("sexexp-oral-level", "Lvl " + Math.floor(char.sexExperience.oralSkill.value / 10));
DisplayText("sexexp-vaginal-level", "Lvl " + Math.floor(char.sexExperience.vaginalSkill.value / 10));
DisplayText("sexexp-penetrative-level", "Lvl " + Math.floor(char.sexExperience.penetrativeSkill.value / 10));
DisplayText("sexexp-anal-level", "Lvl " + Math.floor(char.sexExperience.analSkill.value / 10));
}, 50)>>
<</done>>
<</widget>>
<<widget "DrawCharacterReputationModern">>
<<set _characterForView = _args[0]>>
<div class="stats-card skills">
<div class="stats-card-header">
<div class="stats-card-icon">⭐</div>
<div class="stats-card-title">Reputation</div>
</div>
<div class="stats-reputation-grid">
<div class="stats-reputation-item">
<div class="stats-reputation-icon">📸</div>
<div class="stats-reputation-name">Fashion Model</div>
<div class="stats-reputation-value" id="modern-fashion-value"></div>
<div class="stat-progress-container" style="margin-top: 8px;">
<div class="stat-progress-bar neutral" id="modern-fashion-progress"></div>
</div>
</div>
<div class="stats-reputation-item">
<div class="stats-reputation-icon">🎬</div>
<div class="stats-reputation-name">Porn Actor</div>
<div class="stats-reputation-value" id="modern-porn-value"></div>
<div class="stat-progress-container" style="margin-top: 8px;">
<div class="stat-progress-bar neutral" id="modern-porn-progress"></div>
</div>
</div>
<div class="stats-reputation-item">
<div class="stats-reputation-icon">🎉</div>
<div class="stats-reputation-name">Nightclub</div>
<div class="stats-reputation-value" id="modern-nightclub-value"></div>
<div class="stat-progress-container" style="margin-top: 8px;">
<div class="stat-progress-bar neutral" id="modern-nightclub-progress"></div>
</div>
</div>
</div>
</div>
<<run setup.tempCharForRep = _characterForView>>
<<done>>
<<run setTimeout(function() {
var char = setup.tempCharForRep;
if (!char || !char.info || !char.info.reputation) return;
UpdateProgressBar("modern-fashion-progress", char.info.reputation.photoModel.value, char.info.reputation.photoModel.max);
UpdateProgressBar("modern-porn-progress", char.info.reputation.pornActer.value, char.info.reputation.pornActer.max);
UpdateProgressBar("modern-nightclub-progress", char.info.reputation.nightclub.value, char.info.reputation.nightclub.max);
DisplayText("modern-fashion-value", Math.trunc(char.info.reputation.photoModel.value));
DisplayText("modern-porn-value", Math.trunc(char.info.reputation.pornActer.value));
DisplayText("modern-nightclub-value", Math.trunc(char.info.reputation.nightclub.value));
}, 50)>>
<</done>>
<</widget>>
<<widget "DrawNpcContacts">>
<<set _characterForView = _args[0]>>
<<set _contactCards = getNpcContactCards(_characterForView)>>
<div class="npc-contacts-container">
<div class="npc-contacts-header">
<div class="npc-contacts-header-icon">👥</div>
<div class="npc-contacts-header-title">Known Contacts</div>
<div class="npc-contacts-count"><<print _contactCards.length>></div>
</div>
<<if _contactCards.length > 0>>
<div class="npc-contacts-search">
<span class="npc-contacts-search-icon">🔍</span>
<input type="text" id="npc-contacts-search-input" class="npc-contacts-search-input" placeholder="Search by name..." oninput="filterNpcContacts(this.value)">
</div>
<div class="npc-contacts-no-results" id="npc-contacts-no-results" style="display: none;">
<div class="npc-contacts-empty-icon">🔍</div>
<div class="npc-contacts-empty-text">No contacts match your search.</div>
</div>
<div class="npc-contacts-list" id="npc-contacts-list">
<<for _ci = 0; _ci < _contactCards.length; _ci++>>
<<set _card = _contactCards[_ci]>>
<<capture _card>>
<div class="npc-contact-card" @data-name="_card.nameLower" @style="'--contact-accent: ' + _card.relationColor + '; --contact-accent-soft: ' + _card.relationColor + '18; --contact-accent-border: ' + _card.relationColor + '33; --contact-accent-glow: ' + _card.relationColor + '26;'">
<div class="npc-contact-top">
<div class="npc-contact-avatar"><img @src="_card.img" @alt="_card.name"></div>
<div class="npc-contact-info">
<div class="npc-contact-name"><<print _card.name>></div>
<div class="npc-contact-meta">
<div class="npc-contact-relation-badge" @style="'background: ' + _card.relationColor + '22; color: ' + _card.relationColor + '; border-color: ' + _card.relationColor + '44;'"><<print _card.relationLabel>></div>
<div class="npc-contact-location">📍 <<print _card.location>></div>
</div>
<<if _card.memoryMood>><div class="npc-contact-mood" @style="'font-size:12px; margin-top:5px; font-style:italic; color:' + (_card.memoryMood.tone === 'positive' ? '#79d28c' : (_card.memoryMood.tone === 'negative' ? '#e57373' : '#9aa0b4')) + ';'"><<print _card.memoryMood.icon>> <<print _card.memoryMood.text>></div><</if>>
</div>
</div>
<div class="npc-contact-metrics">
<div class="npc-metric-row metric-friendship">
<div class="npc-metric-top">
<span class="npc-metric-label">Friendship</span>
<span class="npc-metric-value"><<print _card.friendVal>></span>
</div>
<div class="npc-metric-bar-container"><div class="npc-metric-bar" @style="'width: ' + _card.friendPct + '%;'"></div></div>
</div>
<div class="npc-metric-row metric-love">
<div class="npc-metric-top">
<span class="npc-metric-label">Love</span>
<span class="npc-metric-value"><<print _card.loveVal>></span>
</div>
<div class="npc-metric-bar-container"><div class="npc-metric-bar" @style="'width: ' + _card.lovePct + '%;'"></div></div>
</div>
<div class="npc-metric-row metric-sex">
<div class="npc-metric-top">
<span class="npc-metric-label">Sex</span>
<span class="npc-metric-value"><<print _card.sexVal>></span>
</div>
<div class="npc-metric-bar-container"><div class="npc-metric-bar" @style="'width: ' + _card.sexPct + '%;'"></div></div>
</div>
<div class="npc-metric-row metric-fear">
<div class="npc-metric-top">
<span class="npc-metric-label">Fear</span>
<span class="npc-metric-value"><<print _card.fearVal>></span>
</div>
<div class="npc-metric-bar-container"><div class="npc-metric-bar" @style="'width: ' + _card.fearPct + '%;'"></div></div>
</div>
<div class="npc-metric-row metric-anger">
<div class="npc-metric-top">
<span class="npc-metric-label">Anger</span>
<span class="npc-metric-value"><<print _card.angerVal>></span>
</div>
<div class="npc-metric-bar-container"><div class="npc-metric-bar" @style="'width: ' + _card.angerPct + '%;'"></div></div>
</div>
</div>
<div class="npc-contact-footer" style="margin-top:8px; text-align:right;">
<<link "🧠 What they remember ›">><<replace "#player-stats-view-content">><<DrawNpcMemoryDetail _card.id>><</replace>><</link>>
</div>
</div>
<</capture>>
<</for>>
</div>
<<else>>
<div class="npc-contacts-empty">
<div class="npc-contacts-empty-icon">🔍</div>
<div class="npc-contacts-empty-text">No contacts yet. Interact with people around town to build relationships!</div>
</div>
<</if>>
</div>
<</widget>>
<<widget "DrawNpcMemoryDetail">>
<<set _dmid = _args[0]>>
<<set _dmnpc = $Characters.find(c => c.info && c.info.id == _dmid)>>
<<set _dmlog = (typeof window.getNpcMemoryLog === "function") ? window.getNpcMemoryLog(_dmid) : []>>
<div class="npc-contacts-container">
<div class="npc-contacts-header">
<div class="npc-contacts-header-icon">🧠</div>
<div class="npc-contacts-header-title"><<if _dmnpc>><<print _dmnpc.info.firstName>><<else>>This contact<</if>> - what they remember</div>
</div>
<div style="margin: 6px 0 10px;"><<link "‹ Back to contacts">><<replace "#player-stats-view-content">><<DrawNpcContacts $player>><</replace>><</link>></div>
<<if _dmlog.length > 0>>
<<for _dmi = 0; _dmi < _dmlog.length; _dmi++>>
<<set _dm = _dmlog[_dmi]>>
<div class="npc-contact-card" style="display:flex; gap:10px; align-items:flex-start;">
<div style="font-size:20px; line-height:1.1;"><<print _dm.icon>></div>
<div style="flex:1; min-width:0;">
<div style="font-size:14px; line-height:1.4;"><<print _dm.text>></div>
<div style="font-size:12px; color:#8b91a6; margin-top:2px;"><<print _dm.when>></div>
</div>
</div>
<</for>>
<<else>>
<div class="npc-contacts-empty">
<div class="npc-contacts-empty-text">They don't have any strong memories of you yet.</div>
</div>
<</if>>
</div>
<</widget>>
<<widget "DominateTrainingShowVideo">>
<<set _domGender = _args[0]>>
<<set _subGender = _args[1]>>
<<set _poseName = _args[2]>>
<<set _unionGenderDom = _args[3]>>
<<set _unionGenderSub = _args[4]>>
<<set _NonSecondPartner = _args[5]>>
<<if _unionGenderDom && (_domGender == "Female" || _domGender == "Shemale")>>
<<set _domGender = "Female_Shemale">>
<</if>>
<<if _unionGenderSub && (_subGender == "Female" || _subGender == "Shemale")>>
<<set _subGender = "Female_Shemale">>
<</if>>
<<if _NonSecondPartner == true>>
<<set _videoLink = "Media\\Sex\\Training\\" + _poseName + "\\" + _subGender + "\\0.mp4">>
<<else>>
<<set _videoLink = "Media\\Sex\\Training\\" + _poseName + "\\" + _domGender + "\\" + _subGender + "\\0.mp4">>
<</if>>
<<if CheckContentFilter(_args[0], _args[1])>><<Video _videoLink>><</if>>
<</widget>>
<<widget "SetCharProgression">>
<<set _progressionChar = _args[0]>>
<<set _progressionMetric = _args[1]>>
<<set _progressionValue = _args[2]>>
<<set _drawMessage = _args[3]>>
<<set _source = _args[4] ?? "Game Action">>
<<run _capitalizeAttributeName = Capitalize(_progressionMetric)>>
<<run _attributeBefore = _progressionChar.attributes[_progressionMetric].value>>
<<run _progressionBefore = _progressionChar.progression[_progressionMetric].value>>
<<set _attribute = _progressionChar.attributes[_progressionMetric]>>
<<set _progression = _progressionChar.progression[_progressionMetric]>>
<<set _progressionMaxBefore = _progression.max>>
<<set _isPositiveExpGain = _progressionValue > 0>>
<<if _progressionValue > 0>>
<<if _drawMessage == true>>
<<set _progressionMsg = _capitalizeAttributeName + " exp increased by " + _progressionValue>>
<<ChatMessage _progressionMsg>>
<</if>>
<<include "Increase_XP_Attribute">>
<<else>>
<<set _progressionValue = Math.abs(_progressionValue)>>
<<if _drawMessage == true>>
<<set _progressionMsg = _capitalizeAttributeName + " exp decreased by " + _progressionValue>>
<<ChatMessage _progressionMsg>>
<</if>>
<<include "Decrease_XP_Attribute">>
<</if>>
<<run _attributeAfter = _progressionChar.attributes[_progressionMetric].value>>
/* Show animated EXP notification for positive gains (skip if already at max level) */
<<if _drawMessage == true && _isPositiveExpGain && _attributeBefore < _attribute.max>>
<<run showExpNotification({
skillName: _capitalizeAttributeName,
skillKey: _progressionMetric,
expGained: _progressionValue,
expBefore: _progressionBefore,
expAfter: _progression.value,
expMaxBefore: _progressionMaxBefore,
expMaxAfter: _progression.max,
levelBefore: _attributeBefore,
levelAfter: _attributeAfter,
levelMax: _attribute.max
})>>
<</if>>
/* Record stat change in history if level changed */
<<if _attributeAfter != _attributeBefore>>
<<run recordStatChange(_capitalizeAttributeName, _attributeBefore, _attributeAfter, _source, _progressionChar.info.id)>>
<</if>>
<<if _progressionMetric == "sexStamina">>
/* Floor at 1: sexStamina 0 would make potency a 0/0 LimitedInt, which
bricked the save on load (constructor rejects min >= max). */
<<set _progressionChar.status.potency._max = Math.max(1, _progressionChar.attributes.sexStamina.value)>>
<</if>>
<<if _progressionMetric == "vitality" && _attributeAfter != _attributeBefore>>
<<set _progressionChar.status.health._max = 100 + (_progressionChar.attributes.vitality.value * 10)>>
<</if>>
<<if _progressionMetric == "endurance" && _attributeAfter != _attributeBefore>>
<<set _progressionChar.status.energy._max = 100 + (_progressionChar.attributes.endurance.value * 10)>>
<</if>>
<</widget>>
<<widget "LocationEvent">>
<<set _eventName = _args[0]>>
<<set _targetLocation = _args[1]>>
<<set _eventType = _args[2]>>
<<set _eventIcon = _args[3]>>
<<set _renderMode = _args.length > 4 ? _args[4] : "button">>
<<set _eventStatusLabel = _args.length > 5 ? _args[5] : "Quest target">>
<<if _renderMode != "npc-card">>
<<set _renderMode = "button">>
<</if>>
<<set _eventSlug = (_eventName + "-" + _targetLocation).replace(/\s+/g, '-').replace(/[^A-Za-z0-9\-_]/g, '')>>
<<set _eventSlotId = "location-event-" + _eventSlug>>
<<set _eventSelector = "#" + _eventSlotId>>
<<set _eventSlotClass = _renderMode == "npc-card" ? "location-event-slot location-event-slot--card" : "location-event-slot location-event-slot--button">>
<<set _eventAppendTarget = "#location-events">>
<<if _renderMode == "npc-card">>
<<if document.getElementById('location-character-grid')>>
<<set _eventAppendTarget = "#location-character-grid">>
<<elseif document.getElementById('character-grid')>>
<<set _eventAppendTarget = "#character-grid">>
<</if>>
<</if>>
/* Build modern event button HTML */
<<if _renderMode == "npc-card">>
<<set _eventHTML = '<article class="location-npc-card location-event-card" data-relation="quest">'>>
<<set _eventHTML += '<div class="location-npc-card__header"><div class="location-npc-card__badges"><span class="location-npc-card__badge location-npc-card__badge--quest">Quest</span></div><span class="location-npc-card__cta">Approach</span></div>'>>
<<set _eventHTML += '<div class="location-npc-card__main">'>>
<<if _eventIcon != undefined>>
<<set _eventHTML += '<div class="location-npc-card__avatar-shell"><img class="location-npc-card__avatar" src="' + _eventIcon + '" alt=""></div>'>>
<<else>>
<<set _eventInitial = _eventName.charAt(0).toUpperCase()>>
<<set _eventHTML += '<div class="location-npc-card__avatar-shell location-event-card__avatar-shell--placeholder"><span class="location-event-card__avatar-fallback">' + _eventInitial + '</span></div>'>>
<</if>>
<<set _eventHTML += '<div class="location-npc-card__content"><div class="location-npc-card__eyebrow">' + _eventStatusLabel + '</div><div class="location-npc-card__name-row"><div class="location-npc-card__name">' + _eventName + '</div></div></div></div></article>'>>
<<elseif _eventIcon != undefined>>
<<set _eventHTML = '<div class="location-event-btn">'>>
<<set _eventHTML += '<img class="location-event-btn__icon" src="' + _eventIcon + '" alt="">'>>
<<set _eventHTML += '<span class="location-event-btn__text">' + _eventName + '</span>'>>
<<set _eventHTML += '</div>'>>
<<else>>
<<set _eventHTML = '<div class="location-event-btn location-event-btn--no-icon">'>>
<<set _eventHTML += '<span class="location-event-btn__text">' + _eventName + '</span>'>>
<<set _eventHTML += '</div>'>>
<</if>>
/* Don't re-offer a daily ambient event already triggered today: re-entering the
event passage hits its top-of-passage <<goto>> guard and bounces straight back,
which reads to the player as "the event closes before it finishes loading".
_targetLocation is the dailyEvents key for these transition events; non-daily
transitions (LocationEventView, quest targets) return false here and are unaffected. */
<<set _eventSeenToday = _eventType == "transition" && $player && $player.info && $player.dailyEvents && typeof $player.dailyEvents.isEventRegistered === "function" && $player.dailyEvents.isEventRegistered($player.info.id, _targetLocation)>>
/* Interaction/redirect passages can run UpdateAll while no location character view is
mounted. In that case there is nowhere to render a location event; silently defer
it until the player returns to a location instead of letting <<append>> throw. */
<<set _eventTargetExists = document.querySelector(_eventAppendTarget) != null>>
<<if not _eventSeenToday && _eventTargetExists>>
<<append _eventAppendTarget>>
<<capture _eventSlotId _eventSlotClass _eventSelector _targetLocation _eventType _eventHTML>>
<div @class="_eventSlotClass" @id="_eventSlotId">
<<if _eventType == "transition">>
<<button _eventHTML _targetLocation>><</button>>
<<elseif _eventType == "include">>
<<button _eventHTML>><<include _targetLocation>><<remove _eventSelector>><</button>>
<</if>>
</div>
<</capture>>
<</append>>
<</if>>
<</widget>>
<<widget "PoliceChecker">>
<<set _playerIsNaked = $player.clothes.IndecentlyDressed($player.gender() == "Male")>>
<<set _LustCharacters = $Characters.filter(c => !c.info.isPlayer && c.attributes.lust.value >= 4 && c.info.currentLocation == $player.info.currentLocation)>>
<<if _LustCharacters.length > 0 && _playerIsNaked && Random(0,100) > 60>>
<<set $randomIndex = Random(0, _LustCharacters.length - 1)>>
<<set $interactionNpc = _LustCharacters[$randomIndex]>>
<<set $indexNPC = $Characters.indexOf($interactionNpc)>>
<<LockSettings>>
<<goto "NakedLust_Interaction">>
<<elseif $playerInitFight > 0 && $dayFight != getCurrentAbsoluteDay()>>
<<set $policeFightSource = { source: "arrest-pending", day: getCurrentAbsoluteDay(), location: $player.info.currentLocation, crime: "assault" }>>
<<goto "PoliceFightArrest">>
<<elseif _playerIsNaked && $policeDayPass !== true && $police.dayPass !== true>>
<<set $policeNakedStop = {day: getCurrentAbsoluteDay(), location: $player.info.currentLocation}>>
<<goto "PoliceOfficerTalk_Naked">>
<<elseif getWanted($police) gte 40 && $policeDayPass !== true && rollDetected(streetDetectionChance($police, { crime: 'loitering', district: $player.info.currentLocation, hour: $dateTime.hours, stealth: $player.attributes.dexterity.value }))>>
/* Wanted street stop (doc 19.7): a hot name gets pulled over and run. Once a
day - the day pass keeps it from chaining as the player moves around.
A recognized fugitive is booked on the open manhunt charge, not a heat-only
"loitering" pull-over - the tank-capped booking released them mid-manhunt
with the escape warrant still open. */
<<set $police.dayPass = true>><<set $policeDayPass = true>>
<<set $policeStopMsg = "">>
<<unset $policeResisting>>
<<set $policeStopCrime = worstWarrant($police) || (isFugitive($police) ? "escape" : "loitering")>>
<<goto "Police_Stop">>
<</if>>
<</widget>>
<<widget "RandomEvent">>
<<set _location = _args[0]>>
/* Priority: pending breakup notices for this location */
<<if typeof window.consumeBreakupNoticeForLocation === 'function'>>
<<set _peekNotices = (State.variables.pendingBreakupNotices ?? [])>>
<<set _hasNotice = false>>
<<for _pn = 0; _pn < _peekNotices.length; _pn++>>
<<if _peekNotices[_pn] && _peekNotices[_pn].location === $player.info.currentLocation>>
<<set _hasNotice = true>>
<<break>>
<</if>>
<</for>>
<<if _hasNotice>>
<<done>><<LocationEvent 'Event' 'BreakupWitnessed' "transition" "Media\\Other\\Notice_Event.png">><</done>>
<</if>>
<</if>>
<<if rollChance(18)>>
<<if _location == "Campus">>
<<if $dateTime.hours >= 12 && $dateTime.hours < 18>>
<<set $locationEventType = "Media\\Events\\Street\\LocEvents\\" + Random(0, 1) + ".mp4">>
<<done>><<LocationEvent 'Event' 'Campus_StudentProtest' "transition" "Media\\Other\\Notice_Event.png">><</done>>
<<else>>
<<set $locationEventType = "Media\\Events\\Street\\LocEvents\\" + Random(0, 1) + ".mp4">>
<<done>><<LocationEvent 'Event' 'LocationEventView' "transition" "Media\\Other\\Notice_Event.png">><</done>>
<</if>>
<<elseif _location == "Park">>
<<if $dateTime.hours >= 22 || $dateTime.hours < 5>>
<<set $locationEventType = "Media\\Interactions\\Kiss\\Female\\Male\\0.webm">>
<<done>><<LocationEvent 'Event' 'ParkVoyeur_Makeout' "transition" "Media\\Other\\Notice_Event.png">><</done>>
<<elseif $dateTime.hours >= 6 && $dateTime.hours < 10>>
<<set $locationEventType = "Media\\Events\\Park\\LocEvents\\" + Random(0, 5) + ".mp4">>
<<done>><<LocationEvent 'Event' 'Park_MorningJogger' "transition" "Media\\Other\\Notice_Event.png">><</done>>
<<else>>
<<set $locationEventType = "Media\\Events\\Park\\LocEvents\\" + Random(0, 5) + ".mp4">>
<<done>><<LocationEvent 'Event' 'LocationEventView' "transition" "Media\\Other\\Notice_Event.png">><</done>>
<</if>>
<<elseif _location == "OakStreet">>
<<if rollChance(34)>>
<<set $locationEventType = EventMedia.STREET_FIGHT_IMAGE>>
<<else>>
<<set $locationEventType = "Media\\Events\\Street\\LocEvents\\" + Random(0, 1) + ".mp4">>
<</if>>
<<done>><<LocationEvent 'Event' 'StreetFight_Ambient' "transition" "Media\\Other\\Notice_Event.png">><</done>>
<<elseif _location == "Downtown">>
<<if $player.attributes && $player.attributes.corruption && $player.attributes.corruption.value >= 25>>
<<done>><<LocationEvent 'Event' 'Downtown_GropeStranger' "transition" "Media\\Other\\Notice_Event.png">><</done>>
<</if>>
<<elseif _location == "NightClubRestroom">>
<<if ($dateTime.hours >= 22 || $dateTime.hours < 5) && $player.status && $player.status.horny && $player.status.horny.value >= 70>>
<<done>><<LocationEvent 'Event' 'ClubRestroom_Quickie' "transition" "Media\\Other\\Notice_Event.png">><</done>>
<</if>>
<<elseif _location == "Library">>
<<if ($dateTime.hours >= 22 || $dateTime.hours < 5) && CheckContentFilter("Female", "Male")>>
<<set $locationEventType = "Media\\Interactions\\Kiss\\Female\\Male\\0.webm">>
<<done>><<LocationEvent 'Event' 'Library_AfterHoursMakeout' "transition" "Media\\Other\\Notice_Event.png">><</done>>
<</if>>
<<elseif _location == "NightClubDanceFloor">>
<<if ($dateTime.hours >= 18 || $dateTime.hours < 6) && $player.attributes && $player.attributes.corruption && $player.attributes.corruption.value >= 15>>
<<done>><<LocationEvent 'Event' 'NC_DanceFloor_Grind' "transition" "Media\\Other\\Notice_Event.png">><</done>>
<</if>>
<<elseif _location == "UFG_Shower">>
/* Half the time it is the women's side of the lockers getting changed. */
<<if rollChance(50)>>
<<set $locationEventType = EventMedia.pickClip(EventMedia.LOCKER_ROOM_PEEK_CLIPS)>>
<<done>><<LocationEvent 'Event' 'UFG_ShowerRoom_Peek' "transition" "Media\\Other\\Notice_Event.png">><</done>>
<<else>>
<<set _kissPairs = ["Female\\Female", "Female\\Male", "Male\\Male"]>>
/* Observed NPC pairs respect the content filter like everywhere else. */
<<run _kissPairs = _kissPairs.filter(p => { const g = p.split('\\'); return CheckContentFilter(g[0], g[1]); })>>
<<if _kissPairs.length > 0>>
<<set $locationEventType = "Media\\Interactions\\Kiss\\" + _kissPairs[Random(0, _kissPairs.length - 1)] + "\\0.webm">>
<<done>><<LocationEvent 'Event' 'UFG_ShowerRoom_Peek' "transition" "Media\\Other\\Notice_Event.png">><</done>>
<</if>>
<</if>>
<<elseif _location == "NightClubBar">>
<<if ($dateTime.hours >= 18 || $dateTime.hours < 6) && $player.status && $player.status.alcoholIntoxication && $player.status.alcoholIntoxication.value >= 40>>
<<done>><<LocationEvent 'Event' 'NC_Bar_DrunkPickup' "transition" "Media\\Other\\Notice_Event.png">><</done>>
<</if>>
<<elseif _location == "Slums">>
<<if $dateTime.hours >= 20 || $dateTime.hours < 5>>
<<done>><<LocationEvent 'Event' 'Slums_StreetWalker' "transition" "Media\\Other\\Notice_Event.png">><</done>>
<</if>>
<<elseif _location == "EntertainmentDistrict">>
<<if $dateTime.hours >= 22 || $dateTime.hours < 5>>
<<done>><<LocationEvent 'Event' 'EntertainmentDistrict_NightLoiter' "transition" "Media\\Other\\Notice_Event.png">><</done>>
<</if>>
<</if>>
<</if>>
<</widget>>
<<widget "NeighborhoodHousePage">>
<<set _page = _args[0]>>
<<set _allH = []>>
<<if $Families && $Families.length > 0>>
<<for _fi = 0; _fi < $Families.length; _fi++>>
<<run _allH.push($Families[_fi].houseId)>>
<</for>>
<</if>>
<<if $SoloHouses && $SoloHouses.length > 0>>
<<for _si = 0; _si < $SoloHouses.length; _si++>>
<<run _allH.push($SoloHouses[_si].houseId)>>
<</for>>
<</if>>
<<set _housesPerPage = 9>>
<<set _start = _page * _housesPerPage>>
<<set _end = Math.min(_start + _housesPerPage, _allH.length)>>
<<if _start < _allH.length>>
<div class="btn-container">
<<for _i = _start; _i < _end; _i++>>
<<capture _i>>
<div class="btn"><<button `getHouseDisplayName(_allH[_i])` "NPC_House">>
<<set $npcHouseReturnPassage = passage()>>
<<set $currentHouseId = _allH[_i]>>
<</button>></div>
<</capture>>
<</for>>
</div>
<<else>>
<div class="btn non-interacting"><<button "No houses here">><</button>></div>
<</if>>
<</widget>>
<<widget "MallClosedCheck">>
<<if $dateTime.hours >= 23 || $dateTime.hours < 8>>
<<goto "MallClosed">>
<</if>>
<</widget>><<nobr>>
<<include "UpdateAll">>
<<Video $locationEventType>>
<<ChatMessage 'You notice something strange.'>>
<div class="btn padding-top"><<button "Continue" $player.info.currentLocation>><<unset $locationEventType>><</button>></div>
<</nobr>><<nobr>>
<<set _clothItemsCount = 0>>
<br>
<<if _characterForView.clothes.clothingItems.size > 0>>
<<set _isHasCloth = false>>
<<if _characterForView.info.isPlayer == true>>
You're wearing:
<<else>>
<<print _characterForView.pronoun()>> is wearing:
<</if>>
<<for _i = 0; _i <= 8; _i++>>
<<capture _i>>
<<if _characterForView.clothes.hasClothingType(_i)>>
<<if (_i == 0 && _characterForView.clothes.hasClothingType(3)) || (_i == 1 && _characterForView.clothes.hasClothingType(2))>>
<<continue>>
<</if>>
<<if _isHasCloth == true>>
,
<</if>>
<<set _clothItemsCount += 1>>
<<if _clothItemsCount == 3>>
<br>
<</if>>
<<set _isHasCloth = true>>
__<<link _characterForView.clothes.getFirstClothingItemByType(_i).name>>
<<run Dialog.create(_characterForView.clothes.getFirstClothingItemByType(_i).name)>>
<<run Dialog.wiki(_characterForView.clothes.getFirstClothingItemByType(_i).getImg())>>
<<run Dialog.open();>>
<</link>>__
<</if>>
<</capture>>
<</for>>
<</if>>
/* Equipped Weapon Display */
<<if _characterForView.equippedWeapon != null && _characterForView.equippedWeapon != undefined>>
<br>
<<if _characterForView.info.isPlayer == true>>
<span style="color: #ff6b35;">Equipped weapon:</span>
<<else>>
<span style="color: #ff6b35;"><<print _characterForView.pronoun()>> is armed with:</span>
<</if>>
<<set _wpn = _characterForView.equippedWeapon>>
__<<link _wpn.name>>
<<script>>
var w = SugarCube.State.temporary.wpn;
var content = "<div style='padding: 10px;'>";
content += "<h3 style='color: #ff6b35; margin-bottom: 10px;'>" + w.name + "</h3>";
content += "<p><strong>Type:</strong> " + getWeaponTypeName(w.weaponType) + "</p>";
content += "<p><strong>Damage:</strong> <span style='color: #ff4444;'>" + w.baseDamage + "</span></p>";
content += "<p><strong>Accuracy:</strong> <span style='color: #44ff44;'>" + w.accuracyBonus + "%</span></p>";
if (w.ammoType) {
var ammoCount = 0;
var char = SugarCube.State.temporary.characterForView;
if (char.inventory.hasItem(w.ammoType)) {
ammoCount = char.inventory.getItemByName(w.ammoType).quantity;
}
content += "<p><strong>Ammo Type:</strong> " + w.ammoType + "</p>";
content += "<p><strong>Ammo per Shot:</strong> " + (w.ammoPerShot || 1) + "</p>";
content += "<p><strong>Current Ammo:</strong> <span style='color: #ffcc00;'>" + ammoCount + "</span></p>";
}
if (w.effects && w.effects.length > 0) {
content += "<p><strong>Effects:</strong></p><ul style='margin-left: 15px;'>";
for (var i = 0; i < w.effects.length; i++) {
var e = w.effects[i];
content += "<li style='color: #ff88ff;'>" + e.type + " (" + e.chance + "% chance, " + e.duration + " turns, " + e.intensity + " intensity)</li>";
}
content += "</ul>";
}
content += "<p><strong>Required Skill:</strong> " + w.requiredSkill + " Lvl " + w.minSkillLevel + "</p>";
content += "<p><strong>Price:</strong> $" + w.price + "</p>";
content += "</div>";
Dialog.create(w.name);
Dialog.wiki(content);
Dialog.open();
<</script>>
<</link>>__
<<if _characterForView.info.isPlayer == true && _canTakeOffClothes>>
__<<link " (unequip)">>
<<run _characterForView.unequipWeapon()>>
<<run Dialog.close()>>
<<run Dialog.create("Info")>>
<<run Dialog.wiki('<<CharacterStatsView _characterForView _canTakeOffClothes>>')>>
<<run Dialog.open();>>
<</link>>__
<</if>>
<span style="color: #aaa;"> (Dmg: <<print _wpn.baseDamage>><<if _wpn.ammoType != undefined>>, Ammo: <<if _characterForView.inventory.hasItem(_wpn.ammoType)>><<print _characterForView.inventory.getItemByName(_wpn.ammoType).quantity>><<else>>0<</if>><</if>>)</span>
<<else>>
<<if _characterForView.info.isPlayer == true>>
<br><span style="color: #888;">No weapon equipped</span>
<</if>>
<</if>>
<</nobr>><<nobr>>
<<set _levelIsIncrease = false>>
<<set _xpGain = _progressionValue>>
<<run
/* Heal degenerate pools (legacy saves could carry _max walked down to 0):
a 0/0 pool made every iteration a free level-up - xpNeeded was 0, the
"pool full" check was instantly true, and 1 XP laddered the attribute. */
if (_progression._max < 20) { _progression._max = 20; }
while (_xpGain > 0 && (_attribute.value < _attribute.max || (_progressionMetric == "sexStamina" && _attribute.value < 10))) {
let xpNeeded = _progression.max - _progression.value;
let portion = Math.min(_xpGain, xpNeeded);
_progression.increase(portion);
_xpGain -= portion;
if (_progression.value === _progression.max && _attribute.value < _attribute.max) {
_attribute.increase(1);
if (_attribute.value < _attribute.max){
_progression.value = 0;
_progression._max += 20;
}
_levelIsIncrease = true;
}
}
>>
<<if _levelIsIncrease>>
<<set _levelChangeMsg = _capitalizeAttributeName + " level increased">>
<<ChatMessage _levelChangeMsg>>
<</if>>
<</nobr>><<nobr>>
<<set _levelIsDecrease = false>>
<<run _xpReduce = _progressionValue>>
<<run
/* Heal degenerate pools from legacy saves (see Increase_XP_Attribute). */
if (_progression._max < 20) { _progression._max = 20; }
while (_xpReduce > 0 && _attribute.value != _attribute.min) {
if (_progression.value > 0) {
let portion = Math.min(_xpReduce, _progression.value);
_progression.decrease(portion);
_xpReduce -= portion;
} else {
_attribute.decrease(1);
_levelIsDecrease = true;
/* Keep at least one level's worth of pool: walking _max to 0 created a
0/0 pool that bricked saves on load (LimitedInt min>=max) and turned
the next XP gain into free level-ups. */
_progression._max -= 20;
if (_progression._max < 20) _progression._max = 20;
_progression.value = _progression._max;
}
}
if (_xpReduce > 0 && _attribute.value === _attribute.min) {
_progression.value = 0;
}
>>
<<if _levelIsDecrease>>
<<set _levelChangeMsg = _capitalizeAttributeName + " level decreased">>
<<ChatMessage _levelChangeMsg>>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<if $player.info.currentLocation == "Diner" &&
Random(1, 100) > 83>>
<<goto "Diner_Events">>
<<elseif $player.info.currentLocation == "Bar" && Random(1, 100) > 83>>
/* Bartender shift events - the whole Bartender_Events file existed but was
never rolled from anywhere. Same 17% event chance as the Diner. */
<<goto "Bartender_Events">>
<<elseif $player.info.currentLocation == "Diner">>
<<set _incomeMoney = Random(70, 200)>>
<<set $player.money += _incomeMoney>>
<<SpendEnergy $player 20>>
<<SpendTimeWithoutUpdate 30>>
<<LeaveInteractionSettings>>
<<run window.showWorkEarningsNotification(_incomeMoney)>>
<<goto "Diner">>
<<else>>
<<set _incomeMoney = Random(70, 200)>>
<<set _incomeMsg = "You received $" + _incomeMoney>>
<<ChatMessage _incomeMsg>>
<<set $player.money += _incomeMoney>>
<<SpendEnergy $player 20>>
<<SpendTimeWithoutUpdate 30>>
<div class="padding-top">
<div class="btn"><<button "Continue" $player.info.currentLocation>><<LeaveInteractionSettings>><</button>></div>
</div>
<</if>>
<</nobr>><<nobr>>
<<include "UpdateAll">>
<<set _sim = window.simulateDinerWorkDay(
$player.status.energy.value,
$player.status.energy.max,
$player.attributes.endurance.value,
$dateTime.hours,
$dateTime.minutes
)>>
<<if _sim.workCycles > 0>>
<<set $player.money += _sim.totalEarned>>
<<set $player.status.energy.value = _sim.finalEnergy>>
<<if _sim.alcoholReduction > 0>>
<<run $player.status.alcoholIntoxication.decrease(_sim.alcoholReduction)>>
<</if>>
<<SpendTime _sim.totalMinutesElapsed>>
<<LeaveInteractionSettings>>
<fieldset>
<legend>Work Summary</legend>
<p>You worked at the diner until closing time.</p>
<p><b>Shifts completed:</b> <<print _sim.workCycles>></p>
<p><b>Time worked:</b> <<print Math.floor(_sim.totalWorkMinutes / 60)>>h <<print _sim.totalWorkMinutes % 60>>m</p>
<<if _sim.restCycles > 0>>
<p><b>Rest breaks:</b> <<print _sim.restCycles>> (<<print Math.floor(_sim.totalRestMinutes / 60)>>h <<print _sim.totalRestMinutes % 60>>m total)</p>
<</if>>
<p><b>Total earned:</b> <span style="color:#7fe08d;">$<<print _sim.totalEarned>></span></p>
</fieldset>
<<else>>
<fieldset>
<legend>Work Summary</legend>
<p>You didn't have enough energy or time to complete any shifts.</p>
</fieldset>
<</if>>
<div class="padding-top">
<div class="btn"><<button "Continue" "Diner">><</button>></div>
</div>
<</nobr>><<nobr>>
<<script>>
Dialog.create("Cheats");
Dialog.wiki(`
<div class="cheat-wrapper">
<div class="cheat-form-container cheat-dialog-panel">
<div class="cheat-dialog-grid">
<div class="cheat-dialog-main">
<div class="cheat-lock-icon">🔐</div>
<div class="cheat-dialog-eyebrow">Developer Access</div>
<div class="cheat-dialog-title">Unlock Cheat Controls</div>
<div class="cheat-dialog-copy">Enter your access code to open the advanced control surface.</div>
<div class="cheat-input-group">
<label for="passwordInput" class="cheat-input-label">Access Code</label>
<input id="passwordInput" type="text" class="cheat-input" placeholder="Enter access code..." autocomplete="off" spellcheck="false" onkeydown="if(event.key==='Enter'){DevEng(this.value)}" />
</div>
<button onclick="DevEng(document.getElementById('passwordInput').value)" id="submitPassword" class="cheat-btn">Unlock Panel</button>
</div>
<div class="cheat-dialog-support">
<div class="cheat-dialog-support-badge">Support the project</div>
<div class="cheat-dialog-support-title">Get ongoing updates and access perks</div>
<div class="cheat-dialog-support-copy">Patreon support helps fund new systems, polish passes and future story content.</div>
<div class="cheat-divider"><span>Patreon</span></div>
<a href="https://www.patreon.com/c/Viceburg" target="_blank" class="cheat-patreon-link">
<div class="cheat-patreon-inner">
<img src="Media/Other/patreon-banner.png" alt="Patreon" class="patreon-logo" />
<span class="cheat-patreon-icon">🅿</span>
<span class="cheat-patreon-text">Become a Patron</span>
</div>
</a>
<div class="cheat-hint">Codes are available for Patreon supporters.</div>
</div>
</div>
</div>
</div>
`);
Dialog.open();
<</script>>
<</nobr>><<nobr>>
<<script>>
Dialog.create("Cheats");
Dialog.wiki(`
<div class="cheat-wrapper">
<div class="cheat-form-container cheat-dialog-panel">
<div class="cheat-dialog-grid">
<div class="cheat-dialog-main">
<div class="cheat-lock-icon">🔒</div>
<div class="cheat-dialog-eyebrow">Public Version</div>
<div class="cheat-dialog-title">Cheats Locked</div>
<div class="cheat-dialog-copy">Cheats are only available in the Patreon version of the game. Support the project to unlock cheat controls and other exclusive perks.</div>
<button onclick="$.wiki('<<run Dialog.close()>>')" class="cheat-btn">Close</button>
</div>
<div class="cheat-dialog-support">
<div class="cheat-dialog-support-badge">Support the project</div>
<div class="cheat-dialog-support-title">Get cheats, updates and exclusive perks</div>
<div class="cheat-dialog-support-copy">Patreon support helps fund new systems, polish passes and future story content.</div>
<div class="cheat-divider"><span>Patreon</span></div>
<a href="https://www.patreon.com/c/Viceburg" target="_blank" class="cheat-patreon-link">
<div class="cheat-patreon-inner">
<img src="Media/Other/patreon-banner.png" alt="Patreon" class="patreon-logo" />
<span class="cheat-patreon-icon">🅿</span>
<span class="cheat-patreon-text">Become a Patron</span>
</div>
</a>
<div class="cheat-hint">Cheats are available for Patreon supporters.</div>
</div>
</div>
</div>
</div>
`);
Dialog.open();
<</script>>
<</nobr>><<nobr>>
<<switch _chanceButtonName>>
<<case "Hug">>
<<if _chanceReciver.behavior.preferences.hug == "negative">>
<<run _chance = Math.round(subtractPercentage(_chance, 20))>>
<<elseif _chanceReciver.behavior.preferences.hug == "positive">>
<<run _chance = Math.round(increasePercentage(_chance, 20))>>
<</if>>
<<case "Flirt">>
<<if _chanceReciver.behavior.preferences.flirt == "negative">>
<<run _chance = Math.round(subtractPercentage(_chance, 20))>>
<<elseif _chanceReciver.behavior.preferences.flirt == "positive">>
<<run _chance = Math.round(increasePercentage(_chance, 20))>>
<</if>>
<<case "Dirty talk">>
<<if _chanceReciver.behavior.preferences.dirtyTalk == "negative">>
<<run _chance = Math.round(subtractPercentage(_chance, 20))>>
<<elseif _chanceReciver.behavior.preferences.dirtyTalk == "positive">>
<<run _chance = Math.round(increasePercentage(_chance, 20))>>
<</if>>
<</switch>>
<</nobr>><<nobr>>
<<set _emergencyVisit = ($prison && $prison.inside && typeof getActiveCrossBlockVisit == "function") ? getActiveCrossBlockVisit($prison, { day: getCurrentAbsoluteDay(), hour: $dateTime.hours, minute: $dateTime.minutes }) : null>>
<<set _emergencyMandatory = (typeof window.mandatoryScenePassage == "function") ? window.mandatoryScenePassage() : null>>
<div class="emergency-dialog">
<div class="emergency-dialog-icon">⚠</div>
<p class="emergency-dialog-title">Are you sure?</p>
<<if _emergencyMandatory>>
<<if $prison && $prison.inside>>
<p class="emergency-dialog-text">This will return you to the required prison event. It will not skip or dismiss that event.</p>
<<else>>
<p class="emergency-dialog-text">This will return you to the required police encounter or custody step. It will not dismiss the charge, end a sentence, or skip processing.</p>
<</if>>
<<elseif $prison && $prison.inside>>
<p class="emergency-dialog-text">This will return you to <<= _emergencyVisit ? "the block you are visiting" : ($prison.inPC ? "segregation" : "your prison block")>>. It will not end your sentence, skip an active crossing, or release you from custody.</p>
<<elseif $ship && $ship.onBoard>>
<p class="emergency-dialog-text">This will return you to the communal cabins of the «Sirena». It will not end the voyage or let you off the ship. Use this <b>only</b> if you are stuck and cannot progress normally.</p>
<<else>>
<p class="emergency-dialog-text">This will forcefully teleport you to your bedroom. Use this <b>only</b> if you are stuck and cannot progress normally.</p>
<</if>>
<p class="emergency-dialog-text">This action may break your current quest or event sequence!</p>
<div class="emergency-dialog-buttons">
<<button "Confirm">>
<<run Dialog.close()>>
<<set _emergencyMandatory = (typeof window.mandatoryScenePassage == "function") ? window.mandatoryScenePassage() : null>>
<<if _emergencyMandatory>>
<<goto _emergencyMandatory>>
<<elseif $prison && $prison.inside>>
<<if _emergencyVisit>>
<<goto "Prison_OtherBlock">>
<<elseif $prison.inPC>>
<<goto "Prison_Segregation">>
<<else>>
<<goto "Prison_Block">>
<</if>>
<<else>>
<<set $canShowStatsBtn = true>>
<<set $gameSettings.allowSaves = true>>
<<set $shouldHideBar = false>>
<<set $showPlayerStat = 1>>
<<run $('#ui-bar').show()>>
<<run $('html').removeClass('nosave')>>
/* The voyage keeps the city frozen until disembarkShip settles it, so a
stuck player aboard goes back to the cabins, not home. */
<<if $ship && $ship.onBoard>>
<<goto "Ship_Cabins">>
<<else>>
<<goto "Player_Bedroom_PHome">>
<</if>>
<</if>>
<</button>>
<<button "Cancel">>
<<run Dialog.close()>>
<</button>>
</div>
</div>
<</nobr>>